问题:
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版本了。这个解决办法的原理,就是把显卡半精度浮点型数据改为单精度的浮点型去运算。这样虽然精度高了,但是训练时长也相应会增加一些、显存占用也会增加一些,但是,这样总比不能训练和不能检测要好些吧。
标签:loss,Yolov5,训练,map,py,train,CUDA,版本,half From: https://www.cnblogs.com/wzzdo/p/17461600.html