使用批处理规范化但设置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源代码,从代码中我认为后者是正确的。

有谁有不同的意见???

最佳答案

方差将为0


不,不会; BatchNormalization仅计算单个轴的统计信息(通常是通道轴,默认情况下为=-1(最后一个));每隔一个轴折叠一次,即求和求平均值;详细信息如下。

但是,更重要的是,除非您可以明确证明其合理性,否则建议不要将BatchNormalizationbatch_size=1一起使用。有很强的理论理由对此表示反对,并且许多出版物表明,对于batch_size低于32,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后端中,meanvariancepassedtf.nn.batch_normalization以返回训练或推理归一化的输入。

换句话说,如果您输入的是(batch_size, height, width, depth, channels)(1, height, width, depth, channels),则BN将在1heightwidthdepth维度上运行计算。

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



其他答案:第一个是误导性的:


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


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

07-26 08:11