0Pricing
Learn AI with Python · 课时

迁移学习的概念与策略

特征提取与微调、冻结层,以及迁移学习何时能够发挥作用。

迁移学习的概念与策略 是 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 权重,这种现象称为灾难性遗忘。

典型工作流程

  1. 使用 include_top=False 加载预训练基础网络。
  2. 冻结基础网络并训练新的分类头(特征提取)。
  3. 解冻顶层,并以极低的学习率重新训练(微调)。
  4. 进行评估并转换为可部署格式。

即使数据集规模适中,这种分阶段的方法也能获得很高的准确率。

快速检查

请检验您对迁移学习策略的理解。

回顾

您已经学会了如何利用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 迁移学习的概念与策略
  2. 使用 VGG16 和 ResNet50 作为基础模型
  3. 微调:解冻与重新训练
  4. 用于边缘部署的 MobileNet 与 EfficientNet
← 返回 Learn AI with Python