迁移学习的概念与策略
特征提取与微调、冻结层,以及迁移学习何时能够发挥作用。
迁移学习的概念与策略 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
什么是迁移学习
迁移学习将一个在大型数据集上训练的模型作为新相关任务的起点。您不必从头开始学习视觉特征,而是借用网络已经学会的特征。
这样可以大幅减少达到高准确率所需的数据量和计算资源。
ImageNet 基础
大多数预训练视觉模型都在 ImageNet 上训练,该数据集包含约 140 万张图像,分为 1000 个类别。
在训练过程中,网络会学习一个特征层次结构:较早的层学习边缘和颜色,中间层学习纹理,靠近顶部的层学习物体部件。这些低级特征几乎可以很好地迁移到任何图像任务。
为什么早期特征能够迁移
最初的卷积层会检测边缘、斑块和梯度等通用模式,这些模式出现在每一张自然图像中,无论图像内容是猫、X 光片还是卫星照片。
更深的层会变得更加特定于任务(它们会将这些边缘组合成 ImageNet 中物体的各个部件)。因此,我们通常会保留早期层,并替换或重新训练后面的层。
策略 1:特征提取
特征提取会冻结预训练基础网络的每一层,使其权重不再发生变化。基础网络充当固定的特征提取器;您只需在顶部训练一个新的小型分类头。
当您的数据集较小且与 ImageNet 相似时,请使用这种方法。由于可训练参数很少,它速度快,也能抵抗过拟合。
base.trainable = False
model = Sequential([
base, # frozen ImageNet features
GlobalAveragePooling2D(),
Dense(num_classes, activation="softmax") # only this trains
])策略 2:微调
微调会解冻基础网络的顶层,并让它们与分类头一起重新训练,使网络能够根据您的特定数据调整高级特征。
当您拥有更多数据,或您的领域与 ImageNet 不同(例如医学扫描图像)时,请使用这种方法。请始终以非常低的学习率进行微调,以免破坏预训练权重。
特征提取与微调
- 特征提取:基础网络冻结,仅训练分类头,速度非常快,最适合规模较小且相似的数据。
- 微调:解冻基础网络的顶层并训练分类头,速度较慢,最适合规模较大或差异较大的数据。
一种常见做法是先进行特征提取,等分类头稳定后,再在第二阶段进行微调。
数据量要求
您拥有多少数据决定了应采用哪种策略:
- 几百张图像:仅进行特征提取(冻结所有层)。
- 几千张图像:先进行特征提取,再微调前面几层。
- 数万张或更多:微调基础网络中更大的部分,甚至整个网络。
数据越少,就越应该冻结更多层,因为减少可训练参数可以降低过拟合风险。
替换分类头
ImageNet 模型输出 1000 个类别。您的任务可能具有不同数量的类别,因此请移除原始顶部(include_top=False),并添加一个类别数量与您的任务相匹配的分类头。
from tensorflow.keras import layers, Model
x = base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(5, activation="softmax")(x) # 5 custom classes
model = Model(base.input, outputs)预处理必须匹配
每个预训练模型系列都要求输入按照 ImageNet 训练期间使用的相同方式进行缩放。使用匹配的 preprocess_input 至关重要,否则准确率会大幅下降。
from tensorflow.keras.applications.resnet50 import preprocess_input
# Scale pixels exactly as ResNet50 expects
x = preprocess_input(raw_image_batch)学习率规范
在进行特征提取时,常规学习率(例如 1e-3)即可,因为只有新建的分类头会参与训练。
在进行微调时,必须将学习率降到 1e-5 这样非常小的值。较大的更新会抹去精心学习的 ImageNet 权重,这种现象称为灾难性遗忘。
典型工作流程
- 使用
include_top=False加载预训练基础网络。 - 冻结基础网络并训练新的分类头(特征提取)。
- 解冻顶层,并以极低的学习率重新训练(微调)。
- 进行评估并转换为可部署格式。
即使数据集规模适中,这种分阶段的方法也能获得很高的准确率。
快速检查
请检验您对迁移学习策略的理解。
回顾
您已经学会了如何利用 ImageNet 预训练特征进行迁移学习(140 万张图像,1000 个类别)。对于规模较小且相似的数据集,特征提取会冻结基础网络;对于规模较大或差异较大的数据,微调会以极低的学习率解冻顶层。
请使预处理与基础网络匹配,为您的类别替换分类头,并采用分阶段的工作流程。接下来,我们将使用 VGG16 和 ResNet50 将这些内容写入代码。
常见问题解答
「迁移学习的概念与策略」课时是免费的吗?
是的 — 「迁移学习的概念与策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「迁移学习的概念与策略」这节课中我会学到什么?
特征提取与微调、冻结层,以及迁移学习何时能够发挥作用。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「迁移学习的概念与策略」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。