【问题标题】:How to handle the BatchNorm layer when training fully convolutional networks by finetuning?通过finetuning训练全卷积网络时如何处理BatchNorm层?
【发布时间】:2017-11-21 03:33:56
【问题描述】:

为像素级语义分割训练全卷积神经网络 (FCN) 非常耗费内存。所以我们经常使用batchsize=1来训练FCN。但是,当我们使用 BatchNorm (BN) 层微调预训练网络时,batchsize=1 对 BN 层没有意义。那么,如何处理 BN 层呢?

一些选项:

  1. 删除 BN 层(将 BN 层与预训练模型的前面层合并)

  2. 冻结BN层的参数和统计数据

  3. ....

在 pytorch/tf/caffe 中实现哪个更好以及有任何演示?

【问题讨论】:

    标签: tensorflow deep-learning caffe pytorch


    【解决方案1】:

    我没有确切的答案,但这是我的想法:


    具有 BatchNorm (BN) 层的网络,batchsize=1 没有意义 对于 BN 层

    BN 的主要动机是固定输入在批次中的分布(均值/方差)。在我看来,只有一个元素是没有意义的。 Judging from the paper

    您需要计算 1 个元素的均值和方差,这没有意义。


    您总是可以只删除 BN,但您确定您不能负担批次中至少 16 个元素?

    【讨论】:

    • 当批量大小为 1 时,我不确定 BN 是否毫无意义:该层计算移动平均值。因此,将 BN 层留给微调可能是有意义的。
    • @Shai 根据我对论文的理解,您需要计算批次的均值和方差。不知道你将如何在下一个方程中使用 1 个元素 (0) 的方差。
    • 单个元素的变化可能很棘手......(一个有思想的人的表情符号)。
    • @Shai 这正是我认为 1batch 没有意义的原因(我可能错了)。如果我的理解有误,很乐意学习正确的方法。
    • 也许我们可以冻结在 ImageNet 上训练的 BN 层(参数和移动平均值)?或者我们可以在caffe prototxt中使用use_global_stats = 1这样的设置?
    【解决方案2】:

    如果 epsilon 不为零(方差为零,均值与输入相同),则只有一个元素将使批量归一化为零。
    最好从网络中删除 BN 层并尝试激活函数 SELU(缩放指数线性单元)。这来自论文'Self normalizing neural networks' (SNN)。

    引自论文:

    虽然批量归一化需要显式归一化,但神经元 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))
    

    【讨论】:

      【解决方案3】:

      根据我在 PyTorch 中的实验,如果 BN 之前的卷积层输出多个值(即 1 x feat_nb x height x width,其中 height > 1 或 width > 1),那么 BN 仍然可以正常工作,即使批量大小等于一。但是,我怀疑在这种情况下,方差估计可能非常有偏差,因为用于方差计算的所有样本都来自同一图像。因此,就我而言,我仍然决定使用小批量。

      【讨论】:

        【解决方案4】:

        Batch Normalization 被引入以减少输入特征图的内部协变量偏移。由于每个优化步骤后各层参数的变化,一层的输入分布也会发生变化,这会减慢模型的收敛速度。通过使用 Batch Normalization,我们可以对输入分布进行归一化,而与 batch_size(batch_size =1 或更大)无关。

        BN 对输入分布进行归一化

        对于中间层的卷积网络输入是 4D 张量。 [batch_size, width, height, num_filters]。归一化影响所有特征图。

        删除 BN 层(将 BN 层与之前的层合并以用于预训练模型)

        这可能会进一步减慢训练步骤并且可能无法实现收敛。

        冻结BN层的参数和统计数据

        有时,重新训练/微调的输入数据分布可能与用于训练用于初始化的预训练模型的原始数据有很大差异,因此您的模型最终可能会出现非最佳解决方案。

        【讨论】:

        • 关于卷积层的 BN 的一个好点 - 即使批量大小为 1,也有多个样本用于平均。出色的观察力!
        【解决方案5】:

        我的观察与 Stephan 的相反:在类似的输入 batch x feat_nb x height x width, where height > 1 or width > 1 上使用 PyTorch,我发现在最后一个 conv 之后和最后一个非线性(sigmoid)之前添加 BatchNorm 实际上会大大损害准确性。还是想弄明白。。 (批量大小 = 8)

        【讨论】:

          【解决方案6】:

          The effective batch size over convolutional layer 我认为 BN 原始论文中的 CNN 相关部分(第 3.2 节)可能会有所帮助。从作者的角度来看,卷积层使用 batch size = 1 应该没问题。卷积层的“有效batch size”实际上是batch_size * image_height * image_width。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-07
            • 2016-12-27
            • 2018-05-01
            • 2019-01-14
            • 1970-01-01
            • 2016-07-01
            相关资源
            最近更新 更多