批量大小= 1时的批量标准化

时间:2020-01-08 14:57:55

标签: python tensorflow keras deep-learning batch-normalization

使用批量归一化但设置batch_size = 1时会发生什么?

由于我使用3D医学图像作为训练数据集,由于GPU的限制,批次大小只能设置为1。通常,我知道,当batch_size = 1时,方差将为0。(x-mean)/variance会因除以0而导致错误。

但是为什么在设置batch_size = 1时没有发生错误?为什么我的网络受到了预期的良好培训?有人可以解释吗?

Some people认为:

由于两种情况,可能不会遇到ZeroDivisionError。首先,将异常捕获在try catch块中。其次,向方差项添加一个小的有理数(1e-19),以使其永远不会为零。

但是some people不同意。他们说:

您应该计算批次图像中所有像素的均值和标准差。 (因此,即使batch_size = 1仍然有很多像素。因此batch_size=1仍然可以工作的原因并不是因为1e-19

我检查了Pytorch源代码,从代码中我认为后者是正确的。

有人有不同的看法吗?

1 个答案:

答案 0 :(得分:4)

方差将为0

不,不会; BatchNormalization仅针对单轴(通常为通道轴,=-1(默认为最后))计算统计信息;每隔一个轴合拢,即求和求平均值;详细信息。

但是,更重要的是,除非您可以明确证明其合理性,否则建议不要将BatchNormalizationbatch_size=1一起使用;有很强的理论上的理由反对它,并且多个出版物显示batch_size的BN性能下降到32以下,而<= 8则严重下降。简而言之,单个样本的“平均”批处理统计数据在样本之间差异很大(高方差),并且BN机制无法按预期工作。

小批量替代产品Batch Renormalization-Layer Normalization-Weight Normalization


实施细节:来自source code

reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]

最终,tf.nn.monentsaxes=reduction_axes调用,后者执行reduce_sum来计算variance。然后,在TensorFlow后端中,将passedtf.nn.batch_normalization中的meanvariance返回训练或推断归一化的输入。

换句话说,如果您输入的是(batch_size, height, width, depth, channels)(1, height, width, depth, channels),则BN会在1heightwidthdepth尺寸。

方差可以为零吗?-是的,如果给定channel切片的每个数据点(沿每个维度)都相同。但这对于实际数据应该几乎是不可能的。


其他答案:第一个有误导性:

将一个小的有理数(1e-19)添加到方差

在计算方差时不会发生这种情况,但是在进行归一化时会将其添加到方差中。但是,由于variance远非零,因此几乎没有必要。另外,Keras实际上将epsilon项默认为1e-3;它在规整中发挥着作用,而不仅仅是避免零除。


更新:我未能解决一个重要的直觉问题,怀疑方差为0;实际上,批量统计方差为零,因为只有一个统计-但是“统计”本身涉及通道+空间维度的均值和方差。换句话说,均值和方差的方差 为零,但均值和方差本身不是。