冻结 base_model 后模型不更新权重,根本原因是冻结操作必须在 compile() 之前完成且需触发 model.build() 或首次 fit() 才固化图结构;冻结后必须重新 compile(),否则 trainable 状态不生效。

如何利用TensorFlow实现迁移学习_冻结特征提取层后重新训练顶层

冻结 base_model 后训练顶层,为什么模型不更新权重?

常见现象是:明明设了 base_model.trainable = False,又加了新分类层,但训练时 model.trainable_weights 为空,或验证准确率卡死不动。根本原因不是冻结错了,而是冻结操作必须在 compile() 之前完成,且需触发一次 model.build() 或首次 fit() 才真正固化图结构。

trainable = False 后还能否微调部分中间层?

可以,但顺序很重要:先设 base_model.trainable = Falsecompile() 训练几轮;再设 base_model.trainable = True,**必须重新 compile()**,否则新 trainable 状态不会生效。更稳妥的做法是只解冻靠后的若干层,避免梯度爆炸。

tf.data 配合迁移学习时,prefetchcache 放哪?

顺序错会导致内存暴涨或数据增强失效。典型错误是把 cache() 放在 map(data_augment) 之后——这会让增强后的图像被缓存,失去随机性;而放在 map(data_augment) 之前又没意义,因为原始图像未归一化,缓存价值低。

加载权重后 model.evaluate() 结果异常高,但 fit() 时 loss 不降

这不是过拟合,大概率是预训练模型的预处理和你训练时用的不一致。比如用 MobileNetV2 却没走 tf.keras.applications.mobilenet_v2.preprocess_input,或者用了 ResNet50 却输入了 [0, 1] 归一化的图而非 [-1, 1]。

实际跑通的关键在于:冻结动作、编译时机、预处理一致性这三点咬死。中间任何一环松动,都会让模型看起来“学不会”,其实它根本没收到正确的梯度信号。
本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。