本文假设你在读这篇文章时已经了解Dropout的相关知识,以及它在神经网络正则化方面的作用。如果你对该项技术不是很熟悉的话,可以翻阅本人之前的文章《深度学习网络大杀器之Dropout》复习,或者阅读阿马尔·布达拉贾的这篇文章。
Srivastava, Nitish,et al. “Dropout: a simple way to prevent neural networks from overfitting” 2014
在Keras中,使用下面的一句即可实现:
keras.layers.Dropout(rate, noise_shape=None, seed=None)
model=keras.models.Sequential()
model.add(keras.layers.Dense(150, activation="relu"))
model.add(keras.layers.Dropout(0.5))
从上面代码中看到,这仅适用于卷积神经网络的全连接区域。对于其它区域,我们不应该使用Dropout这项技术。
相反,应该在卷积层之间插入Batch Normalization(批量标准化),这项技术将使得模型正则化化,进而使得模型在训练期间更加地稳定。
批量标准化(Batch Normalization )是规范化卷积神经网络的另外一种常用方法,除了具有正则化效果之外,批量标准化还可以使得卷积神经网络在训练期间能够抵抗梯度消失现象,这可以减少训练时间并能够获得更好的性能。
批量标准化可以抵抗梯度消失
要在Keras中实现批量标准化,只需要使用以下命令即可:
keras.layers.BatchNormalization()
当在构建卷积神经网络模型中应用批量标准化时:
你也可以在激活函数之后插入批量标准化操作,但根据我个人的经验, 这两种方法取得的效果都非常的相近。
model.add(Conv2D(60,3, padding = "same"))
model.add(BatchNormalization())
model.add(Activation("relu"))
即使你不担心网络模型会出现过拟合现象,但在网络模型中应用批量标准化也有很多好处。基于此及其正则化效果,批量标准化已经在很大程度上取代了现代卷积神经网络模型中的Dropout操作。
“我们提出了一种使用批量标准化构建网络、训练和执行推理的算法,由此搭建的网络可以通过饱和非线性进行训练,这样更能容忍增加的训练率,并且通常不需要Dropout进行正规化操作。”—— Ioffe和Svegedy于2015年提出。
至于为什么Dropout在最近的卷积神经网络模型构建中失宠,主要有以下两个原因:
像VGG16这样在网络末端包含全连接层的大型网络模型,对于这样的模型,过拟合通常是通过在全连接层之间添加Dropout操作来解决。
本文通过一个实验来测试批量标准化是否减少了在卷积之间插入后的泛化错误。(链接)
此外,构建了5个相同的卷积神经网络,并在卷积之间插入了Dropout层,每个使用Dropout层的卷积神经网络模型的丢弃率不同。
如果你想知道是否应该在卷积网络中应用Dropout,读完本文后你就清楚了,应该仅在全连接层上使用Dropout操作,并在卷积层之间使用批量标准化。
如果您想了解有关批量标准化的更多信息,请阅读:
Harrison Jansma,计算机视觉,机器学习热爱者
LinkedIn:https://www.harrisonjansma.com
本文由阿里云云栖社区组织翻译。
文章原标题《Don’t Use Dropout in Convolutional Networks》,译者:海棠,审校:Uncle_LLD。
文章为简译,更为详细的内容,请查看原文。