0Pricing
Learn AI with Python · 课时

微调:解冻与重新训练

base_model.trainable = True、逐层解冻,以及差分学习率。

微调:解冻与重新训练 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

何时进行微调

特征提取训练好分类头后,微调可以让预训练基础网络的顶部适应您的数据,从而进一步提高准确率。请等分类头稳定后再进行微调,否则来自随机分类头的大梯度可能会损坏基础网络。

解冻基础网络

设置 base.trainable = True,使权重重新变得可更新。单独这样做会解冻所有层,通常过于激进。

base.trainable = True
print("Trainable layers:", sum(l.trainable for l in base.layers))

冻结前 N 层

早期层包含通用的边缘和纹理检测器,您需要保留这些检测器。重新冻结前 N 层,只微调更深的、特定于任务的层。

base.trainable = True
freeze_until = 100   # keep first 100 layers frozen

for layer in base.layers[:freeze_until]:
    layer.trainable = False
for layer in base.layers[freeze_until:]:
    layer.trainable = True

为什么要使用极低的学习率

微调需要使用 1e-5 这样极低的学习率。预训练权重已经足够优秀;您只需要对它们进行轻微调整。较大的学习率会导致灾难性遗忘,抹去您希望利用的 ImageNet 知识。

解冻后重新编译

更改 trainable 标志后,必须重新编译模型,以便 Keras 重新确定哪些权重需要计算梯度。请在此处设置较低的学习率。

from tensorflow.keras.optimizers import Adam

model.compile(
    optimizer=Adam(learning_rate=1e-5),
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

两个阶段的过程

  1. 阶段 1(特征提取):冻结基础网络,以约 1e-3 的学习率训练分类头,直到验证准确率趋于平稳。
  2. 阶段 2(微调):解冻顶层,以约 1e-5 的学习率重新编译模型并继续训练。

这样分阶段可以稳定训练过程,并保护预训练特征。

在第 2 阶段继续训练

使用 initial_epoch 从第 1 阶段停止的位置继续训练,使日志和调度计划保持连续。

history2 = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=20,
    initial_epoch=10   # phase 1 ended at epoch 10
)

学习率调度器

调度器会随时间降低学习率,使模型收敛时更新幅度逐渐减小。ReduceLROnPlateau会在验证损失停滞时自动降低学习率。

from tensorflow.keras.callbacks import ReduceLROnPlateau

lr_cb = ReduceLROnPlateau(
    monitor="val_loss", factor=0.5,
    patience=2, min_lr=1e-7
)
model.fit(train_ds, validation_data=val_ds,
          epochs=20, callbacks=[lr_cb])

BatchNorm 注意事项

ResNet 和 EfficientNet 包含会跟踪运行统计量的 BatchNormalization 层。进行微调时,保持 BN 层冻结(或处于推理模式)通常可以获得更稳定的结果,因为在小型数据集上更新这些统计量可能会降低准确率。

防范过拟合

微调会增加许多可训练参数,因此过拟合风险也会升高。请使用数据增强、丢弃法,并根据验证损失使用 EarlyStopping 来抑制过拟合。

from tensorflow.keras.callbacks import EarlyStopping

stop = EarlyStopping(monitor="val_loss",
                     patience=4,
                     restore_best_weights=True)

综合运用

一种稳健的微调流程是:先训练 head,解冻顶层,冻结 BN,以 1e-5 重新编译,然后使用调度器和早停进行训练。请始终比较前后的验证准确率,以确认微调确实带来了帮助。

快速检查

请检验您对微调的了解。

回顾

您学会了通过设置 base.trainable=True、重新冻结前 N 层、以极小的学习率(1e-5)重新编译,并运行两阶段流程来进行微调。学习率调度器和早停有助于保持训练稳定,同时需要谨慎处理 BatchNorm 层。下一步:用于边缘设备部署的轻量级模型。

常见问题解答

「微调:解冻与重新训练」课时是免费的吗?

是的 — 「微调:解冻与重新训练」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「微调:解冻与重新训练」这节课中我会学到什么?

base_model.trainable = True、逐层解冻,以及差分学习率。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 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