YOLO11模型保存路径在哪?一文讲清楚
你刚跑完YOLO11训练,终端最后一行显示“Results saved to runs/segment/train2”,心里却冒出一个最实际的问题:我辛辛苦苦训了30轮的模型,到底存在哪儿了?下次想接着用、想部署、想给别人看效果,该去哪个文件夹找那个.pt文件?
别急——这不是配置错误,也不是路径丢失,而是YOLO11(基于ultralytics 8.3.x)默认保存逻辑和新手容易忽略的细节共同导致的“找不着家”现象。本文不讲原理、不堆参数,只聚焦一个动作:精准定位、快速提取、安全复用。从训练结束那一刻起,手把手带你摸清每一份权重的落点,包括best.pt、last.pt、带优化器的原始权重,以及如何自定义保存位置。
1. 默认保存路径的完整结构解析
YOLO11训练完成后,所有产出物都集中在一个顶层目录下,这个目录由两部分动态拼接而成:固定前缀runs/+ 任务类型子目录 + 用户指定或自动生成的运行名。
1.1 核心路径公式
runs/{task}/{project}/{name}/{task}:任务类型,如detect(目标检测)、segment(实例分割)、pose(姿态估计)、classify(图像分类)、obb(旋转框检测){project}:项目名称,默认为runs/{task}下的子文件夹,如train、train2、my_project{name}:单次运行名称,默认为train,若存在同名则自动递增为train2、train3等
举个真实例子:
当你执行model.train(data="point-offer-seg.yaml", epochs=30)且未指定project和name时,系统会自动创建:runs/segment/train2/
这就是你在训练日志末尾看到的Results saved to runs/segment/train2的由来。
1.2runs/segment/train2/目录内关键文件一览
进入该目录后,你会看到如下标准结构(已按功能归类):
runs/segment/train2/ ├── weights/ # ← 模型权重就在这里!重点看 │ ├── best.pt # 最佳验证指标对应的模型(不含优化器) │ └── last.pt # 最后一轮训练完成的模型(不含优化器) ├── results.csv # 训练全过程指标记录(CSV格式,可Excel打开) ├── results.png # 自动绘制的损失/精度曲线图 ├── args.yaml # 本次训练所有参数的快照(含data、epochs、imgsz等) ├── train_batch0.jpg # 第0批训练数据可视化(含增强效果) ├── val_batch0_pred.jpg # 验证集首批次预测结果图 ├── val_batch0_labels.jpg # 验证集首批次真实标签图 └── dataset.json # 数据集统计信息(类别数、图片总数等)注意:weights/best.pt和weights/last.pt是剥离了优化器状态(optimizer state)的纯净模型,体积更小、加载更快,这才是你部署、推理、分享时真正该用的文件。
1.3 为什么看不到带优化器的权重?
YOLO11(ultralytics ≥8.0.200)默认在训练结束时自动剥离优化器,这是为了:
- 减小模型体积(通常减少30%~50%)
- 避免跨环境加载失败(不同PyTorch版本对optimizer兼容性差)
- 符合工业部署规范(推理模型不需要梯度更新)
你可以在训练日志中明确看到这行提示:Optimizer stripped from runs/segment/train2/weights/last.pt, 45.1MB
如果你确实需要保留优化器(例如要断点续训),必须显式关闭该行为。
2. 如何自定义模型保存路径?
硬记runs/segment/train2/weights/best.pt太费劲?完全没必要。YOLO11提供两级灵活控制:项目级统一管理和单次运行精准命名。
2.1 方法一:通过project和name参数指定根目录(推荐)
在model.train()中直接传入两个字符串参数:
results = model.train( data="point-offer-seg.yaml", epochs=30, imgsz=640, batch=8, project="my_yolo11_models", # ← 所有输出存到这个文件夹下 name="seg_point_offer_v1" # ← 本次运行专属子目录名 )执行后,模型将保存在:my_yolo11_models/seg_point_offer_v1/weights/best.pt
优势:
- 路径语义清晰,一眼看出用途(
seg_point_offer_v1) - 同一项目下可并行多组实验(
v1,v2,with_aug,no_mosaic) - 不污染默认
runs/目录,便于清理
2.2 方法二:修改ultralytics/cfg/default.yaml(全局生效,慎用)
找到源码中ultralytics/cfg/default.yaml文件,修改以下字段:
# ultralytics/cfg/default.yaml project: my_yolo11_models # 全局默认项目名 name: train # 全局默认运行名(仍会自动递增为train2等)风险提示:此方式影响所有后续训练,且需确保你有修改源码权限。仅建议在团队统一开发环境中使用,个人调试不推荐。
2.3 方法三:训练后手动复制(应急方案)
如果已经训完且路径混乱,用一行命令即可提取核心权重:
# 从默认路径拷贝best.pt到当前目录 cp runs/segment/train2/weights/best.pt ./my_best_model.pt # 或重命名并移至指定文件夹 mkdir -p ./deploy/models mv runs/segment/train2/weights/best.pt ./deploy/models/point_offer_seg_best_v1.pt3. 权重文件详解:best.ptvslast.ptvs 带优化器版
别再凭名字猜用途。这三类文件本质不同,适用场景截然分开:
| 文件名 | 是否含优化器 | 是否含训练参数 | 适用场景 | 文件大小特点 |
|---|---|---|---|---|
best.pt | ❌ 否 | 是(args.yaml中记录) | 推理、部署、效果展示 | 最小(仅模型+配置) |
last.pt | ❌ 否 | 是 | 快速验证最终效果、轻量部署 | 与best.pt基本一致 |
last_optimizer.pt(需手动保存) | 是 | 是 | 断点续训、调试学习率 | 显著更大(含optimizer.state_dict) |
3.1 如何生成带优化器的权重?(断点续训必备)
YOLO11默认不保存,但你可以主动开启:
from ultralytics import YOLO model = YOLO("yolo11m-seg.yaml").load("weights/yolo11m-seg.pt") # 关键:设置 save_period=1 且 keep_ckpt=True(ultralytics ≥8.3.9支持) train_params = { "data": "point-offer-seg.yaml", "epochs": 30, "save_period": 1, # 每1轮保存一次 "keep_ckpt": True, # ← 保留优化器状态!生成 last_optimizer.pt "project": "my_models", "name": "debug_resume" } results = model.train(**train_params)生成文件包括:
my_models/debug_resume/weights/last.pt(无优化器)my_models/debug_resume/weights/last_optimizer.pt(含优化器,可用于resume=True)
3.2 加载时如何区分?
- 推理/部署:永远用
YOLO("path/to/best.pt") - 断点续训:必须用
YOLO("yolo11m-seg.yaml").load("path/to/last_optimizer.pt")并传入resume=True
# 正确续训写法 model = YOLO("yolo11m-seg.yaml") model.load("my_models/debug_resume/weights/last_optimizer.pt") results = model.train(resume=True) # resume=True 会自动读取优化器状态4. 实战验证:三步确认你的模型真正在哪儿
光看文档不如亲手验证。用以下三个命令,5秒内锁定路径:
4.1 步骤1:查看训练日志末尾(最快)
训练结束后,终端最后几行必有:
30 epochs completed in 0.071 hours. Optimizer stripped from runs/segment/train2/weights/last.pt, 45.1MB Optimizer stripped from runs/segment/train2/weights/best.pt, 45.1MB Results saved to runs/segment/train2→ 路径已明示:runs/segment/train2/weights/
4.2 步骤2:用Python代码实时获取(防手误)
在训练脚本末尾加一行,运行后直接打印绝对路径:
print(" 最佳模型路径:", results.save_dir / "weights" / "best.pt") print(" 最终模型路径:", results.save_dir / "weights" / "last.pt")输出示例:
最佳模型路径: /home/user/my_project/runs/segment/train2/weights/best.pt 最终模型路径: /home/user/my_project/runs/segment/train2/weights/last.pt4.3 步骤3:Linux/Mac终端快速定位(适合批量检查)
# 查找所有 .pt 文件(按修改时间倒序,最新的在最上面) find runs -name "*.pt" -type f -printf '%T@ %p\n' | sort -n | tail -5 | cut -d' ' -f2- # 输出类似: # runs/segment/train2/weights/best.pt # runs/segment/train2/weights/last.pt # runs/detect/train/weights/best.pt5. 常见误区与避坑指南
这些“看似合理实则踩坑”的操作,新手90%都试过:
5.1 误区1:“我把train.py放在ultralytics/目录里,模型应该也在那儿”
❌ 错。YOLO11的保存路径与脚本位置完全无关,只取决于project/name参数和默认规则。train.py放 anywhere 都不影响输出位置。
5.2 误区2:“weights/yolo11m-seg.pt是我训出来的模型”
❌ 错。这是预训练权重(pretrained),位于你手动创建的weights/文件夹下,是训练起点,不是训练结果。你的成果永远在runs/下。
5.3 误区3:“best.pt总是比last.pt好,所以只留best.pt”
谨慎。best.pt基于验证集指标(如mAP50),但若验证集有偏差,last.pt可能在实际场景中更鲁棒。建议两者都保留,并用真实测试集对比效果。
5.4 误区4:“路径太长,我直接改源码把runs/换成./models/”
❌ 危险。ultralytics内部多处硬编码依赖runs/前缀(如TensorBoard日志、CSV生成、图片保存)。强行修改易导致训练中断或文件错位。
6. 部署前必做:模型瘦身与格式转换
拿到best.pt后别急着用,先做两件事提升可用性:
6.1 步骤1:导出为ONNX(跨平台部署基石)
from ultralytics import YOLO model = YOLO("runs/segment/train2/weights/best.pt") model.export(format="onnx", dynamic=True, simplify=True)生成:runs/segment/train2/weights/best.onnx
优势:可在Windows/Linux/嵌入式设备运行,无需Python环境。
6.2 步骤2:验证导出模型是否等效
# 加载ONNX模型并推理同一张图 onnx_model = YOLO("runs/segment/train2/weights/best.onnx") results_onnx = onnx_model("datasets/seg_point_offer_20240930/images/00001.jpg") # 与原PT模型对比结果(box坐标、mask、置信度) pt_model = YOLO("runs/segment/train2/weights/best.pt") results_pt = pt_model("datasets/seg_point_offer_20240930/images/00001.jpg") print("ONNX与PT结果一致:", abs(results_onnx[0].boxes.xyxy - results_pt[0].boxes.xyxy).max() < 1e-3)7. 总结:记住这四句话,永不错过你的模型
- 第一句:YOLO11的模型永远不在你放
train.py的地方,而在runs/{task}/{project}/{name}/weights/下。 - 第二句:日常使用只认
best.pt和last.pt,它们已剥离优化器,开箱即用。 - 第三句:想自定义路径?训练时加
project="xxx"和name="yyy",比记路径简单十倍。 - 第四句:部署前务必导出ONNX,并用真实图片验证输出一致性——路径对了,效果还得稳。
你现在可以立刻打开终端,输入ls runs/segment/*/weights/,看着那一排清晰的best.pt,心里踏实了。模型不是消失,只是藏在了有规律的地方。而规律,正是工程化的开始。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。