使用批处理规范化但设置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
(最后一个));每隔一个轴折叠一次,即求和求平均值;详细信息如下。
但是,更重要的是,除非您可以明确证明其合理性,否则建议不要将BatchNormalization
与batch_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.monents
被axes=reduction_axes
调用,后者执行reduce_sum
来计算variance
。然后,在TensorFlow后端中,mean
和variance
从passed到tf.nn.batch_normalization
以返回训练或推理归一化的输入。换句话说,如果您输入的是
(batch_size, height, width, depth, channels)
或(1, height, width, depth, channels)
,则BN将在1
,height
,width
和depth
维度上运行计算。方差可以为零吗? -是的,如果任何给定的
channel
切片的每个数据点(以及每个维度)都相同。但这对于实际数据几乎是不可能的。其他答案:第一个是误导性的:
将一个小的有理数添加(
1e-19
)到方差这在计算方差时不会发生,但是在规范化时会添加到方差中。但是,由于
variance
远非零,因此几乎没有必要。同样,Keras实际上将epsilon项默认为1e-3
。它在规整中发挥着作用,而不仅仅是避免零除。