发布于2026-04-19 阅读(0)
扫一扫,手机访问
冻结 base_model 后模型不更新权重,根本原因是冻结操作必须在 compile() 之前完成且需触发 model.build() 或首次 fit() 才固化图结构;冻结后必须重新 compile(),否则 trainable 状态不生效。

base_model 后训练顶层,为什么模型不更新权重?常见现象是:明明设了 base_model.trainable = False,又加了新分类层,但训练时 model.trainable_weights 为空,或验证准确率卡死不动。根本原因不是冻结错了,而是冻结操作必须在 compile() 之前完成,且需触发一次 model.build() 或首次 fit() 才真正固化图结构。
model.compile(),不能复用冻结前编译过的模型实例tf.keras.applications 加载预训练模型(如 ResNet50),默认 include_top=False,此时要手动接 Dense 层,别漏掉 GlobalAveragePooling2Dlen(model.trainable_weights) 是否为 0(冻结后)→ 接上新层后是否 > 0,这是最直接的验证方式trainable = False 后还能否微调部分中间层?可以,但顺序很重要:先设 base_model.trainable = False,compile() 训练几轮;再设 base_model.trainable = True,**必须重新 compile()**,否则新 trainable 状态不会生效。更稳妥的做法是只解冻靠后的若干层,避免梯度爆炸。
Conv2D 块开始(比如 ResNet 的最后一个 conv5_block3_),而不是全放开Adam(1e-5),否则底层特征提取器容易被破坏trainable=True 时,BN 的 moving_mean/moving_variance 会更新;若只想微调权重不更新统计量,应显式设 layer.trainable = True 后,再把 BN 层的 training 参数固定为 False(需自定义 call())tf.data 配合迁移学习时,prefetch 和 cache 放哪?顺序错会导致内存暴涨或数据增强失效。典型错误是把 cache() 放在 map(data_augment) 之后——这会让增强后的图像被缓存,失去随机性;而放在 map(data_augment) 之前又没意义,因为原始图像未归一化,缓存价值低。
dataset.map(preprocess_input).cache().map(data_augment).batch().prefetch()preprocess_input 是模型配套的归一化函数(如 tf.keras.applications.resnet50.preprocess_input),必须在 cache 前执行,否则缓存的是原始像素值,后续每次都要重复计算cache();大数据集建议只 cache() 训练集,验证集跳过,避免爆内存model.evaluate() 结果异常高,但 fit() 时 loss 不降这不是过拟合,大概率是预训练模型的预处理和你训练时用的不一致。比如用 MobileNetV2 却没走 tf.keras.applications.mobilenet_v2.preprocess_input,或者用了 ResNet50 却输入了 [0, 1] 归一化的图而非 [-1, 1]。
preprocess_input 函数和模型严格匹配,不同版本(v1/v2)、不同 backend(TensorFlow/PyTorch 转换)预处理逻辑可能不同float32,且 shape 为 (None, 224, 224, 3) 类(取决于模型),不要用 uint8 直接喂入cache() 范围过大、shuffle 关闭)
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8