最稳妥的迁移学习起点是冻结预训练模型底层权重、仅训练顶部分类层;需用tf.keras.applications加载并设include_top=false和weights='imagenet',输入尺寸须匹配,冻结必须在compile前执行且通过trainable_layers数量验证。

直接用 tf.keras.applications 里的预训练模型,冻结底层权重,只训练顶部分类层——这是最稳妥、最常用、也最容易出效果的迁移学习起点。
怎么选预训练模型和加载方式?
别自己从头下载权重文件,tf.keras.applications 提供了开箱即用的接口。选模型要看任务需求和硬件限制:
-
MobileNetV2轻量、适合边缘设备或小数据集;ResNet50更强但显存占用高 - 必须设
include_top=False,否则会加载原任务(ImageNet)的最后全连接层,和你的新类别冲突 - 加
weights='imagenet'才能真正加载预训练权重;设为None就是随机初始化,不算迁移学习 - 注意输入尺寸:比如
MobileNetV2默认要求(224, 224, 3),传错 shape 会在model.fit()时报ValueError: Input size is not compatible
为什么一定要 freeze base_model?
不 freeze 就等于让整个网络重新训练,小数据集上极易过拟合,而且训练慢、显存爆、结果反而更差。freeze 是迁移学习的核心控制点:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 用
base_model.trainable = False冻结全部层;之后再设trainable = True时,要配合model.compile()重新编译,否则新设置不生效 - 想微调部分底层?得手动逐层放开,比如
base_model.layers[-10:],但必须在compile()前做,且建议用较小学习率(如1e-5) - 检查是否生效:训练前打印
len([l for l in base_model.layers if l.trainable]),应为 0
如何构建和训练新分类头?
冻结 backbone 后,接一个轻量级分类头即可,重点是适配你的类别数和避免信息瓶颈:
- 推荐结构:
GlobalAveragePooling2D→Dense(128, activation='relu')→Dropout(0.2)→Dense(num_classes, activation='softmax') - 别用太深的全连接层:3 层以上容易过拟合,尤其当训练样本
- 损失函数必须匹配任务:
categorical_crossentropy(标签 one-hot)、sparse_categorical_crossentropy(整数标签),用错会收敛极慢甚至 loss 不降 - 验证集准确率突然卡住不动?先确认
trainable状态,再检查 label 编码是否和 loss 匹配
真正麻烦的不是搭模型,而是数据预处理和训练节奏——比如 ImageDataGenerator 的 rescale=1./255 必须和预训练模型的归一化方式一致(有些模型需要减均值,这时就得用 tf.keras.applications.xxx.preprocess_input);还有 learning rate 的分阶段调整,这些细节不处理好,迁移学习就只是“看起来用了预训练模型”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










