Jin*_*Jia 3 python deep-learning keras tensorflow batch-normalization
当我使用批量标准化但设置时会发生什么batch_size = 1?
因为我使用 3D 医学图像作为训练数据集,由于 GPU 限制,batch size 只能设置为 1。通常,我知道,当 时batch_size = 1,方差将为 0。并且(x-mean)/variance会因除以0 而导致错误。
但是为什么我设置的时候没有出现错误batch_size = 1呢?为什么我的网络训练得和我预期的一样好?有人能解释一下吗?
有人认为:
ZeroDivisionError由于两种情况,可能不会遇到 。首先,异常在trycatch 块中被捕获。其次,1e-19在方差项中添加一个小的有理数 ( ),使其永远不会为零。
但也有人不同意。他们说:
您应该计算批次图像中所有像素的均值和标准差。(所以即使
batch_size = 1,batch中仍然有很多像素。所以batch_size=1仍然可以工作的原因不是因为1e-19)
我查过Pytorch的源码,从代码上我觉得后一种是对的。
有人有不同意见吗???
方差将为 0
不,不会;BatchNormalization仅计算关于单个轴的统计数据(通常是通道轴,=-1默认情况下(最后));每隔一个轴被折叠,即求和求平均值;详情如下。
然而,更重要的是,除非你能明确地证明它是合理的,否则我建议不要使用BatchNormalizationwith batch_size=1; 有强烈的理论理由反对它,并且多个出版物表明 BN 性能batch_size在 32 以下时性能下降,并且 <= 8 时性能下降严重。简而言之,单个样本“平均”的批次统计数据在样本与样本之间差异很大(高方差),并且 BN 机制无法按预期工作。
实现细节:来自源代码:
reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]
Run Code Online (Sandbox Code Playgroud)
最终,tf.nn.monents被调用 with axes=reduction_axes,它执行 areduce_sum来计算variance。然后,在TensorFlow后端,mean并且variance被传递到tf.nn.batch_normalization返回列列车─或推断归一化的输入。
换句话说,如果你的输入(batch_size, height, width, depth, channels),或者(1, height, width, depth, channels),那么国阵会跑过来计算1,height,width,和depth尺寸。
方差可以为零吗?- 是的,如果任何给定channel切片(沿每个维度)的每个数据点都相同。但这对于真实数据来说几乎是不可能的。
其他答案:第一个是误导:
一个小的有理数被添加
1e-19到方差中( )
这在计算方差时不会发生,但在归一化时会添加到方差中;尽管如此,很少有必要,因为variance远非零。此外,epsilon 术语实际上1e-3是 Keras默认的;它不仅可以避免零分,还可以起到规范化的作用。
更新:我未能解决一个重要的直觉,怀疑方差为 0;实际上,批量统计方差为零,因为只有一个统计量- 但“统计量”本身涉及通道+空间维度的均值和方差。换句话说,方差的均值方差和是零,但平均方差和自身都没有。
| 归档时间: |
|
| 查看次数: |
4503 次 |
| 最近记录: |