YOLO训练正常,但验证时各指标都为0?

经过排查后发现,在验证时本来正常的张量经过BatchNormal 层后就输出nan了

问题描述

最近在对yolov5进行一些改动,想参照IA-YOLO对yolov5做一些改动,感兴趣可以看看(IA-YOLO)。在改动的过程中还是遇到不少问题的,困扰我最久的就是这个BatchNormal层的问题。
可以看到训练时比较正常,但验证时最后得到的P、R等指标都为0,就说明对验证集检测根本无法进行检测。可以看到训练时比较正常,但验证时最后得到的P、R等指标都为0,就等于对验证集检测根本无法进行

问题排查

在阅读了Pytorch训练模型损失Loss为Nan或者无穷大(INF)原因这篇博客后,经过排查,最后将问题锁定在BatchNormal层,发现一到验证集时,网络中的BatchNormal层就输出nan,同时其中的running_mean以及running_var也是nan
Batchnoraml层

问题分析

造成这种情况的原因有以下几种

  1. 验证集和训练集有不同的分布 ,就如图那篇博客所说的,但其实我不是很理解,验证集和训练集一般都是随机划分,或者直接用现有的数据集,为什么会出现不同分布的情况;我抱着试一试的心态将验证集中的数据用训练集替代,还是出现nan,说明不是这个原因
  2. 调整momentum ,试了也没用;
  3. 设置track_running_stats=False,可以解决我的问题,但这样并不是BatchNormal层正常运行状态
  4. BatchNormal层接收了异常输入 ,这是我的代码的问题所在,应该也是大部分BatchNormal层出现问题的原因;我的程序在训练时会有一个全零张量的输入来计算类似计算图尺寸的步骤,当这个张量通过我的一系列预处理步骤后会变成nan,当这个输入到BatchNormal层的时候就会得到nan, 而在训练时BatchNormal层一旦出现nan后续的值将一直为nan。
    至于最后为什么nan只出现在验证时,而训练时一切正常,可以参考pytorch BatchNorm参数详解,计算过程
### 配置YOLO验证过程以仅输出总性能指标 为了使 Ultralytics YOLO验证过程仅显示总体指标效果,可以修改验证脚本中的配置文件或者命令行参数来控制输出内容。具体方法如下: #### 修改验证命令或配置文件 通过设置 `--save-txt` 或其他不必要的保存选项为假,并确保只启用必要的评估参数。对于只想查看最终的整体性能指标(如 mAP50、mAP75 和 mAP50-95),可以在运行验证时指定特定的参数组合[^1]。 ```bash yolo val data=coco.yaml model=yolov8n.pt task=detect save_json=False verbose=True ``` 上述命令中: - `data`: 数据集配置路径。 - `model`: 使用的预训练模型权重文件。 - `task`: 执行的任务类型,这里是目标检测。 - `save_json=False`: 关闭 JSON 结果保存功能,减少冗余输出。 - `verbose=True`: 开启详细模式以便于调试;如果只需要最终结果,则可设为 False 来进一步简化输出。 此外,在代码层面也可以调整验证函数内部的行为逻辑,比如编辑源码中的回调机制或日志记录部分,使得程序在完成全部测试案例处理之后再统一打印一次汇总统计信息即可。 #### 自定义回调函数 另一种方式是在不改变原有框架结构的前提下自定义回调函数,拦截中间状态更新并阻止其向标准输出流发送消息,直到整个验证流程结束才一次性报告全局表现得分。 ```python from ultralytics import YOLO def custom_callback(validator, metrics): # 只有当所有图片都被处理完毕后才会触发此回调 if validator.seen == len(validator.dataloader.dataset): print(f'\nmAP@0.5: {metrics["map50"]:.3f}, ' f'mAP@0.75: {metrics["map75"]:.3f}, ' f'mAP@[0.5:0.95]: {metrics["map"]: .3f}') # 加载模型实例化对象 model = YOLO('path/to/model') # 设置验证器及其回调 val_runner = model.val(data='coco.yaml', callbacks={'on_val_end':custom_callback}) ``` 以上两种方案都可以实现仅展示整体性能的效果,选择哪种取决于个人偏好以及项目需求的具体情况。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值