使用批量归一化但设置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 :(得分:4)
方差将为0
不,不会; BatchNormalization
仅针对单轴(通常为通道轴,=-1
(默认为最后))计算统计信息;每隔一个轴合拢,即求和求平均值;详细信息。
但是,更重要的是,除非您可以明确证明其合理性,否则建议不要将BatchNormalization
与batch_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.monents
被axes=reduction_axes
调用,后者执行reduce_sum
来计算variance
。然后,在TensorFlow后端中,将passed到tf.nn.batch_normalization
中的mean
和variance
返回训练或推断归一化的输入。
换句话说,如果您输入的是(batch_size, height, width, depth, channels)
或(1, height, width, depth, channels)
,则BN会在1
,height
,width
和depth
尺寸。
方差可以为零吗?-是的,如果给定channel
切片的每个数据点(沿每个维度)都相同。但这对于实际数据应该几乎是不可能的。
其他答案:第一个有误导性:
将一个小的有理数(
1e-19
)添加到方差
在计算方差时不会发生这种情况,但是在进行归一化时会将其添加到方差中。但是,由于variance
远非零,因此几乎没有必要。另外,Keras实际上将epsilon项默认为1e-3
;它在规整中发挥着作用,而不仅仅是避免零除。
更新:我未能解决一个重要的直觉问题,怀疑方差为0;实际上,批量统计方差为零,因为只有一个统计-但是“统计”本身涉及通道+空间维度的均值和方差。换句话说,均值和方差的方差 为零,但均值和方差本身不是。