在 YOLOv11 中使用last.pt(训练中断 / 完成后保存的模型权重)继续训练,核心是加载预训练权重并沿用原有训练配置,确保训练连续性(保留已学习的参数、优化器状态等)。以下是详细步骤、代码实现和关键注意事项:
一、核心原理
last.pt是 YOLOv11 训练过程中自动保存的检查点文件,包含:
- 模型的权重参数(
model.state_dict()); - 优化器状态(
optimizer.state_dict()),确保继续训练时优化器沿原有梯度方向更新; - 训练轮次(
epoch)、学习率调度器状态(scheduler)等元信息,保证训练连续性。
继续训练的关键是:加载last.pt后,不重置优化器和训练轮次,仅修改训练参数(如总轮次、学习率)即可延续训练。
二、前提条件
- 已安装 YOLOv11 依赖(推荐使用官方
ultralytics库,YOLOv11 已集成其中):pip install ultralytics>=8.2.0 # 确保版本支持 YOLOv11 - 保留训练时的数据集配置文件(如
data.yaml)、模型配置文件(如yolov11n.yaml,若未自定义则用官方默认配置); last.pt文件路径正确(默认保存在runs/detect/train/weights/last.pt,或自定义路径)。
三、两种继续训练方式(推荐方式 1)
方式 1:使用 Ultralytics CLI 命令(最简单,推荐)
YOLOv11 官方ultralytics库支持通过命令行直接加载last.pt继续训练,无需编写代码,适合快速上手。
基础命令格式
yolo detect train model=last.pt # 核心:指定 model 为 last.pt data=你的数据集配置.yaml # 必须与原训练的数据集一致 epochs=新的总轮次 # 如原训练了50轮,继续训练到100轮则设为100 batch=批量大小 # 沿用原批量或根据显存调整 lr0=学习率 # 可选,默认沿用原优化器学习率 project=保存路径 # 可选,默认沿用原 runs/detect/train name=exp # 可选,默认沿用原实验名称 resume=True # 关键:开启恢复训练模式(自动加载 optimizer/epoch 信息)示例命令(实战)
假设原训练:用yolov11n.yaml训练了 50 轮,last.pt路径为runs/detect/train/weights/last.pt,现在要继续训练到 100 轮:
# 继续训练(沿用原数据集、优化器状态,总轮次设为100) yolo detect train model=runs/detect/train/weights/last.pt data=data.yaml # 与原训练的数据集一致,不可修改(否则权重不匹配) epochs=100 # 总轮次(原50轮,继续训练50轮) batch=16 # 若显存不足可减小(如8),若充足可增大(如32) lr0=0.001 # 可选:若原学习率过高,可适当降低(默认沿用原优化器学习率) resume=True # 必须设为 True,否则仅加载权重不恢复训练状态 device=0 # 指定GPU(0为第一张GPU,CPU设为cpu)关键参数说明
resume=True:必须开启,否则仅加载模型权重(相当于 fine-tune),不恢复优化器和训练轮次;epochs:新的总轮次(不是新增轮次),例如原训练了 50 轮,想再训练 30 轮,需设为80;data:必须与原训练的数据集完全一致(类别数、类别名称、数据路径),否则会因维度不匹配报错;batch:可根据显存调整(若原批量 16 显存溢出,可改为 8),不影响训练连续性。
方式 2:使用 Python 代码(灵活定制,适合二次开发)
通过ultralytics.YOLO类加载last.pt,手动配置训练参数,支持更灵活的定制(如自定义回调函数、动态调整学习率)。
完整代码示例
from ultralytics import YOLO # 1. 加载 last.pt 模型(自动读取模型配置、优化器状态、训练轮次) model = YOLO("runs/detect/train/weights/last.pt") # 替换为你的 last.pt 路径 # 2. 配置继续训练的参数(关键:resume=True) train_args = { "data": "data.yaml", # 与原训练数据集一致 "epochs": 100, # 总轮次(原50轮→继续到100轮) "batch": 16, # 批量大小(根据显存调整) "lr0": 0.001, # 初始学习率(可选,默认沿用原优化器) "resume": True, # 恢复训练状态(优化器、epoch、scheduler) "device": 0, # GPU编号(CPU设为"cpu") "project": "runs/detect", # 保存项目路径(可沿用原路径) "name": "train", # 实验名称(可沿用原名,自动覆盖后续检查点) "save": True, # 保存检查点(默认True) "save_period": 10, # 每10轮保存一次检查点 "patience": 50, # 早停耐心值(50轮无提升则停止) } # 3. 开始继续训练 results = model.train(**train_args) # 训练完成后,新的 last.pt 和 best.pt 会保存在 runs/detect/train/weights/灵活定制示例(如调整学习率、冻结部分层)
from ultralytics import YOLO model = YOLO("runs/detect/train/weights/last.pt") # 示例1:调整学习率(覆盖原优化器学习率) train_args = { "data": "data.yaml", "epochs": 100, "batch": 16, "lr0": 0.0005, # 降低学习率(原学习率可能过高,避免震荡) "lrf": 0.01, # 学习率衰减因子(默认0.01) "resume": True, } # 示例2:冻结主干网络,仅训练头部(适合微调,可选) # for param in model.model.model[0].parameters(): # 冻结主干网络 # param.requires_grad = False # 开始训练 model.train(**train_args)四、关键注意事项(避坑指南)
1. 数据集必须一致
- 继续训练时的
data.yaml必须与原训练完全一致:类别数、类别名称、训练 / 验证集路径不能修改; - 若需修改数据集(如新增类别、调整数据路径),不能直接用
last.pt继续训练,需重新训练或作为预训练权重 fine-tune(resume=False)。
2. 避免覆盖原有权重(可选)
- 若想保留原
last.pt,可修改project或name参数,将新训练结果保存到新路径:# CLI 方式:保存到新路径 runs/detect/train_resume yolo detect train model=last.pt data=data.yaml epochs=100 resume=True project=runs/detect name=train_resume
3. 学习率调整建议
- 若原训练已接近收敛(
val_loss趋于平稳),继续训练时建议将lr0降低为原学习率的 1/10 ~ 1/5(如原lr0=0.01,改为0.001),避免过拟合或震荡; - 若原训练中断时
val_loss仍在下降,可沿用原学习率(不指定lr0参数,自动加载优化器状态)。
4. 显存不足的解决方案
- 减小
batch大小(如从 16 改为 8、4); - 启用半精度训练(
amp=True,默认开启),节省显存; - 降低图像分辨率(
imgsz=640改为imgsz=480,需在train_args中添加imgsz=480,但注意:原训练若用 640,继续训练也需保持一致,否则权重不匹配)。
5. 训练中断后的恢复
- 若继续训练时再次中断,YOLOv11 会自动保存新的
last.pt,下次训练时仍可加载该文件继续,无需额外操作; - 若
last.pt损坏,可尝试用best.pt(训练过程中验证集效果最好的权重)继续训练,此时resume=False(仅加载权重,不恢复优化器状态):yolo detect train model=runs/detect/train/weights/best.pt data=data.yaml epochs=100 resume=False
五、常见问题排查
问题 1:加载last.pt报错 “dimension mismatch”
- 原因:
data.yaml与原训练数据集不一致(类别数、输入尺寸变化); - 解决方案:确保
data.yaml与原训练完全一致,输入尺寸(imgsz)保持不变。
问题 2:继续训练后val_loss突然飙升
- 原因:学习率过高,或数据集发生变化;
- 解决方案:降低
lr0(如原0.01改为0.001),检查数据集是否一致。
问题 3:“No optimizer found in last.pt”
- 原因:
last.pt仅保存了模型权重(如手动保存的model.save(),而非训练过程中自动保存的检查点); - 解决方案:用
resume=False加载权重(相当于 fine-tune),重新初始化优化器:yolo detect train model=last.pt data=data.yaml epochs=100 resume=False
六、总结
YOLOv11 继续训练last.pt的核心是:
- 确保
data.yaml、imgsz与原训练一致; - 训练时指定
model=last.pt并开启resume=True; - 按需调整
epochs、batch、lr0等参数,避免过拟合或显存溢出。
通过 CLI 命令可快速实现,通过 Python 代码可灵活定制,适合不同场景的需求。训练完成后,新的last.pt(最新权重)和best.pt(验证集最优权重)会自动保存,可用于后续推理或再次继续训练。