mnist手写数字识别+dropout+weight_decay提升test精度到0.99

文章目录

  • 什么是dropout?
  • 为什么要使用dropout?
  • torch中怎么使用dropout?
    • 使用示例
  • Tips:

什么是dropout?

2012年,Hinton等人在《 Improving neural networks by preventing co-adaptation of feature detectors 》论文中首次提出Dropout,并在随后的比赛中用到了Dropout算法,用于防止过拟合。

Dropout可以看作在训练深度神经网络的一种trick,在训练过程中以一定的概率将神经网络单元暂时丢弃掉(一定要注意是暂时丢掉),也就是让一部份hidden layers中的节点权重为0,这样可以减少特征检测器之间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

为什么要使用dropout?

训练大型网络时会遇到两个问题

  • 费时
  • 过拟合

在训练深度神经网络时,如果模型参数太多,而训练样本过少,这样产生的模型往往会有过拟合现象。过拟合的现象体现在训练集上loss较小表现良好,而在测试集上loss较大且表现很差,此时就产生了过拟合现象

torch中怎么使用dropout?

在训练期间,使用伯努利分布的样本以概率p将输入张量的某些元素随机置零。每次前向传播时独立地将每个通道清零。事实证明,这是一种有效的技术,可用于规范化和防止神经元的共同适应
torch.nn.Dropout(p: float = 0.5, inplace: bool = False)
parameters:

  • p(float):元素被置零的概率 Default: 0.5
  • inplace (bool):是否在原对象基础上进行修改。Default: False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。

shape:

  • Input: (∗) . Input can be of any shape
  • Output: (∗) . Output is of the same shape as input

使用示例

仅设置了学习率衰减的loss图,可以看到,test_loss在后期有明显的上升趋势,发生了过拟合现象
mnist手写数字识别+dropout+weight_decay提升test精度到0.99_第1张图片
mnist手写数字识别+dropout+weight_decay提升test精度到0.99_第2张图片
加入dropout和weight_decay之后

 self.block_2 = nn.Sequential(
            nn.Linear(16*5*5, 120),
            nn.Dropout(0.2),
            nn.ReLU(),
            nn.Linear(120, 84),
            nn.Dropout(0.2),
            nn.ReLU(),
            nn.Linear(84, 10),
        )
	optimizer = optim.Adam(net.parameters(),lr=1e-3,weight_decay=1e-3)
    lr_scheduler = lr_scheduler.StepLR(optimizer,step_size=5,gamma = 0.9)

mnist手写数字识别+dropout+weight_decay提升test精度到0.99_第3张图片

mnist手写数字识别+dropout+weight_decay提升test精度到0.99_第4张图片
加入两个参数后,过拟合的现象明显得到缓解,test_acc最高可达到 0.990600

完整代码见:https://github.com/nin-yu/MNIST-LeNet5-with-PyTorch

Tips:

  • 在pytorch中,网络有train和eval两种模式,在train模式下,dropout和batch normalization会生效,而val模式下,dropout不生效,bn固定参数。
  • 本篇文章对于Dropout的介绍较为浅显,Dropout在模型压缩领域也有应用,各位同学可自行搜索相关博客

你可能感兴趣的:(深度学习,pytorch,深度学习,机器学习)