首页 > 解决方案 > 从 Keras 的 BatchNormalization 派生的类的用途不明确

问题描述

我正在阅读 YOLOv4 对象检测器的 Keras 实现的代码。它使用自定义 Batch Norm 层,如下所示:

class BatchNormalization(tf.keras.layers.BatchNormalization):
    """
    "Frozen state" and "inference mode" are two separate concepts.
    `layer.trainable = False` is to freeze the layer, so the layer will use
    stored moving `var` and `mean` in the "inference mode", and both `gama`
    and `beta` will not be updated !
    """
    def call(self, x, training=False):
        if not training:
            training = tf.constant(False)
        training = tf.logical_and(training, self.trainable)
        return super().call(x, training)

尽管我了解通常的 Batch Norm 层在训练和推理过程中的工作原理,但我不明白评论和修改的必要性。你怎么看?

标签: pythontensorflowkerasobject-detectionyolov4

解决方案


通常(在其他类型的层中)冻结层的训练并不一定意味着该层在推理模式下运行。推理模式通常由训练参数控制。在batchnorm层的情况下,当层被冻结时,我们希望不仅层参数在训练过程中不会修改,我们还希望模型使用移动均值和移动方差来归一化当前批次,而不是而不是使用当前批次的均值和方差。

因此,尽管层训练冻结和常见的推理模式之间存在差异。在 batchnorm 的情况下,两种模式之间有更多的相似性。在这两种情况下,我们希望除了冻结层的参数之外,模型使用一般均值和标准差,并且不会受到当前批次统计的影响。(这对模型的稳定性很重要)。

来自BatchNormalization 层指南 - Keras

关于在 BatchNormalization 层上设置 layer.trainable = False:

在所有类型的层中冻结一个层: 设置layer.trainable = False的意思是冻结层,即在训练过程中它的内部状态不会改变:它的可训练权重在fit()或train_on_batch()过程中不会更新,并且不会运行其状态更新。

冻结 batchnorm 层时的附加行为: 但是,在 BatchNormalization 层的情况下,在层上设置 trainable = False 意味着该层随后将在推理模式下运行意味着它将使用移动均值和移动方差归一化当前批次,而不是使用当前批次的均值和方差)。


推荐阅读