大家好,本篇将详细介绍如何对 YOLOv11 模型进行 冻结前几层进行训练(冻结训练) 和后续 解冻微调,并将其与直接训练效果进行对比,让你对迁移学习策略有更深的理解。


🎬 教学视频推荐

本文是参考B站up主视频学习的教程 B站视频教程 一起学习,更直观上手!

<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=114286277953248&bvid=BV1CcRfYUE1J&cid=29254618953&p=1" 
scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

📌 冻结训练策略简介

在深度学习中,如果你的模型使用了预训练模型,那么前几层已经学会了通用特征(比如边缘、纹理),没必要重复训练。因此我们可以 先冻结前几层,仅训练后面的层,能:

  • ⚡ 提高训练速度
  • 📉 降低过拟合风险
  • 🧠 更快收敛,尤其在小样本场景下

🧪 冻结训练前10层(前10轮)

我们先训练10轮,并冻结前10层:

from ultralytics import YOLO

if __name__ == "__main__":
    model = YOLO(r"G:\BaiduNetdiskDownload\yolo_change\yolov11\ultralytics-main\ultralytics\cfg\models\11\yolo11 copy.yaml")
    model.train(
        data=r"G:\BaiduNetdiskDownload\yolo_change\yolov11\ultralytics-main\dataset\dataset\data.yaml",
        epochs=10,
        batch=4,
        freeze=list(range(10))  # 冻结前10层
    )

📸 训练效果如下:

冻结训练前10轮效果


🔄 解冻模型再训练10轮

接下来,我们加载上一次的权重(last.pt),并 不再冻结层,再训练10轮:

from ultralytics import YOLO

if __name__ == "__main__":
    model = YOLO(r"G:\BaiduNetdiskDownload\yolo_change\yolov11\ultralytics-main\runs\detect\train7\weights\last.pt")
    model.train(
        data=r"G:\BaiduNetdiskDownload\yolo_change\yolov11\ultralytics-main\dataset\dataset\data.yaml",
        epochs=10,
        batch=4
    )

📸 训练效果如下:

解冻后再训练10轮效果


📈 与直接训练20轮效果对比

我们还进行了直接训练20轮的实验(未冻结):

📸 直接训练效果如下:

直接训练20轮效果


🧠 对比分析

训练方式 mAP表现 训练速度 收敛效果 总体评价
冻结10轮+再训练10轮 表现稳健 收敛稳定 ✅推荐
直接训练20轮 结果起伏较大,略差 容易震荡 ❌可能欠拟合或过拟合

✍️ 小结:

  • 本次实验虽然冻结训练效果非常拉胯,几乎没有任何改进,但更稳定
  • 若数据量小、模型大,冻结训练更适合避免过拟合
  • 若观察过拟合现象明显,再使用该策略将有更大收益!

❤️ 如果你觉得有帮助

点个赞 👍、收藏 ⭐、关注我 👣,你们的支持是我持续分享干货的最大动力!

有问题欢迎评论区提问,或者私信交流。我们一起在 AI 路上越走越远!


Logo

更多推荐