如果在测试时在训练模式下使用批次归一化怎么办?

J.D*_*Doe 6 normalization tensorflow

批次归一化在训练阶段和测试阶段具有不同的行为。

例如,在tensorflow中使用tf.contrib.layers.batch_norm时,我们应该is_training在不同的阶段设置不同的值。

我的问题是:如果is_training=True在测试时仍然设置该怎么办?那就是说如果我在测试阶段仍然使用训练模式怎么办?

我提出这个问题的原因是,测试时未设置Pix2PixDualGAN的已发布代码is_training=False。而且,如果is_training=False在测试时设置了该值,则生成的图像的质量可能非常差。

有没有人可以解释一下?谢谢。

Pat*_*wie 7

在训练期间,BatchNorm层尝试做两件事:

  • 估计整个训练集的平均值和方差(人口统计数据)
  • 对输入均值和方差进行归一化,使其表现得像高斯

在理想情况下,可以在第二点使用整个数据集的总体统计信息。但是,这些是未知的,并且在训练过程中会发生变化。与此相关的还有其他一些问题。

一种变通方法是通过以下方式对输入进行归一化

gamma * (x - mean) / sigma + b
Run Code Online (Sandbox Code Playgroud)

基于小批量统计信息meansigma

在培训过程中,小批量的统计数据的移动平均来近似人口的统计数据。

现在,原始的BatchNorm公式将整个数据集的近似均值和方差用于推理期间的归一化。由于网络是固定的,所以mean和的近似值variance应该很好。尽管现在使用人口统计数据似乎很有意义,但这是一个关键的变化:从小批量统计到整个培训数据的统计。

培训期间批次不空或批次很小时至关重要。(但是我也观察到了32个批次的批次)。

建议的BatchNorm隐式地假设这两个统计数据非常相似。特别是,在pix2pix或dualgan中对大小为1的微型批次的训练会给出关于人口统计信息的非常差的信息。在这种情况下,它们可能包含完全不同的值。

现在有了一个深层的网络,后期的层希望输入是标准化的批次(就小批量统计而言)。请注意,他们接受了这类特殊数据的培训。但是,使用整个数据集统计信息会违反推理过程中的假设。

如何解决这个问题?就像在您提到的实现中一样,在推理期间也可以使用小批量统计信息。或者使用 BatchReNormalization,它引入了2个附加术语来消除小批量和总体统计之间的差异,或者仅使用InstanceNormalization(用于回归任务),实际上与BatchNorm相同,但分别处理批处理中的每个示例,并且不使用人口统计数据。

我在研究期间也遇到了这个问题,现在将InstanceNorm层用于回归任务。