经验之谈|别再在CNN中使用Dropout了

小白学视觉

共 2650字,需浏览 6分钟

 ·

2021-11-15 22:12

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者:Harrison Jansma

编译:ronghuaiyang


我注意到有很多关于学习深度学习和将什么是深度学习的资源。但是不幸的是,等到真正需要做一个模型的时候,解释如何去做,何时去做的资源又很少。


我写这篇文章的目的是为了那些尝试去实现深度学习的人,这样你就不必像我一样去看原始的论文或者看Reddit中的讨论了。


本文会告诉你为什么dropout在CNN的结构中会渐渐失宠。


Dropout
如果你在读这篇文章的话,我假设你有一些对dropout的基本理解,以及它在神经网络中扮演的正则化的角色。

 


通常来说,只有当我们的网络有过拟合的风险的时候,才需要进行正则化。当网络非常大,训练时间非常长,也没有足够的数据的时候,才可能发生。

如果你的网络的最后有全连接层的话,使用dropout非常的容易。

Keras 实现


python

keras.layers.Dropout(rate, noise_shape=None, seed=None)


dropout的比例从0.5开始,逐渐减小直到模型的表现最好。

例子:



model=keras.models.Sequential()

model.add(keras.layers.Dense(150, activation="relu"))

model.add(keras.layers.Dropout(0.5))


注意,这里只在CNN中的全连接层使用。对于其他的层则不用dropout。

作为替代,你应该在卷积中插入batch normalization,这个也会正则化你的模型,同时让训练更加的稳定。


Batch Normalization

Batch normalization是另外一个队CNN进行正则化的方法。

除了正则化的作用外,batch normalization还避免了CNN训练中的梯度消失的问题。这个可以减小训练的时间,得到更好的结果。


Keras实现


在Keras中实现 batch normalization,使用下面的方法:

keras.layers.BatchNormalization()




当使用batch normalization来构建CNN结构时:

- 在卷积层和激活层之间插入batch normalization。

- batch normalization有些超参数需要调试,可以试试。

也可以在激活函数之后插入batch normalization,根据我自身的经验,两种方法效果差不多。



例子:

model.add(Conv2D(60,3, padding = "same"))

model.add(BatchNormalization())

model.add(Activation("relu"))

使用Batch normalization替换dropout.

如果你不用担心过拟合的话,那么使用batch normalization有很多的好处。由于有正则化的作用,batch normalization可以很大程度上替代CNN中的dropout。

“我们提出了一种算法,使用batch normalization用来构建,训练和进行推理。得到的网络训练时具有饱和的非线性性,对于大的学习率更加的鲁棒,往往不需要使用Dropout来进行正则化。”-Ioffe 和 Svegedy

至于为什么dropout渐渐失宠,有两个原因。


第一,dropout对卷积层的正则化的作用很小

原因呢?由于卷积层只有很少的参数,他们本身就不需要多少正则化。更进一步说,特征图编码的是空间的关系,特征图的激活是高度相关的,这也导致了dropout的失效。


第二,dropout所擅长的正则化慢慢的过时了

像VGG16这样的大型的网络后面有全连接层,对于这样的模型,需要考虑过拟合,所以在全连接之间使用dropout。


但是不幸的时,现在的结构中全连接层被移除了。


我们使用了global average pooling来代替了全连接层,这种卷积网络可以减小模型的size,同时提高模型的表现。

实验


我做了一个实验,试试看是否 batch normalization可以减少泛化误差。

我构建了5个完全相同的卷积网络结构,然后分别在卷积之间插入dropout,batch norm,或者什么也不插入(control)。


在Cifar100的数据集上训练每个模型,我得到了下面的结果。


使用batch norm的表现最好,说明在卷积之间应该使用batch norm。

更进一步说,dropout不应该放在卷积之间,dropout越大,模型表现越差。

重点
如果你不知道是否应该在CNN中使用dropout,那么现在你应该知道了。只在有全连接的时候用dropout,在卷积之间使用 batch normalization。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报