迁移学习 (Transfer Learning):利用预训练模型快速构建高性能模型
📂 所属阶段:第二阶段 — 深度学习视觉基础(CNN 篇)
🔗 相关章节:数据增强 (Data Augmentation) · 目标检测理论
引言
你是否被这些现实问题困扰过?
- 手头只有几百张私有标注图片,从零开始训练CNN,准确率连60%都不到;
- 好不容易攒够了数据,GPU显存和时间却根本撑不住大规模模型的训练。
迁移学习(Transfer Learning) 就是为了解决这些痛点而生的现代深度学习利器。它的核心思想很简单:复用已经在大规模通用数据集(比如ImageNet的120万张图片)上训练好的视觉特征,再针对你的特定任务做少量的调整,就能快速获得一个性能优异的模型。
1. 核心概念与工作原理
1.1 为什么迁移学习这么有效?
CNN的不同层学习到的特征具有天然的通用性分层:
正是因为浅层和中层特征对几乎所有视觉任务都通用,我们只需调整那些与特定类别相关的深层部分,就能用很少的数据完成适应。
1.2 核心迁移策略(按保守程度排序)
根据你的数据量和计算资源,可以直接套用下面这张决策速查表:
2. PyTorch实现迁移学习
2.1 准备工作:修正过时API + 基础配置
⚠️ 重要提示:torchvision 0.13+ 版本已经弃用了 pretrained=True,现在推荐使用更规范的 weights=预训练权重类。
2.2 完整的特征提取 / 分层微调代码
下面以最常用的 ResNet50 + 私有图像分类 为例,编写了一个同时兼容特征提取和分层微调的函数:
2.3 数据加载(注意!预处理必须和预训练一致)
刚刚 build_transfer_model 返回的预训练预处理可以直接复用,这样就能保证我们的数据预处理和当初训练ImageNet时完全一致:
2.4 训练循环(极简版,包含早停逻辑)
3. 快速上手示例
把上面的函数拼起来,一个完整的迁移学习流程只需十几行代码:
4. 最佳实践
为了让你的迁移学习之旅更顺利,这里总结了几条实战经验:
- 预处理必须一致:直接使用预训练权重自带的
transforms(),避免手动填写归一化均值、标准差时出错。 - 从保守策略开始:先用特征提取跑通整个流程,确认数据和代码没问题之后,再尝试分层微调或全量微调。
- 分层学习率(可选但强烈推荐):微调时,可以给不同层设置不同的学习率,例如新分类头用
1e-3,最后 1-2 个 CNN 模块用1e-4,前面的层用1e-5或更小——这样能让底层通用特征保持稳定,高层特征逐渐适应新任务。 - 早停机制:避免不必要的过度训练,始终保存验证集上表现最好的模型。
- 数据增强不可少:即使只有几百张图片,也应当加入简单的数据增强(水平翻转、随机裁剪),这能有效抑制过拟合。

