You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow迁移学习中training=False的作用及相关疑问

关于Keras中base_model(x, training=False)的疑问解答

你的代码示例:

base_model = tf.keras.applications.resnet_v2.ResNet50V2(input_shape=input_shape, include_top=False, weights='imagenet')

base_model.trainable = False

inputs = tf.keras.Input(shape=input_shape)

x = data_augmentation(inputs)

x = tf.keras.applications.resnet_v2.preprocess_input(x)

x = base_model(x, training = False)

疑问解答:

  • base_model(x, training=False)的核心作用
    你已经知道base_model.trainable=False是冻结权重、不让预训练层更新参数,但training=False管的是层的运行逻辑模式,和权重更新完全是两回事:

    • 对批量归一化(BN)层:训练时会用当前批次的均值/方差更新自身的移动统计量,推理时则用预训练阶段积累的移动均值/方差;training=False会强制BN层进入推理模式,哪怕你在调用fit()训练整个模型,预训练层里的BN也不会改动自己的统计数据。
    • 对Dropout层:训练时会随机失活部分神经元,推理时则保留所有神经元;training=False会直接关闭Dropout的失活逻辑。
      简单说,trainable=False是“不让层改权重”,training=False是“让层用推理时的逻辑干活”。
  • 调用fit()时该参数的影响
    当你用fit()训练整个模型(比如在预训练层后面接了自定义分类头),如果不设置training=False,Keras会默认把training=True传递给所有子层。这时候哪怕预训练层权重冻结,里面的BN层还是会跟着当前训练批次更新移动均值/方差——这等于破坏了预训练模型学到的特征分布,会直接导致模型性能下降,完全违背了用预训练特征的初衷。

  • 不打算微调时的参数选择

    • 绝对不能设training=True:这会让预训练层里的BN、Dropout进入训练态,污染预训练好的特征。
    • 也不能不设置这个参数:Keras在fit()时默认传递training=True,结果和设training=True一样有问题。
    • 正确做法就是保持base_model(x, training=False),确保预训练层稳定输出在ImageNet上学到的特征。

内容的提问来源于stack exchange,提问作者Marios Constantinou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:27:36