Yolov5训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法

发布时间 2023-06-06 20:09:50作者: 任竹

问题:

train训练得出的P\R\map全部为0

上网寻找寻找答案,大部分给出的原因解释如下:

①文件夹格式(名称和架构)有问题,这属于基本内容,不应该出错的。

②pytorch和cuda版本不对应。关于这部分可以参考链接:https://blog.csdn.net/jhsignal/article/details/111401628  和  https://www.jianshu.com/p/c184e270b8d4
 
  针对第2项内容,我从cuda最新版本12.1,降低到与pytorch契合的对应版本11.8,但train发现结果依旧是0,很明显不是这个原因。
YOLOv5   2023-5-12  Python-3.11.2  torch-2.0.1+cu118  CUDA:0 (NVIDIA GeForce MX450, 2048MiB)
Setup complete  (8 CPUs, 15.7 GB RAM, 29.0/300.6 GB disk)
以上是我的软件版本和配置参数,其实pytorch官网上最高支持11.8版本的CUDA,其实社区里已经给出回复,支持最高版本的CUDA,也就是12.1,所以我笔记本CUDA的降级是多余的,并且反复安装nvidia的cuda给我的C盘容量减少了4G,很是心疼。
  以上这段内容是针对第2项内容测试结果,失败。
 
解决方案:
参考此篇作者给出的教程:https://blog.csdn.net/weixin_55249340/article/details/125855686
问题原因:
由于NVIDIA 官方的一些软件问题,导致了PyTorch里面一些
具体解决方案:
1、_amp注释掉直接把amp赋值为False,如下图:

2、这样做之后在运行train.py发现训练时就不会有nan值了。如果还有,那就应该就关闭这篇博客了,考虑下其他方法了。

     然后,你就会发现validation时会出现P/R/map全部为0。然后你就继续在train.py里面搜索half关键字,把所有有.half()变为.float(),如下图:

 到这一步为止,我train时出现为nan和0的问题已经解决了。

 3、如果发现问题依旧没有解决,还需要在val.py里面将所有的half改为False,同时im.half() if half else im.float() 改为 im.float()。如下图:

以上3步完成之后,再次运行train.py发现没有问题了。

正确的Train结果截图:

 以上是yolov5的训练出现问题的解决方案。

以下是链接里作者在yolov7训练时遇到的同样问题,放在这里供给参考。

经测试,train.py没有问题,主要还是在detect.py里面有问题。主要还是把每个地方.half()改为.float()或者把half赋值为False,如下图:

 小结:

  利用其他人的话来总结一下,其实,归根究底就是NVIDIA对GTX16xx相关CUDA包有问题,有其他人说吧PyTorch版本降为1.10.1和CUDA 10.2,我也试过,确实能解决问题,但是训练时长长了很多,而且现在PyTorch官方已经不怎么支持使用CUDA 10.2版本了。这个解决办法的原理,就是把显卡半精度浮点型数据改为单精度的浮点型去运算。这样虽然精度高了,但是训练时长也相应会增加一些、显存占用也会增加一些,但是,这样总比不能训练和不能检测要好些吧。