python - 从 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 层在训练和推理过程中的工作原理,但我不明白评论和修改的必要性。你怎么看?
解决方案
通常(在其他类型的层中)冻结层的训练并不一定意味着该层在推理模式下运行。推理模式通常由训练参数控制。在batchnorm层的情况下,当层被冻结时,我们希望不仅层参数在训练过程中不会修改,我们还希望模型使用移动均值和移动方差来归一化当前批次,而不是而不是使用当前批次的均值和方差。
因此,尽管层训练冻结和常见的推理模式之间存在差异。在 batchnorm 的情况下,两种模式之间有更多的相似性。在这两种情况下,我们希望除了冻结层的参数之外,模型使用一般均值和标准差,并且不会受到当前批次统计的影响。(这对模型的稳定性很重要)。
来自BatchNormalization 层指南 - Keras
关于在 BatchNormalization 层上设置 layer.trainable = False:
在所有类型的层中冻结一个层: 设置layer.trainable = False的意思是冻结层,即在训练过程中它的内部状态不会改变:它的可训练权重在fit()或train_on_batch()过程中不会更新,并且不会运行其状态更新。
冻结 batchnorm 层时的附加行为: 但是,在 BatchNormalization 层的情况下,在层上设置 trainable = False 意味着该层随后将在推理模式下运行(意味着它将使用移动均值和移动方差归一化当前批次,而不是使用当前批次的均值和方差)。
推荐阅读
- javascript - 从 bootstrap 迁移的资源,django 做出反应
- twilio - 是否有现成的方式使用 Twilio 将 Hybris 与 Whatsapp 集成?
- python - Python cartopy 投影因 imshow set_data() 方法而失败
- python - 使用 networkx 绘制多部图
- flutter - Flutter中对api数据的分页
- ruby - 获取子公司的运输方式列表
- css - SCSS 粒子动画 - 在随机位置创建,但沿同一方向移动所有粒子
- php - PHP/SQL - 如何计算每个月的星期六?
- python - Python- ArcMap - 计算字段 - 按顺序重命名相似记录
- postgresql - BigQuery - 将嵌套列转换为没有列名的 json