Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
d2l-zh
提交
fdc211e8
D
d2l-zh
项目概览
OpenDocCN
/
d2l-zh
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
d2l-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fdc211e8
编写于
9月 17, 2017
作者:
M
muli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update reg & overfit
上级
cdad8cfd
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
12 addition
and
13 deletion
+12
-13
chapter02_supervised-learning/reg-gluon.md
chapter02_supervised-learning/reg-gluon.md
+1
-2
chapter02_supervised-learning/reg-scratch.md
chapter02_supervised-learning/reg-scratch.md
+10
-9
chapter02_supervised-learning/underfit-overfit.md
chapter02_supervised-learning/underfit-overfit.md
+1
-2
未找到文件。
chapter02_supervised-learning/reg-gluon.md
浏览文件 @
fdc211e8
...
...
@@ -30,7 +30,6 @@ y_train, y_test = y[:num_train], y[num_train:]
跟前一样定义训练模块。你也许发现了主要区别,
`Trainer`
有一个新参数
`wd`
。我们通过优化算法的
``wd``
参数 (weight decay)实现对模型的正则化。这相当于$L_2$范数正则化。
```
{.python .input}
%matplotlib inline
import matplotlib as mpl
...
...
@@ -76,7 +75,7 @@ def train(weight_decay):
plt.show()
return ('learned w[:10]:', net[0].weight.data()[:,:10],
'lear
en
d b:', net[0].bias.data())
'lear
ne
d b:', net[0].bias.data())
```
### 训练模型并观察过拟合
...
...
chapter02_supervised-learning/reg-scratch.md
浏览文件 @
fdc211e8
...
...
@@ -74,23 +74,20 @@ def get_params():
## $L_2$范数正则化
线性模型就是将输入和模型做乘法再加上偏移。
这里我们引入$L_2$范数正则化。不同于在训练时仅仅最小化损失函数(Loss),我们在训练时其实在最小化
$$
\t
ext{loss} +
\l
ambda
\s
um_{p
\i
n
\t
extrm{params}}
\|
p
\|
_2^2。$$
直观上,$L_2$范数正则化试图惩罚较大绝对值的参数值。
在训练模型时,如果$
\l
ambda = 0$,则未使用正则化。需要注意的是,在测试模型时,$
\l
ambda$必须为0。
直观上,$L_2$范数正则化试图惩罚较大绝对值的参数值。
下面我们定义L2正则化。注意有些时候大家对偏移加罚,有时候不加罚。通常结果上两者区别不大。这里我们演示对偏移也加罚的情况:
```
{.python .input
n=6
}
def
net(X, lambd,
w, b):
return
nd.dot(X, w) + b + lambd * ((w**2).sum() + b**2)
```
{.python .input}
def
L2_penalty(
w, b):
return
(w**2).sum() + b**2
```
## 定义训练和测试
我们定义一个训练函数,这样在跑不同的实验时不需要重复实现相同的步骤
。
下面我们定义剩下的所需要的函数。这个跟之前的教程大致一样,主要是区别在于计算
`loss`
的时候我们加上了L2正则化,以及我们将训练和测试损失都画了出来
。
```
{.python .input n=8}
%matplotlib inline
...
...
@@ -98,6 +95,9 @@ import matplotlib as mpl
mpl.rcParams['figure.dpi']= 120
import matplotlib.pyplot as plt
def net(X, lambd, w, b):
return nd.dot(X, w) + b
def square_loss(yhat, y):
return (yhat - y.reshape(yhat.shape)) ** 2
...
...
@@ -118,7 +118,8 @@ def train(lambd):
for data, label in data_iter(num_train):
with autograd.record():
output = net(data, lambd, *params)
loss = square_loss(output, label)
loss = square_loss(
output, label) + lambd * L2_penalty(*params)
loss.backward()
SGD(params, learning_rate)
train_loss.append(test(params, X_train, y_train))
...
...
chapter02_supervised-learning/underfit-overfit.md
浏览文件 @
fdc211e8
...
...
@@ -122,8 +122,7 @@ def train(X_train, X_test, y_train, y_test):
# 设一些默认参数
learning_rate = 0.01
epochs = 100
# batch_size = min(1, y_train.shape[0])
batch_size = 1
batch_size = min(10, y_train.shape[0])
dataset_train = gluon.data.ArrayDataset(X_train, y_train)
data_iter_train = gluon.data.DataLoader(
dataset_train, batch_size, shuffle=True)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录