最初的问题是关于TensorFlow具体实现的。但是,这些答案一般适用于实现。这个一般答案也是TensorFlow的正确答案。
当在TensorFlow中使用批处理归一化和dropout(特别是使用contrib.layers)时,我需要担心排序吗?
It seems possible that if I use dropout followed immediately by batch normalization there might be trouble. For example, if the shift in the batch normalization trains to the larger scale numbers of the training outputs, but then that same shift is applied to the smaller (due to the compensation for having more outputs) scale numbers without dropout during testing, then that shift may be off. Does the TensorFlow batch normalization layer automatically compensate for this? Or does this not happen for some reason I'm missing?
此外,在同时使用这两者时,还有其他需要注意的缺陷吗?例如,假设我以正确的顺序使用它们(假设有正确的顺序),在多个连续层上同时使用批处理规范化和dropout会有麻烦吗?我不认为这有什么问题,但我可能遗漏了一些东西。
非常感谢!
更新:
一项实验测试似乎表明,排序确实很重要。我用批处理规范和dropout反向运行了相同的网络两次。当dropout在批数范数之前时,验证损失呈上升趋势,而训练损失呈下降趋势。在另一种情况下它们都是向下的。但我的动作很慢,所以经过更多的训练,情况可能会发生变化,这只是一次测试。一个更明确和更明智的答案仍然是值得赞赏的。
正如评论中提到的,这里有一个关于图层顺序的惊人资源。我已经看过了评论,这是我在互联网上找到的最好的主题资源
我的观点是:
Dropout是指完全阻断来自某些神经元的信息,以确保神经元不会相互适应。
所以,批归一化必须在dropout之后进行否则你就是在通过归一化统计来传递信息。
如果你仔细想想,在典型的ML问题中,这就是为什么我们不计算整个数据的平均值和标准差,然后把它分成训练集、测试集和验证集。我们分割并计算训练集上的统计数据,并使用它们来规范化和集中验证和测试数据集
所以我建议方案1(这考虑了pseudomarvin对已接受答案的评论)
-> CONV/FC -> ReLu -> ReLu -> Dropout -> BatchNorm -> CONV/FC
与方案二相反
-> CONV/FC -> BatchNorm -> ReLu(或其他激活)-> Dropout -> CONV/FC ->在接受的答案
请注意,这意味着与方案1下的网络相比,方案2下的网络应该显示过拟合,但OP运行了一些测试,如上文所述,它们支持方案2
转换激活- DropOut - BatchNorm - Pool——> Test_loss: 0.04261355847120285
转换激活- DropOut - Pool - BatchNorm——> Test_loss: 0.050065308809280396
转换激活- BatchNorm - Pool - DropOut——> Test_loss: 0.04911309853196144
转换激活- BatchNorm - DropOut - Pool——> Test_loss: 0.06809622049331665
转换- BatchNorm -激活- DropOut - Pool——> Test_loss: 0.038886815309524536
Conv - BatchNorm -激活- Pool - DropOut——> Test_loss: 0.04126095026731491
Conv - BatchNorm - DropOut - Activation - Pool——> Test_loss: 0.05142546817660332
Conv - DropOut - Activation - BatchNorm - Pool——> Test_loss: 0.04827788099646568
转换-退出-激活-池- BatchNorm——> Test_loss: 0.04722036048769951
Conv - DropOut - BatchNorm - Activation - Pool——> Test_loss: 0.03238215297460556
使用2个卷积模块(见下文)在MNIST数据集(20个epoch)上进行训练,每次后跟
model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))
卷积层的内核大小为(3,3),默认填充,激活为elu。Pooling是池侧(2,2)的MaxPooling。损失是categorical_crossentropy,优化器是adam。
对应的Dropout概率分别为0.2或0.3。特征映射的数量分别为32或64。
编辑:
当我删除Dropout时,正如一些答案中推荐的那样,它收敛得更快,但泛化能力比我使用BatchNorm和Dropout时差。
我在回答和评论中阅读了推荐的论文
https://stackoverflow.com/a/40295999/8625228
从Ioffe和Szegedy(2015)的观点来看,仅在
网络结构。Li等人(2018)给出了统计和
实验分析表明,存在方差位移时
从业者在BN之前使用Dropout。因此,Li等人(2018)建议
在所有BN层后应用Dropout。
从Ioffe and Szegedy(2015)的观点来看,BN是定位的
激活函数的内部/之前。然而,Chen et al. (2019)
使用结合了dropout和BN的IC层,Chen等人(2019)
建议在ReLU后使用BN。
在安全背景下,我只在网络中使用Dropout或BN。
陈广勇,陈鹏飞,石宇军,谢昌玉,廖本本,
张胜宇,2019。“重新思考批处理归一化的用法
以及深度神经网络训练中的Dropout。”相关系数
abs / 1905.05928。http://arxiv.org/abs/1905.05928。
约夫,谢尔盖,克里斯蒂安·塞格迪,2015。“批量标准化:
通过减少内部协变量加速深度网络训练
转变。”CoRR abs / 1502.03167。http://arxiv.org/abs/1502.03167。
李晓林,陈硕,胡晓林,杨健。2018。“理解
Dropout与批方差归一化的不协调
转变。”CoRR abs / 1801.05134。http://arxiv.org/abs/1801.05134。