最初的问题是关于 TensorFlow 实现的。 但是,答案是针对一般实现的。这个通用答案也是 TensorFlow 的正确答案。
在 TensorFlow 中使用批量标准化和 dropout(特别是使用 contrib.layers)时,我需要担心排序吗?
如果我使用 dropout,然后立即进行批量标准化,这似乎可能会出现问题。例如,如果批量归一化训练到较大规模的训练输出,但同样的转移应用于较小的(由于有更多输出的补偿)规模数字而在测试期间没有丢失,那么班次可能已关闭。TensorFlow 批量归一化层会自动对此进行补偿吗?还是由于某种原因我失踪了?
另外,将这两者一起使用时是否还有其他需要注意的陷阱?例如,假设我在上述方面以正确的顺序使用它们(假设 顺序 正确),在多个连续层上同时使用批量标准化和 dropout 会不会有问题?我没有立即发现问题,但我可能会遗漏一些东西。
非常感谢!
更新:
一项实验测试 似乎 表明排序 确实 很重要。我只使用批处理规范和 dropout 反向运行了两次相同的网络。当 dropout 早于批范数时,验证损失似乎随着训练损失的下降而上升。在另一种情况下,它们都在下降。但在我的情况下,动作很慢,所以经过更多的训练后情况可能会发生变化,这只是一次测试。仍将不胜感激更明确和明智的答案。
在Ioffe 和 Szegedy 2015中,作者指出“我们希望确保对于任何参数值,网络始终产生具有所需分布的激活”。因此,批标准化层实际上是在 Conv 层/全连接层之后插入的,但在输入 ReLu(或任何其他类型的)激活之前。有关更多详细信息,请在 53 分钟左右观看此视频。
就 dropout 而言,我相信 dropout 是在激活层之后应用的。在dropout 论文图 3b 中,隐藏层 l 的 dropout 因子/概率矩阵 r(l) 应用于 y(l) 上,其中 y(l) 是应用激活函数 f 后的结果。
所以综上所述,使用batch normalization和dropout的顺序是:
-> CONV/FC -> BatchNorm -> ReLu(或其他激活)-> Dropout -> CONV/FC ->