网站首页 > 技术文章 正文
作者: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。
英文原文:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Fdont-use-dropout-in-convolutional-networks-81486c823c16
更多文章,请关注微信公众号:AI公园
猜你喜欢
- 2024-10-17 【Python深度学习系列】网格搜索神经网络超参数:丢弃率dropout
- 2024-10-17 中英趣译,用英文说对方“活该”才痛快!
- 2024-10-17 问题:ID:16145下列属于dropout特性的有()
- 2024-10-17 那些与out有关的英文表达! 与out有关的英语词组
- 2024-10-17 Dropout和标准化(Batch Normalization)
- 2024-10-17 麦克风将被静音,美网友都在猜:特朗普会如何应对?
- 2024-10-17 不只Dropout,刚刚,至少30项机器学习技术都变成了谷歌专利
- 2024-10-17 Dropout VS BN: 别在你的网络中使用Dropout
- 2024-10-17 让Dropout在图像超分领域重焕光彩
- 2024-10-17 神经网络中的损失函数正则化和 Dropout 并手写代码实现
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)