解决ultralytics的YOLO模型训练中验证集Loss为NaN(或mAP为0)的问题

前言

在使用ultralytics库的YOLO模型时,比如YOLOv8进行目标检测模型训练,遇到一个非常奇怪的问题:训练过程中的验证损失(loss)出现了NaN,而验证的评价指标如mAP50却能正常计算(有时mAP都也为0)。经过排查发现,这个问题和我的显卡(1660 Super)有关。本文记录了找到问题原因并解决的过程,供遇到类似问题的读者参考。

训练时在控制台打印的结果显示,训练集有正常显示loss,到验证时出现指标为0:

在这里插入图片描述
这时如果查看训练结果中的results.csv文件,出现下面的结果记录,显示val上的loss均为nan:

epoch,         train/box_loss,         train/cls_loss,         train/dfl_loss,   metrics/precision(B),      metrics/recall(B),       metrics/mAP50(B),    metrics/mAP50-95(B),           val/box_loss,           val/cls_loss,           val/dfl_loss,                 lr/pg0,                 lr/pg1,                 lr/pg2
    1,                 1.0528,                 4.0179,                 1.0164,                0.50566,                0.42115,                 0.4226,                0.31671,                    nan,                    nan,                    nan,              0.0033291,              0.0033291,              0.0033291
    2,                  0.975,                 2.3274,                0.99149,                0.87422,                0.84204,                 0.9524,                0.73884,                    nan,                    nan,                    nan,              0.0066075,              0.0066075,              0.0066075
    3,                0.99872,                 1.7083,                 1.0006,                0.86385,                0.92221,                0.97791,                0.75714,                    nan,                    nan,                    nan,              0.0098308,              0.0098308,              0.0098308
    4,                0.98629,                 1.4711,                 1.0027,                 0.9398,                0.96121,                0.98227,                0.74803,                    nan,                    nan,                    nan,              0.0097525,              0.0097525,              0.0097525
    5,                0.95163,                 1.1908,                0.98319,                0.93729,                0.97754,                0.98343,                0.77948,                    nan,                    nan,                    nan,                0.00967,                0.00967,                0.00967
    6,                0.91768,                0.97527,                0.96595,                0.94316,                0.98203,                0.98379,                0.78054,                    nan,                    nan,                    nan,              0.0095875,              0.0095875,              0.0095875
    7,                0.89667,                0.83439,                0.95954,                0.96266,                 0.9745,                0.98683,                0.77252,                    nan,                    nan,                    nan,               0.009505,               0.009505,               0.009505
    8,                0.88253,                0.76853,                0.95979,                0.93883,                0.98245,                0.98682,                 0.7814,                    nan,                    nan,                    nan,              0.0094225,              0.0094225,              0.0094225
    9,                0.87479,                0.70413,                0.95082,                  0.943,                0.97676,                0.98672,                0.77541,                    nan,                    nan,                    nan,                0.00934,                0.00934,                0.00934
   10,                 0.8639,                0.67849,                0.95247,                0.96784,                0.97556,                0.98666,                0.78711,                    nan,                    nan,                    nan,              0.0092575,              0.0092575,              0.0092575

如果按照这个情况,等训练结束不出意外会得到下面的损失曲线:

在这里插入图片描述

损失曲线的box_loss、cls_loss、dfl_loss均为空,显然有猫腻!


问题描述

在YOLOv8模型训练的过程中,验证集的损失项出现了NaN值,导致模型训练无法有效进行。NaN(Not a Number)值通常表明某些计算过程出错,可能是数据、配置或硬件兼容性引起的。

NaN值在训练过程中出现通常可能是由以下几个原因引起的:

  1. 数据集问题:验证集数据不完整或格式错误。
  2. 学习率过高:过大的学习率会导致模型参数波动过大,可能引发NaN。
  3. 硬件兼容性问题:某些显卡在训练过程中不完全兼容特定的训练设置或计算模式。

这里我试过排查学习率的问题,从打印的结果看开始时学习率很低,关键我运行在另一台电脑上(RTX4090显卡),同样的代码、环境,没有复现这个问题。结合显卡类型和模型训练的反馈信息,我重点排查了硬件兼容性问题。

解决方案

