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是“让层用推理时的逻辑干活”。
- 对批量归一化(BN)层:训练时会用当前批次的均值/方差更新自身的移动统计量,推理时则用预训练阶段积累的移动均值/方差;
调用
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
相关产品推荐
相关产品推荐

