Pytorch学习第二次打卡
目录
过拟合、欠拟合及其解决方案
欠拟合
模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting);
线性函数拟合,如图:
过拟合
另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting)。训练样本不足,如下图:
给定训练数据集,模型复杂度和误差之间的关系:
- 欠拟合现象:模型无法达到一个较低的误差
- 过拟合现象:训练误差较低但是泛化误差依然较高,二者相差较大
解决方法
-
权重衰减
权重衰减等价于 L2范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。
-
丢弃法
简单说,就是随机丢弃隐藏层单元。参数dropout。丢弃法不改变其输入的期望值。可应对过拟合的问题;
部分代码:
net = nn.Sequential(
d2l.FlattenLayer(),
nn.Linear(num_inputs, num_hiddens1),
nn.ReLU(),
nn.Dropout(drop_prob1),
nn.Linear(num_hiddens1, num_hiddens2),
nn.ReLU(),
nn.Dropout(drop_prob2),
nn.Linear(num_hiddens2, 10)
)
for param in net.parameters():
nn.init.normal_(param, mean=0, std=0.01)
梯度消失,梯度爆炸
深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
当神经网络的层数较多时,模型的数值稳定性容易变差。
假设一个层数为L的多层感知机的第l层H(l)的权重参数为W(l),输出层H(L)的权重参数为W(L)。为了便于讨论,不考虑偏差参数,且设所有隐藏层的激活函数为恒等映射(identity mapping)ϕ(x)=x。给定输入X,多层感知机的第l层的输出H(l)=XW(1)W(2)…W(l)。此时,如果层数l较大,H(l)的计算可能会出现衰减或爆炸。举个例子,假设输入和所有层的权重参数都是标量,如权重参数为0.2和5,多层感知机的第30层输出为输入X分别与0.230≈1×10−21(消失)和530≈9×1020(爆炸)的乘积。当层数较多时,梯度的计算也容易出现消失或爆炸。
卷积神经网络
卷积神经网络包括卷积层和池化层,有填充、步幅、输入通道和输出通道等参数。如 LeNet交替使用卷积层和最大池化层后接全连接层来进行图像分类。
卷积层
使用Pytorch中的nn.Conv2d
类来实现二维卷积层,主要关注以下几个构造函数参数:
in_channels
输入通道out_channels
输出通道kernel_size
卷积核尺寸stride
步长,默认1padding
填充,默认0bias
偏置,
池化层
使用Pytorch中的nn.MaxPool2d
实现最大池化层,关注以下构造函数参数:
kernel_size
stride
padding
常见卷积网络
一、AlexNet
特征:
-
8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。
-
将sigmoid激活函数改成了更加简单的ReLU激活函数。
-
用Dropout来控制全连接层的模型复杂度。
-
引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
二、VGG
通过重复使⽤简单的基础块来构建深度模型。
Block:数个相同的填充为1、窗口形状为3×33×3的卷积层,接上一个步幅为2、窗口形状为2×22×2的最大池化层。
卷积层保持输入的高和宽不变,而池化层则对其减半。
三、NiN
串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络。
⽤了输出通道数等于标签类别数的NiN块,然后使⽤全局平均池化层对每个通道中所有元素求平均并直接⽤于分类。
四、GoogLeNet
- 由Inception基础块组成。
- Inception块相当于⼀个有4条线路的⼦⽹络。它通过不同窗口形状的卷积层和最⼤池化层来并⾏抽取信息,并使⽤1×1卷积层减少通道数从而降低模型复杂度。
平均并直接⽤于分类。
四、GoogLeNet
- 由Inception基础块组成。
- Inception块相当于⼀个有4条线路的⼦⽹络。它通过不同窗口形状的卷积层和最⼤池化层来并⾏抽取信息,并使⽤1×1卷积层减少通道数从而降低模型复杂度。
- 可以⾃定义的超参数是每个层的输出通道数,我们以此来控制模型复杂度。