batch normalize、relu、dropout 等的相对顺序

1.https://blog.csdn.net/B08370108/article/details/83783008

batch norm、relu、dropout 等的相对顺序
Ordering of batch normalization and dropout in TensorFlow?

在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 一文中,作者指出,“we would like to ensure that for any parameter values, the network always produces activations with the desired distribution”(produces activations with the desired distribution,为激活层提供期望的分布)。

因此 Batch Normalization 层恰恰插入在 Conv 层或全连接层之后,而在 ReLU等激活层之前。而对于 dropout 则应当置于 activation layer 之后。

2.BN和Dropout共同使用时会出现的问题

BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。

相关的研究参考论文:Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift

本论文作者发现理解 Dropout 与 BN 之间冲突的关键是网络状态切换过程中存在神经方差的(neural variance)不一致行为。试想若有图一中的神经响应 X,当网络从训练转为测试时,Dropout 可以通过其随机失活保留率(即 p)来缩放响应,并在学习中改变神经元的方差,而 BN 仍然维持 X 的统计滑动方差。这种方差不匹配可能导致数值不稳定(见下图中的红色曲线)。而随着网络越来越深,最终预测的数值偏差可能会累计,从而降低系统的性能。简单起见,作者们将这一现象命名为「方差偏移」。事实上,如果没有 Dropout,那么实际前馈中的神经元方差将与 BN 所累计的滑动方差非常接近(见下图中的蓝色曲线),这也保证了其较高的测试准确率。

作者采用了两种策略来探索如何打破这种局限。一个是在所有 BN 层后使用 Dropout,另一个就是修改 Dropout 的公式让它对方差并不那么敏感,就是高斯Dropout。

第一个方案比较简单,把Dropout放在所有BN层的后面就可以了,这样就不会产生方差偏移的问题,但实则有逃避问题的感觉。

第二个方案来自Dropout原文里提到的一种高斯Dropout,是对Dropout形式的一种拓展。作者进一步拓展了高斯Dropout,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。

该部分参考:

https://www.jiqizhixin.com/articles/2018-01-23-4

https://zhuanlan.zhihu.com/p/33101420

3.https://blog.csdn.net/m0_37644085/article/details/89205770

maskrcnn_benchmark理解记录——关于batch norm、relu、dropout 的相对顺序以及dropout可不可用

二、Dropout 层(2012年)与BN层 Dropout 层是否有效
Batch Normalization(BN)即批规范化,是正则化的一个重要手段。在正则化效果的基础上,批处理规范化还可以减少卷积网络在训练过程中的梯度弥散。这样可以减少训练时间,提升结果。
 由此产生的网络可以通过饱和非线性进行训练,更能容忍增加的训练速率,并且通常不需要Dropout进行正则化。 BN模型的高性能表明在卷积之间使用BN是有效的。此外,Dropout不应该放在卷积之间,因为Dropout模型的性能往往比Control模型差。

在CNN使用BN时需要:

在卷积层和激活层之间插入BN层。

调节BN的超参数。

一个BN层的例子:也就是conv2d →BN→relu

model.add(Conv2d(60,3, padding = 'same'))

model.add(BatchNormalization())

model.add(Activation('relu'))

Dropout是神经网络中防止模型过拟合的重要正则化方式,而近来的网络结构中却少有见到Dropout的身影。一般情况下,只需要在网络存在过拟合风险时才需要实现正则化。如果网络太大、训练时间太长、或者没有足够的数据,就会发生这种情况。
注意,这只适用于CNN的全连接层。对于所有其他层,不应该使用Dropout。相反,应该在卷积之间插入批处理标准化。这将使模型规范化,并使模型在训练期间更加稳定。

首先,Dropout对卷积层的正则化效果一般较差。

因为卷积层的参数很少,所以一开始就不需要太多的正则化。此外,由于特征映射中编码的空间关系,激活变得高度相关,这使得Dropout无效。

其次,Dropout规范化的研究已经过时了。

在卷积神经网络的初期,卷积层通过池化层(一般是 最大池化)后总是要一个或n个全连接层,最后在softmax分类。其特征就是全连接层的参数超多,使模型本身变得非常臃肿。最近的网络架构设计逐渐抛弃了如VGG16这样在网络末端包含全连接层的大型网络模型,对于这样的模型,过拟合,以前通常是通过在全连接层之间添加Dropout操作来解决。但现在通过全局平均池化(global average pooling)(GAP)替换全连接层,在提高性能的同时减小了模型大小,并减小过拟合。

如何在卷积神经网络中实现全局平均池化。在此之前,建议阅读 ResNet这篇论文  ,以了解全局平均池化操作的好处。

一个丢弃率为0.5的Dropout层

model=keras.models.Sequential()
model.add(keras.layers.Dense(150, activation='relu'))
model.add(keras.layers.Dropout(0.5))


1.19年3月18.Dropout VS BN: 别在你的网络中使用Dropout中提出

https://blog.csdn.net/qq_27292549/article/details/81092653  这是18年4月的文章

       做分类的时候,Dropout 层一般加在全连接层,防止过拟合,提升模型泛化能力。而很少见到卷积层后接Drop out (原因主要是 卷积参数少,不易过拟合),今天找了些博客,特此记录。

You can imagine that if neurons are randomly dropped out of the network during training, that other neurons will have to step in and handle the representation required to make predictions for the missing neurons. This is believed to result in multiple independent internal representations being learned by the network.

The effect is that the network becomes less sensitive to the specific weights of neurons. This in turn results in a network that is capable of better generalization and is less likely to overfit the training data.

你可以想象,如果神经元在训练过程中随机被网络丢弃(死掉、不激活),那么其他神经元将不得不介入并处理对缺失神经元进行预测所需的表示。这将导致网络学习多个独立的内部表示。其结果是网络对神经元的特定权重变得不那么敏感。 这反过来导致网络能够更好地概括并且不太可能过拟合训练数据。

在附上提出Dropout的论文中的观点:

from the Srivastava/Hinton dropout paper:

“The additional gain in performance obtained by adding dropout in the convolutional layers (3.02% to 2.55%) is worth noting. One may have presumed that since the convolutional layers don’t have a lot of parameters, overfitting is not a problem and therefore dropout would not have much effect. However, dropout in the lower layers still helps because it provides noisy inputs for the higher fully connected layers which prevents them from overfitting.” 
They use 0.7 prob for conv drop out and 0.5 for fully connected.

“通过在卷积层中添加dropout(3.02%至2.55%)获得的额外性能增益值得注意。 人们可能已经假定由于卷积层没有很多参数,因此过度拟合不是问题,因此丢失不会产生太大影响。 然而,较低层中的丢失仍然有帮助,因为它为较高的完全连接层提供噪声输入,从而防止它们过度拟合。
他们conv 使用0.7 prob,fc使用0.5
 

参考:

https://blog.csdn.net/weixin_37947156/article/details/98763993

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值