首页 > 其他分享 >Yolov5训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法

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

时间:2023-06-06 20:12:07浏览次数:52  
标签:loss Yolov5 训练 map py train CUDA 版本 half

问题:

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

相关文章

  • 【python】threading模块之Semaphore
     threading模块之Semaphoreimportthreadingimporttimeimportrandom#Theoptionalargumentgivestheinitialvaluefortheinternalcounter;#itdefaultsto1.#Ifthevaluegivenislessthan0,ValueErrorisraised.semaphore=threading.Semaphore(0)......
  • JDK 1.6 与 1.8 中的 ConcurrentHashMap 学习
    ConcurrentHashMap使用segment(继承ReentrantLock)和volatile来保证线程安全性segment的数量为16,每个segment中桶(HashEntry[])的数量可以增加,桶中放的是由HashEntry组成的链表;count表示segment中元素的数量,modCount统计导致结构变化操作的次数(put、remove、replace......
  • yolov5项目cuda错误解决
    CUDA报错解决#报错详情AssertionError:CUDAunavailable,invaliddevice0requested查看cuda版本先看一下电脑是否支持GPU,打开任务管理器就能查看(ctrl+shift+esc)#cmd命令nvcc--version#如果上面命令不是内部或外部命令,也不是可运行的程序,就输入下面的命令NVIDIA-......
  • 8. 自定义映射resultMap
    ‍在Mybatis中,resultType和resultMap都用于定义查询结果的映射关系。它们的使用场景如下:resultTyperesultType用于指定返回结果的数据类型,通常用于返回简单类型的结果以及返回vo或dto等自定义类型的结果。例如:‍<selectid="findUserById"parameterType="int"r......
  • Semaphore 类 的使用理解C#
    示例下面的代码示例创建一个信号量,其最大计数为3,初始计数为零。该示例启动五个线程,这会阻止等待信号量。主线程使用Release(Int32)方法重载将信号量计数增加到其最大值,从而允许三个线程进入信号量。每个线程使用Thread.Sleep方法等待一秒,以模拟工作,然后调用Release()方法......
  • win10,vs2015深度学习目标检测YOLOV5+deepsort C++多目标跟踪代码实现,源码注释,拿来即
    int8,FP16等选择,而且拿来即用,自己再win10安装上驱动可以立即使用,不用在自己配置,支持答疑。自己辛苦整理的,求大佬打赏一顿饭钱。苦苦苦、平时比较比忙,自己后期会继续发布真实场景项目;欢迎下载。优点:1、架构清晰,yolov5和sort是分开单独写的,可以随意拆解拼接,都是对外接口。2、支持答疑......
  • maplibre-gl加载天地图影像
    要在MapLibreGL中加载天地图的影像底图,需要使用天地图的瓦片服务URL,并将其添加为栅格图层。以下是一个示例代码片段,展示如何在MapLibreGL中加载天地图的影像底图://创建地图实例varmap=newmaplibregl.Map({container:'map-container',//替换为你的地图容器的......
  • [重读经典论文] RetinaNet——Focal Loss for Dense Object Detection
    1.前言这篇论文也是何凯明的团队在2017年的论文《FocalLossforDenseObjectDetection》中提出的,网络架构魔改了FPN,因此这篇论文的重点是提出了新的分类Loss——FocalLoss,用一个合适的函数,去度量难分类和易分类样本对总的损失函数的贡献。解决了传统交叉熵损失函数因为类别......
  • Semaphore 的使用
    varworkerSemphore=newSemaphore(0,800000);varIsWorkThreadCreated=true;varworkThread=newThread(()=>{Console.WriteLine("XiaoweiSDK.CreateWorkerThreadcreated!");......
  • go map gc的测试代码
    **本文章由githubcopilot协助生成**遇到一个离职同事写的代码,如下:```gopackagemapGCfuncmapGc(){lock:=sync.Mutex{}gofunc(){for{time.Sleep(12*time.Hour)tmp:=make(map[string]interface{})lo......