微调:解冻与重新训练
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(特征提取):冻结基础网络,以约 1e-3 的学习率训练分类头,直到验证准确率趋于平稳。
- 阶段 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 反馈 — 无需本地设置。