在查阅资料后,发现16系列显卡,如1660 Super显卡在启用AMP(Automatic Mixed Precision, 自动混合精度)时容易引发NaN问题。混合精度训练会将一部分计算精度降低以加速训练,但可能会在不完全支持的显卡上导致损失计算异常。针对这一情况,以下是具体的解决步骤。

1. 禁用AMP功能

在YOLOv8的配置文件和代码中,将AMP功能关闭,以避免精度导致的计算问题。

(1)修改配置文件
打开YOLOv8的训练代码,在调用YOLO训练时,指定AMP设置,修改为False

    # 加载预训练的YOLOv8模型并开始训练
    model = YOLO(model_path, task='detect')
    results2 = model.train(
        data=data_path,  # 指定训练数据的配置文件路径
        device=device,  # 自动选择进行训练
        workers=workers,  # 指定使用的工作进程数量
        imgsz=imgsz,  # 指定输入图像的大小
        epochs=epochs,  # 指定训练的epoch数
        batch=batch,  # 指定每个批次的大小
        name=train_name,  # 指定训练任务的名称
        amp=False
    )

也就是增加一个参数设置,如下图所示:

在这里插入图片描述

(2)修改验证器代码

打开ultralytics/engine/validator.py文件,注释掉强制使用FP16精度的代码行:

# self.args.half = self.device.type != 'cpu'  # 注释掉以防止验证过程中强制使用FP16

这个代码的位置大概就是下面的样子,跟你的ultralytics这个库的版本有关系,代码可能有些差别:

在这里插入图片描述

2. 验证配置变更

完成上述修改后,重新运行YOLOv8的训练代码,并观察验证集损失是否仍然为NaN。我的训练日志显示,NaN问题已成功解决,验证损失能够正常显示数值。

在这里插入图片描述

这时再看results.png可以发现,它val的loss重新有值了:

在这里插入图片描述

从数值上看,loss也是有值的:

在这里插入图片描述

3. 结果分析

在禁用AMP后,YOLOv8的训练过程变得稳定,验证集损失再未出现NaN的问题。通过分析,我总结出在某些显卡(如GTX 16系列)上,AMP功能可能导致精度计算问题,特别是在YOLOv8这类对计算精度敏感的模型中。关闭AMP后,可以牺牲少量训练速度来获得更稳定的结果。

总结

遇到类似问题的读者可以参考以下调试步骤:

  1. 检查数据集是否完整,排除格式错误。
  2. 调整学习率,以避免梯度爆炸。
  3. 根据硬件配置调整AMP设置,特别是对于GTX 16系列显卡用户,建议禁用AMP。

希望这篇记录能帮助到和我一样使用1660 Super显卡且遇到NaN问题的用户。禁用AMP是一个有效的解决方案,可以提升YOLOv8的训练稳定性,确保模型能正常训练并获得有效结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912020.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信支付现金红包,实现转账到零钱包功能

大家好,我是小悟。 上次说到微信商家转账到零钱要出新玩法,可能会对某些特定的业务产生影响,详细请阅读【微信商家转账到零钱新玩法,却是个不好接受的消息】。 微信支付还有个现金红包的产品,也可以实现转账到用户零…

掌握均值回归,外汇交易盈利新视角

外汇交易是全球金融市场的重要组成部分,它不仅用于国际间结算债权债务,还提供了一个充满盈利机会的金融市场。在这个市场中,货币价格的波动为投资者带来了丰富的交易机会。本文,EagleTrader将详细介绍外汇交易中的一种常用策略——…

mac-泛洪

泛洪攻击的类型 TCP SYN Flood: 攻击者向目标服务器发送大量的 TCP SYN 请求,但不完成握手过程。服务器为每个请求分配资源,最终可能耗尽其连接表,导致无法处理正常请求。 UDP Flood: 攻击者向目标发送大量的 UDP 数据…

【Windows修改Docker Desktop(WSL2)内存分配大小】

记录一下遇到使用Docker Desktop占用内存居高不下的问题 自从使用了Docker Desktop,电脑基本每天都需要重启,内存完全不够用,从16g扩展到24,然后到40G,还是不够用;打开Docker Desktop 运行时间一长&#x…

