训练完全卷积式神经网络(FCN)进行像素化语义分割是非常耗费内存的。所以我们经常使用batchsize = 1来训练FCN。但是,当我们使用BatchNorm(BN)层对预训练网络进行微调时,batchsize = 1对于BN层没有意义。那么,如何处理BN层?
一些选项:
删除BN图层(将BN图层与预训练模型的前面图层合并)
冻结BN图层的参数和统计数据
...
哪个更好,任何在pytorch / tf / caffe中实现的演示?
答案 0 :(得分:3)
如果epsilon非零,只有一个元素将使批量标准化为零(方差为零,平均值与输入相同)。
最好从网络中删除BN层并尝试激活函数SELU(缩放指数线性单位)。这来自论文'Self normalizing neural networks'(SNNs)。
文章引用:
批量标准化需要显式标准化,神经元 SNN的激活自动收敛到零均值和 单位方差。 SNN的激活功能是“缩放的” 指数线性单位“(SELUs),它引起自我归一化 属性。
SELU定义为:
def selu(x, name="selu"):
alpha = 1.6732632423543772848170429916717
scale = 1.0507009873554804934193349852946
return scale * tf.where(x >= 0.0, x, alpha * tf.nn.elu(x))
答案 1 :(得分:2)
根据我在PyTorch中的实验,如果BN之前的卷积层输出多个值(即1 x feat_nb x height x width,其中height> 1或width> 1),那么BN仍能正常工作当批量大小等于1时。但是,我怀疑在这种情况下,方差估计可能非常有偏差,因为用于方差计算的所有样本都来自同一图像。因此,在我的情况下,我仍然决定使用小批量。
答案 2 :(得分:2)
Batch Normalization来减少输入要素图的内部协变量偏移。由于每个优化步骤后每层参数的变化,层的输入分布也会发生变化,这会减慢模型的收敛速度。通过使用批量标准化,我们可以标准化输入分布,而不管batch_size(batch_size = 1还是更大)。
BN规范化输入分布
对于中间层的卷积网络输入是4D张量。 [batch_size, width, height, num_filters]
。标准化会影响所有要素图。
删除BN图层(将BN图层与预训练模型的前面图层合并)
这可能会进一步减慢训练步骤,并且无法实现收敛。
冻结BN图层的参数和统计数据
有时,用于重新训练/微调的输入数据分布可能与用于训练用于初始化的预训练模型的原始数据有很大不同,因此您的模型可能会以非最佳解决方案结束。
答案 3 :(得分:1)
The effective batch size over convolutional layer 我认为BN原始论文中的CNN相关部分(第3.2节)可以提供帮助。从作者的角度来看,对卷积层使用批量大小= 1应该没问题。 "有效批量大小"对于卷积层实际上是batch_size * image_height * image_width。
答案 4 :(得分:0)
我没有确切的答案,但这是我的想法:
具有BatchNorm(BN)层的网络,batchsize = 1没有意义 对于BN层
BN的主要动机是确定批次中输入的分布(均值/方差)。在我看来,拥有一个元素是没有意义的。 Judging from the paper
你需要计算1个元素的均值和方差,这是没有意义的。
您可以随时删除BN,但是您确定批量中至少有16个元素可用吗?
答案 5 :(得分:0)
我的观察结果与Stephan相反:在类似的输入batch x feat_nb x height x width, where height > 1 or width > 1
上使用PyTorch,我发现在最后一次转换之后和最后一次非线性(sigmoid)实际损害准确性之前添加BatchNorm很大的利润。仍然试图理解它...
(批量大小= 8)