繁体   English   中英

使用 tensorflow 训练时传递 `training=true`

[英]Passing `training=true` when using doing tensorflow training

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

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

关于 BatchNormalization 层的重要说明 许多模型包含 tf.keras.layers.BatchNormalization 层。 该层是一种特殊情况,应在微调的上下文中采取预防措施,如本教程后面所示。

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

当您解冻包含 BatchNormalization 层的 model 以进行微调时,您应该通过在调用基础 model 时通过 training = False 将 BatchNormalization 层保持在推理模式。 否则,应用于不可训练权重的更新将破坏 model 学到的内容。

来源: 迁移学习,关于冻结的详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM