YOLO26损失地图绘制:只改权重和数据集路径即可生成损失地图(Loss Landscape)
在 ultralytics26-main7.25 中使用新增脚本 plot_loss_landscape.py,通过修改代码顶部的权重路径和数据集路径,直接运行代码生成损失等高线图、3D损失曲面图、中心截面图和CSV采样结果。
1. 损失地图的作用
损失地图用于观察模型当前权重附近的损失变化。脚本会从当前权重 theta_0 出发,随机生成两个参数方向 d_1 和 d_2,然后在二维网格中扰动权重并重新计算检测损失:
θ(α,β)=θ0+αd1+βd2 \theta(\alpha,\beta)=\theta_0+\alpha d_1+\beta d_2 θ(α,β)=θ0+αd1+βd2
每个采样点都会计算一次 YOLO 检测损失:
最终得到一个二维损失矩阵,用于绘制等高线图和三维曲面图。低损失区域越平缓,说明模型在当前权重附近对参数扰动越不敏感。
2. 只需要修改两个路径
打开项目根目录中的:
text
plot_loss_landscape.py
在文件顶部找到 Common configuration 区域,主要修改这两个参数:
python
WEIGHTS_PATH = ROOT / r"yolo26n.pt"
DATA_PATH = ROOT / r"datasets\Aijiaojioashou\data.yaml"
如果你的权重在训练目录里,可以写成:
python
WEIGHTS_PATH = ROOT / r"runs\detect\train\weights\best.pt"
DATA_PATH = ROOT / r"datasets\Aijiaojioashou\data.yaml"
改完后直接运行:
powershell
python plot_loss_landscape.py
如果默认 python 没有安装 PyTorch,可使用当前可用的 YOLO 环境:
3. 迭代次数是哪个参数
损失地图不是训练脚本,所以这里没有训练意义上的 epochs。你要调的"迭代次数"对应:
python
STEPS = 9
STEPS 表示每个方向采样多少个点,总计算次数是:
N=STEPS×STEPS N = STEPS \times STEPS N=STEPS×STEPS
例如:
STEPS |
总采样点数 | 适合场景 |
|---|---|---|
| 5 | 25 | 快速测试脚本能否跑通 |
| 21 | 441 | 较平滑的正式图 |
| 31 | 961 | 更细腻,但耗时明显增加 |
所以,如果你想增加损失地图的迭代采样次数,就改:
python
STEPS = 21
4. 关键参数说明
脚本顶部常用配置如下:
python
WEIGHTS_PATH = ROOT / r"yolo26n.pt"
DATA_PATH = ROOT / r"datasets\Aijiaojioashou\data.yaml"
OUTPUT_ROOT = ROOT / "runs" / "loss_landscape"
RUN_NAME = "code_config_loss_landscape"
STEPS = 9
RADIUS = 0.05
MAX_BATCHES = 16
BATCH = 16
IMG_SIZE = 640
SPLIT = "val"
DEVICE = "auto"
| 参数 | 含义 | 建议 |
|---|---|---|
WEIGHTS_PATH |
权重路径 | 填 .pt 文件,如 yolo26n.pt、best.pt |
DATA_PATH |
数据集配置 | 填 data.yaml |
RUN_NAME |
输出文件夹名称 | 每次实验可改一个新名字 |
STEPS |
每个方向采样点数 | 主要控制"迭代次数" |
RADIUS |
权重扰动半径 | 常用 0.03 到 0.10 |
MAX_BATCHES |
每个采样点计算多少个batch | 快速测试用小值,正式图可加大 |
BATCH |
batch size | 显存不足时调小 |
IMG_SIZE |
输入分辨率 | 快速测试用 320,正式图用 640 |
SPLIT |
数据划分 | 一般使用 val |
DEVICE |
运行设备 | auto、cpu、0、cuda:0 |
其中:
python
MAX_BATCHES = 0
表示使用完整验证集计算每个采样点的损失,结果更稳定,但耗时最长。
5. 推荐配置
快速测试:
python
STEPS = 5
RADIUS = 0.05
MAX_BATCHES = 1
BATCH = 1
IMG_SIZE = 320
更平滑的正式图:
python
STEPS = 21
RADIUS = 0.05
MAX_BATCHES = 8
BATCH = 4
IMG_SIZE = 640
如果机器性能足够,可以使用:
python
STEPS = 31
MAX_BATCHES = 0
6. 输出文件
运行完成后,默认输出目录为:
text
runs\loss_landscape\code_config_loss_landscape
主要输出文件:
| 文件 | 说明 |
|---|---|
loss_landscape.csv |
每个采样点的 total_loss、box_loss、cls_loss、dfl_loss |
loss_landscape_contour.png |
二维损失等高线图 |
loss_landscape_surface.png |
三维损失曲面图 |
loss_landscape_profile.png |
中心截面损失曲线 |
loss_landscape_report.png |
综合报告图 |
metadata.json |
记录权重、数据集、采样参数和最低损失点 |
7. 图像展示
综合报告图:

二维等高线图:

三维损失曲面图:

中心截面图:

8. 如何解读损失地图
| 观察对象 | 含义 |
|---|---|
| 中心点 | 当前权重位置 |
| 低损失区域 | 模型在该区域内保持较低检测损失 |
| 等高线密集程度 | 越密集表示该方向损失变化越快 |
| 3D曲面陡峭程度 | 越陡说明模型对参数扰动越敏感 |
| 中心截面曲线 | 用一维曲线观察两个方向上的损失变化 |
损失地图只能说明当前权重附近的局部损失形态,不等同于最终精度。正式分析时,应结合 Precision、Recall、mAP、混淆矩阵和可视化结果一起判断。
9. 常见问题
为什么不是 epochs?
因为这个脚本不会重新训练模型,只是在已有权重附近做扰动并计算损失,所以控制计算次数的是 STEPS。
运行太慢怎么办?
把 STEPS 改成 5,把 MAX_BATCHES 改成 1,把 IMG_SIZE 改成 320。
显存不够怎么办?
把 BATCH 改成 1,或把 DEVICE 改成 cpu。
图不够平滑怎么办?
把 STEPS 从 9 提高到 21,并把 MAX_BATCHES 提高到 8 或 0。
只想用 yolo26n.pt 怎么写?
直接在顶部配置中写:
python
WEIGHTS_PATH = ROOT / r"yolo26n.pt"
DATA_PATH = ROOT / r"datasets\Aijiaojioashou\data.yaml"
10. 最简流程
- 打开
plot_loss_landscape.py。 - 修改
WEIGHTS_PATH和DATA_PATH。 - 修改
STEPS控制采样次数。 - 运行
python plot_loss_landscape.py。 - 打开
runs\loss_landscape\code_config_loss_landscape\loss_landscape_report.png。
最终最常用配置:
python
WEIGHTS_PATH = ROOT / r"yolo26n.pt"
DATA_PATH = ROOT / r"datasets\Aijiaojioashou\data.yaml"
STEPS = 9
RADIUS = 0.05
MAX_BATCHES = 4
BATCH = 2
IMG_SIZE = 640
DEVICE = "auto"