TensorFlow的官方教程说,为了使BN层不更新均值和方差,我们应该在训练期间通过base_model(trainin=False)。我的问题是:为什么?为什么我们不需要更新均值和方差,我的意思是BN有imagenet均值和方差,为什么使用imagenet的均值和方差而不对新数据进行更新是有用的?即使在精细调优期间,在这种情况下,整个模型也会更新权重,但BN层仍将具有imagenet均值和方差。编辑:我正在使用本教程:学习
发布于 2020-12-13 13:16:50
当模型从初始化开始训练时,应该启用批规范来调优它们的均值和方差,正如您所提到的。细化或转移学习是一件有点不同的事情:您已经有了一个可以做得比您需要的更多的模型,并且您希望对经过预先培训的模型执行特定的专门化操作,以完成您的任务/对数据集的工作。在这种情况下,部分重量被冻结,只有一些最接近输出的层被改变。由于BN层是使用周围的模型,你应该冻结他们以及。请再次检查此解释:
关于BatchNormalization层的重要注意--许多模型包含tf.keras.layers.BatchNormalization层。这一层是一个特殊情况,应该在微调上下文中采取预防措施,如本教程后面所示。 设置layer.trainable = False时,BatchNormalization层将以推理模式运行,不会更新其均值和方差统计信息。 当您解冻包含BatchNormalization层的模型以进行微调时,您应该在调用基本模型时通过传递training = False来将BatchNormalization层保持在推理模式中。否则,应用于不可训练权重的更新将破坏模型所学到的内容。
https://stackoverflow.com/questions/65274684
复制相似问题