SpatialDropout2D、BatchNormalization 和激活函数的正确顺序?

Posted

技术标签:

【中文标题】SpatialDropout2D、BatchNormalization 和激活函数的正确顺序?【英文标题】:correct order for SpatialDropout2D, BatchNormalization and activation function? 【发布时间】:2020-04-25 08:03:06 【问题描述】:

对于 CNN 架构,我想使用 SpatialDropout2D 层而不是 Dropout 层。 另外我想使用 BatchNormalization。 到目前为止,我总是在卷积层之后但在激活函数之前直接设置 BatchNormalization,正如 Ioffe 和 Szegedy 的论文中提到的那样。 我一直在 MaxPooling2D 层之后设置的 dropout 层。

在https://machinelearningmastery.com/how-to-reduce-overfitting-with-dropout-regularization-in-keras/SpatialDropout2D是在卷积层之后直接设置的。

我发现我现在应该按什么顺序应用这些图层相当令人困惑。我还在 Keras 页面上读到 SpatialDropout 应该直接放在 ConvLayer 后面(但我再也找不到这个页面了)。

以下顺序正确吗?

ConvLayer - SpatialDropout - BatchNormalization - 激活函数 - MaxPooling

我真的希望得到提示,并提前谢谢你

更新 我的目标实际上是在以下 CNN 架构 dropout 中交换空间 dropout:

model = Sequential()
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(10))
model.add(Activation('softmax'))

【问题讨论】:

【参考方案1】:

Dropout vs BatchNormalization - 标准偏差问题

混合这些层时会出现一个大问题,尤其是当BatchNormalization 紧跟在Dropout 之后时。

Dropouts 试图在没有 dropout 的情况下保持输出的相同均值,但它确实会改变标准差,这将导致训练和验证之间的 BatchNormalization 出现巨大差异。 (在训练过程中,BatchNormalization 接收到变化的标准差,累积并存储它们。在验证过程中,dropouts 被关闭,标准差不再是变化的,而是原来的。但是BatchNormalization,因为它在验证中,不会使用批量统计,而是使用存储的统计,这和批量统计会有很大的不同)

所以,第一条也是最重要的规则是:不要在Dropout(或SpatialDropout)之后放置BatchNormalization

通常,在应用批量标准化之前,我会尝试保留至少两个卷积/密集层而没有任何丢失,以避免这种情况。

Dropout vs BatchNormalization - 将零更改为另一个值

同样重要的是:Dropout 的作用是将下一层的某些权重的影响“归零”。如果您在 dropout 之后应用归一化,您将不再有“零”,而是会为许多单位重复的某个值。这个值会因批次而异。因此,尽管添加了噪音,但您并没有像纯 dropout 那样杀死单位。

Dropout 与 MaxPooling

MaxPooling 之前使用常规Dropout 的问题是您会将一些像素归零,然后MaxPooling 将取最大值,有点忽略了您的丢失部分。如果您的 dropout 碰巧达到了最大像素,则池化将导致第二个最大值,而不是零。

所以,DropoutMaxPooling 之前会降低 dropout 的有效性。

SpatialDropout 与 MaxPooling

但是,SpatialDropout 永远不会点击“像素”,它只会点击通道。当它到达一个通道时,它会将那个通道的所有像素归零,因此,MaxPooling 也将有效地归零。

因此,spatial 在池化之前和之后的 dropout 之间没有区别。整个“通道”在两个顺序中都将为零。

批量标准化与激活

根据激活函数的不同,在它之前使用批量标准化可能是一个很好的优势。

对于'relu' 激活,规范化使模型在“全零冻结 relu 层”的厄运情况下具有故障安全性。它还倾向于保证一半的单位为零,另一半是线性的。

对于'sigmoid''tahn'BatchNormalization 将保证值在健康范围内,避免饱和和梯度消失(离零太远的值将达到这些值几乎平坦的区域函数,导致梯度消失)。

有人说反之还有其他好处,我不是很清楚这些好处,我很喜欢我提到的那些。

退出与激活

'relu'没有区别,it can be proved that the results are exactly the same。

对于未居中的激活,例如'sigmoid' 在激活之前放置一个 dropout 不会导致“零”,而是其他值。对于 sigmoid,dropout 之前的最终结果是 0.5。

例如,如果您在 dropout 之后添加 'tanh',您将得到零,但 dropout 用于保持相同均值的缩放比例将被 tanh 扭曲。 (我不知道这是否是一个大问题,但可能是)

MaxPooling 与激活

我在这里看的不多。如果激活不是很奇怪,最终的结果是一样的。

结论?

有可能,但有些很麻烦。我觉得下面这个顺序很好,经常用它

我会做类似的事情

组 1 转化率 BatchNorm 激活 最大池化 丢弃或空间丢弃 组 2 转化率 -----(最后一组有dropout,这里没有BatchNorm) 激活 最大池化 Dropout 或 SpatialDropout(决定是否使用) 两组后无辍学 可以再次使用 BatchNorm

【讨论】:

这些都是非常详细的解释,很多都是非常有说服力的。但我仍然想知道的是,为什么有人建议将 SpatialDropout 直接放在 ConvLayer 之后?我在上面附上了一个代码,实际上我只是想用 dropout 交换空间 dropout 并使用这个网络进行图像识别。 @CodeNow 我怀疑 Möller 提倡在 Conv 后辍学,但如果他是,我会强烈反对;您的链接文章令人失望,来自机器学习博士。 Möller 的其余答案是合理的,我将在 relu 之后添加 BN 值得尝试,因为它很好地将输出标准化为下一层的输入。另请注意,与Dropout 相比,SpatialDropout 的收敛时间可能会更长。 @OverLordGoldDragon 哦,有趣的是,“SpatialDropout”可能需要更长的时间才能收敛。也许只在第一个“MaxPooling”之后测试“SpatialDropout”是个好主意。因为 Keras 在 keras.io/layers/core 页面上写的内容听起来像“SpatialDropout”,所以只能在第一层之后使用,因为早期卷积层中的特征图是强相关的。 @CodeNow 这是一个设计决策;相关与去相关并不明确,每个都有起伏。例如,在自动编码器中,SpatialDropout 可用于训练稀疏 AE,与去噪 AE 相比,稀疏 AE 在分类方面的迁移效果更好。尽管在我在 AEs 之外的实验中,对于时间序列,SD 确实比早期层的 Dropout 表现更差。另请参阅this answer,与 CNN 相关以及 SD 的可视化演示。 感谢您提供如此详细的答案。但是基于以下论文:openaccess.thecvf.com/content_CVPR_2019/papers/…,他们建议在整个网络中使用 BN,然后在最后一个 BN 层之后使用 Dropout。对此有什么想法吗?

以上是关于SpatialDropout2D、BatchNormalization 和激活函数的正确顺序?的主要内容,如果未能解决你的问题,请参考以下文章

第五讲 卷积神经网络 --baseline

第五讲 卷积神经网路-- Inception10 --cifar10

第五讲 卷积神经网路-- Inception10 --cifar10

360面试——计算机视觉面试