微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在迁移学习期间冻结批规范层 关于BatchNormalization层的重要说明

如何解决如何在迁移学习期间冻结批规范层 关于BatchNormalization层的重要说明

我正在关注 TensorFlow 官方网站上的 Transfer learning and fine-tuning guide。指出在微调期间,批量归一化层应处于推理模式:

关于Batchnormalization层的重要说明

许多图像模型包含 Batchnormalization 层。那一层是 每个可以想象的计数的特殊情况。这里有几件事要保留 记住。

  • Batchnormalization 包含 2 个不可训练的权重,在训练期间会更新。这些是跟踪输入均值和方差的变量。
  • 当您设置 bn_layer.trainable = False 时,Batchnormalization 层将在推理模式下运行,并且不会更新其均值和方差统计信息。其他层通常情况并非如此,as weight trainability & inference/training modes are two orthogonal concepts。但在 Batchnormalization 层的情况下,两者是联系在一起的。
  • 当您解冻包含 Batchnormalization 层的模型以进行微调时,您应该通过在调用基本模型时传递 Batchnormalization 来将 training=False 层保持在推理模式。否则,应用于不可训练权重的更新会突然破坏模型所学到的东西。

您将在最后的端到端示例中看到此模式的实际应用 本指南。

即便如此,其他一些来源,例如 this 文章标题resnet 的迁移学习),说的完全不同:

for layer in resnet_model.layers:
    if isinstance(layer,Batchnormalization):
        layer.trainable = True
    else:
        layer.trainable = False

无论如何,我知道 TensorFlow 中的 trainingtrainable 参数之间存在差异。

我正在从文件加载我的模型,如下所示:

model = tf.keras.models.load_model(path)

我正在以这种方式解冻(或实际上冻结其余部分)一些顶层:

model.trainable = True

for layer in model.layers:
    if layer not in model.layers[idx:]:
        layer.trainable = False

现在关于批量标准化层:我可以这样做:

for layer in model.layers:
    if isinstance(layer,keras.layers.Batchnormalization):
      layer.trainable = False

  for layer in model.layers:
    if layer.name.startswith('bn'):
      layer.call(layer.input,training=False)

我应该怎么做?以及最终是否更好地冻结批规范层?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。