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

什么是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在后期有明显的上升趋势,发生了过拟合现象
在这里插入图片描述
在这里插入图片描述
加入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)

在这里插入图片描述

在这里插入图片描述
加入两个参数后,过拟合的现象明显得到缓解,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在模型压缩领域也有应用,各位同学可自行搜索相关博客
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值