【问题标题】:Passing `training=true` when using doing tensorflow training使用 tensorflow 训练时传递 `training=true`
【发布时间】:2020-12-13 10:45:46
【问题描述】:

TensorFlow 的官方教程说我们应该在训练期间传递 base_model(trainin=False) 以使 BN 层不更新均值和方差。我的问题是:为什么?为什么我们不需要更新均值和方差,我的意思是 BN 具有 imagenet 均值和方差,为什么使用 imagenet 的均值和方差而不是在新数据上更新它们是有用的?即使在微调期间,在这种情况下,整个模型都会更新权重,但 BN 层仍将具有 imagenet 均值和方差。 编辑:我正在使用本教程:https://www.tensorflow.org/tutorials/images/transfer_learning

【问题讨论】:

标签: python tensorflow keras tensorflow2.0


【解决方案1】:

从初始化开始训练模型时,应启用 batchnorm 以调整它们的均值和方差,如您所述。微调或迁移学习有点不同:您已经有一个模型可以做的比您需要的更多,并且您希望执行预训练模型的特定专业化来完成您的数据集的任务/工作。在这种情况下,部分权重被冻结,只有最接近输出的一些层被改变。由于模型周围都使用了 BN 层,因此您也应该冻结它们。再次检查这个解释:

关于 BatchNormalization 层的重要说明 许多模型包含 tf.keras.layers.BatchNormalization 层。这一层是特殊的 应在微调的背景下采取案例和预防措施,因为 将在本教程后面显示。

当你设置 layer.trainable = False 时,BatchNormalization 层 将在推理模式下运行,并且不会更新其均值和方差 统计数据。

当您解冻包含 BatchNormalization 层的模型时 为了进行微调,您应该保留 BatchNormalization 层 在调用基础时通过 training = False 在推理模式下 模型。否则,更新应用于不可训练的权重 会破坏模型学到的东西。

来源:transfer learning,详情关于freeze

【讨论】:

  • 我明白了,但是当他们解冻所有砝码时呢?好像除了BN均值和方差之外所有的权重都更新了,还是正确的吗?
  • 在我看来,如果你解冻所有的权重,那么初始的预训练在这一点上并不重要。您将获得与随机初始化几乎相同的结果。所以这种情况是可能的,但没有用。
  • 我的意思是,你训练网络的头部然后解冻整个模型。在这种情况下,他们仍然在推理模式下使用 BN 层
  • 查看explanation。解冻 BN 的主要思想使预训练模型的使用变得毫无意义。
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2019-12-10
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2017-11-28
相关资源
最近更新 更多