当前位置: 首页 > 知识库问答 >
问题:

批量规范化和退出的排序?

夏长卿
2023-03-14

最初的问题是专门针对TensorFlow实现的。然而,答案是针对一般实现的。这个一般答案也是TensorFlow的正确答案。

在TensorFlow中使用批处理规范化和退出(特别是使用contrib.layers)时,我需要担心排序吗?

如果我在批处理规范化之后立即使用dropout,可能会有麻烦。例如,如果批量标准化中的移位训练到较大的训练输出标度编号,但在测试过程中,相同的移位应用到较小的(由于有更多输出的补偿)标度编号,而没有丢失,则该移位可能会关闭。TensorFlow批量规范化层是否会自动对此进行补偿?或者这不是因为我失踪的原因吗?

此外,在将这两种方法结合使用时,是否还有其他陷阱需要注意?例如,假设我按照上述正确的顺序使用它们(假设有正确的顺序),那么在多个连续层上同时使用批处理规范化和退出会有问题吗?我没有立即发现有什么问题,但我可能遗漏了什么。

非常感谢您!

更新时间:

一项实验测试似乎表明,排序确实很重要。我在同一个网络上运行了两次,只有批次标准和辍学反向。当辍学率低于批量标准时,验证损失似乎会随着培训损失的减少而增加。他们都在另一个案子里倒下了。但就我而言,动作很慢,所以经过更多的训练,情况可能会有所改变,这只是一次测试。如能提供更明确、更知情的答复,我们将不胜感激。

共有3个答案

燕凯旋
2023-03-14
  • “在某些情况下,BN消除了辍学的需要,因为BN直观地提供了与辍学类似的正规化好处”

有关更多详细信息,请参阅@Haramoz在评论中已经提到的这篇文章【通过方差偏移理解辍学和批次规范化之间的不和谐】。

阎承嗣
2023-03-14

正如评论中所指出的,这里有一个令人惊叹的资源,可以按照层的顺序阅读。我已经浏览了评论,这是我在互联网上找到的关于主题的最好的资源

我的2美分:

辍学意味着完全阻断来自某些神经元的信息,以确保神经元不会共同适应。因此,批处理规范化必须在退出后进行,否则您将通过规范化统计传递信息。

如果你想一想,在典型的ML问题中,这就是为什么我们不计算整个数据的均方差,然后将其拆分为训练集、测试集和验证集。我们拆分并计算训练集上的统计数据,并使用它们来标准化和居中验证和测试数据集

所以我建议方案1(这考虑了伪君子对已接受答案的评论)

-

与方案2相反

-

请注意,这意味着与方案1下的网络相比,方案2下的网络应显示过度拟合,但OP运行了上述一些测试,并且支持方案2

艾敏学
2023-03-14

在Ioffe和Szegedy 2015中,作者指出“我们希望确保对于任何参数值,网络始终产生具有所需分布的激活”。因此,批处理规范化层实际上是在Conv层/全连接层之后插入的,但在输入ReLu(或任何其他类型的)激活之前。有关更多详细信息,请在大约53分钟的时间查看此视频。

至于脱落,我相信脱落是在激活层之后应用的。在辍学论文图3b中,隐层l的辍学因子/概率矩阵r(l)应用于y(l),其中y(l)是应用激活函数f后的结果。

综上所述,使用批处理规范化和退出的顺序是:

-

 类似资料:
  • 在TensorFlow中执行批量规格化的正确方法是什么?(即,我不想计算连续均值和方差)。我当前的实现基于tf。nn。batch\u normalization(批次规格化),其中x是具有形状的卷积层的输出。[批次大小、宽度、高度、通道数]。我想在通道方面执行批处理规范。 但这种实施的结果非常糟糕。与tensorflow比较。承包商。苗条的batch\u norm显示其票价较低(同样糟糕的培训表现

  • 我可以在输入层之后使用批处理规范化层而不规范化我的数据吗?我可以期望得到类似的效果/性能吗? 在keras函数中,它应该是这样的:

  • BatchNormalization层 keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one') 该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接

  • BatchNormalization层 keras.layers.normalization.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initia

  • 我使用Tensorflow 1.14.0和Keras 2.2.4。以下代码实现了一个简单的神经网络: 20个时代后的最终val\u损失为0.7751。当我取消注释添加批处理规范化层的唯一注释行时,val\u损失变为1.1230。 我的主要问题要复杂得多,但同样的事情也会发生。因为我的激活是线性的,所以我把批处理规范化放在激活之后还是之前并不重要。 问题:为什么批处理规范化帮不上忙?是否有什么可以更

  • 我了解批次归一化有助于更快的训练,将激活转向单位高斯分布,从而解决梯度消失问题。批次规范行为在训练(使用每个批次的平均值/var)和测试时间(使用训练阶段的最终运行平均值/var)中的应用不同。 另一方面,实例归一化作为对比度归一化,如本文所述https://arxiv.org/abs/1607.08022。作者提到,输出样式化的图像不应依赖于输入内容图像的对比度,因此实例规范化有助于实现。 但是