【06】A-Maven项目SVN设置忽略文件

做Web项目开发时,运用的是Maven管理工具对项目进行管理,在项目构建的过程中自动生成了很多不需要SVN进行管理的文件,SVN在对源码进行版本管理时,需要将其忽略,本文给出了具体解决方案。 SVN设置忽略Maven项目中自动生成…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市生活服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、…

【算法】Floyd多源最短路径算法

目录 一、概念 二、思路 三、代码 一、概念 在前面的学习中,我们已经接触了Dijkstra、Bellman-Ford等单源最短路径算法。但首先我们要知道何为单源最短路径,何为多源最短路径 单源最短路径:从图中选取一点,求这个点到图中其他…

【商用存储】希捷磁盘阵列部署实践

文章目录 一、前言1、盘阵类型2、性能规格 二、功能说明1、RAID配置1.1、虚拟池(virtual pool)1.2、线性池(linear pool) 2、磁盘休眠2.1、RBOD2.1.1、功能说明2.1.2、规格限制 3、ADAPT配置3.1、说明3.2、规格限制3.3、配置建议3…

Android Room框架使用指南

Room框架使用指南 项目效果创建应用,配置Gradle1、在app Module的build.gradle配置kapt插件2、配置依赖:3、配置依赖包版本号创建实体类创建DAO1、DAO简介2、WordDao设计以及相关注解说明3、监听数据变化添加Room数据库1、Room数据库简介2、实现Room数据库实现存储库实现View…

Read excerpt(eighteen)——The hidden value of Corporate Social Responsibility

“There is one and only one social responsibility of businesses,” wrote Milton Friedman, a Nobel prize-winning economist, “That is, to use its resources and engage in activities …

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc:类似 android 系统的 adb 命令,提供设备信息查询,包管理,调试相关的命令ohos.UiTest:鸿蒙 sdk 的一部分,类似 android sdk 里的uiautomator,基于 Accessibility 服务&…

基于java宠物医院管理系统的设计与实现

一、环境信息 开发语言:JAVA JDK版本:JDK8及以上 数据库:MySql5.6及以上 Maven版本:任意版本 操作系统:Windows、macOS 开发工具:Idea、Eclipse、MyEclipse 开发框架:SpringbootHtmljQueryMysql…

施工企业为什么要用工程项目管理软件?工程项目管理软件的用处是什么?

施工企业一定会遇到哪些问题?工人怠工、材料浪费、数据造假、工期拖延、质量问题、安全隐患等。这些问题正在悄然侵蚀建施工业的经济效益。每一个环节的失控都可能导致巨大的经济损失,还可能损害企业的声誉。面对日益复杂的工程管理环境,如何…

业务模块部署

一、部署前端 1.1 window部署 下载业务模块前端包。 (此包为耐威迪公司发布,请联系耐威迪客服或售后获得) 包名为:业务-xxxx-business (注:xxxx为发布版本号) 此文件部署位置为:……

【Web前端】OOP编程范式

面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计思想,它通过将程序视为一组相互作用的对象来设计程序。OOP 提出了一些重要的基本概念,包括类与实例、继承和封装。面向对象编程将系统视为由多个对象…

C++入门基础知识142—【关于C++ 友元函数】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 友元函数的相关内容! 关于…

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …

vue实现图片无限滚动播放

本人vue新手菜鸡,文章为自己在项目中遇到问题的记录,如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue,本想着看看能不能用一些element的组件实现图片的轮播效果,尝试使用过element-UI里的走马灯Carouse&#x…

python画图|灵活的subplot_mosaic()函数-初逢

【1】引言 前述学习进程中,对hist()函数画直方图已经有一定的探索。然而学无止境,在继续学习的进程中,我发现了一个显得函数subplot_mosaic(),它几乎支持我们随心所欲地排布多个子图。 经过自我探索,我有一些收获&am…

ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?

ODOO是一款开源的企业管理软件套件,广泛应用于企业管理中。它由比利时的Odoo S.A.公司开发,最初名为OpenERP,现在已经成为全球流行的ERP解决方案之一。ODOO集成了ERP、CRM、电子商务和CMS等多种功能模块,适用于各种规模的企业应用…