yolov8 出现loss 为nan

原因:

  混合精度训练是一种通过同时使用 FP16 和 FP32 精度来加速深度学习训练的技术。它可以在不损失模型性能的情况下,显著减少训练时间和内存使用。下面是关于混合精度训练的一些解释:

1. 原理

        混合精度训练利用了 FP16 (16位浮点)和 FP32 (32位浮点)的不同特性。

        FP16 计算速度快,但动态范围和精度较低。FP32 则相反,计算速度较慢但动态范围和精度较高。

        混合精度训练将网络的某些部分(如权重和激活)使用 FP16 表示,而其他部分(如梯度)使用 FP32 表示。这样可以在不损失模型性能的情况下,提高训练速度和减少内存使用。

        Float16 (FP16) 和 Float32 (FP32)的差异:

                FP16 使用 16 bit 表示浮点数,FP32 使用 32 bit。

                FP16 的动态范围和精度较 FP32 更小,但计算速度更快,尤其在 GPU 上。

                FP16 可能会产生溢出和下溢出,导致精度损失。需要特殊处理来避免这些问题

2. 实现

        常见的混合精度训练库包括 NVIDIA 的 APEX 和 PyTorch 内置的 torch.cuda.amp 模块。

        使用时,需要将模型和优化器包装在 FP16 和 FP32 混合精度上下文中,并使用特殊的损失缩放和梯度重scaling技术。

例如在 PyTorch 中,可以使用如下代码启用混合精度训练:

3. 混合精度训练的流程

        将网络中的部分操作使用 FP16 表示,其他部分使用 FP32 表示。通常权重和激活使用 FP16,梯度和损失函数使用 FP32。

        需要使用 loss scaling 技术来避免 FP16 计算时的精度损失。

        在反向传播时,需要使用 gradient scaling 和 gradient clipping 技术来确保梯度的稳定性。

4. 优势

        训练速度提高 2-3 倍

        内存使用降低 2 倍左右

        无需修改原有的训练代码,只需添加少量混合精度相关的代码

        总之,混合精度训练是一种非常实用的技术,可以大幅提高深度学习模型的训练效率,是深度学习从业者必须掌握的技能之一。

这篇博客警示读者在购买用于深度学习的显卡时要避开那些导致RuntimeWarning: All-NaN slice encountered的问题。作者强调这些Tensor核心存在严重缺陷,不适宜进行深度学习任务,建议大家在选购时务必谨慎。

*****方法一:降低cuda和pytorch 版本号

pip3 install torch==1.10.2+cu102 torchvision==0.11.3+cu102 torchaudio===0.10.2+cu102 -f https://download.pytorch.org/whl/cu102/torch_stable.html
最终版本为:
torchvision-0.11.3+cu102-cp39-cp39-win_amd64.whl
torchaudio-0.10.2+cu102-cp39-cp39-win_amd64.whl
torch-1.10.2+cu102-cp39-cp39-win_amd64.whl或者:
pip3 install torch==1.9.1+cu102 torchvision==0.10.1+cu102 torchaudio===0.9.1 -f https://download.pytorch.org/whl/torch_stable.htmlpip3 install torch==1.9.1+cu102 torchvision==0.10.1+cu102 torchaudio===0.9.1 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com原文链接:https://blog.csdn.net/a2609437730/article/details/120637849
最终的版本为python39:
torchaudio-0.9.1-cp39-cp39-win_amd64.whl
torch-1.9.1+cu102-cp39-cp39-win_amd64.whl
torchvision-0.10.1+cu102-cp39-cp39-win_amd64.whl

如上所示:loss、MAP为nan可解决。

强烈推荐 方法一

方法二:将混合精度训练AMP 设置为False

第一步:找到ultralytics\cfg\default.yaml中的default.yaml文件
将default.yaml中的amp设置为false,如下所示:amp: False # (bool) Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check将default.yaml中的half设置为false,如下所示:half: False  # (bool) use half precision (FP16)第二步:找到ultralytics\engine\validator.py中的validator.py文件,如下所示:将self.args.half = self.device.type != 'cpu' # force FP16 val during training这行代码注释掉# self.args.half = self.device.type != 'cpu'  # force FP16 val during training修改之后的代码为:self.training = trainer is not Noneaugment = self.args.augment and (not self.training)if self.training:self.device = trainer.deviceself.data = trainer.data# self.args.half = self.device.type != 'cpu'  # force FP16 val during trainingmodel = trainer.ema.ema or trainer.modelmodel = model.half() if self.args.half else model.float()if hasattr(model, 'criterion'):if hasattr(model.criterion.bbox_loss, 'wiou_loss'):model.criterion.bbox_loss.wiou_loss.eval()# self.model = modelself.loss = torch.zeros_like(trainer.loss_items, device=trainer.device)self.args.plots &= trainer.stopper.possible_stop or (trainer.epoch == trainer.epochs - 1)model.eval()

在使用GTX16xx系列显卡训练YOLO系列模型时,可能会遇到训练过程中loss出现nan值或者测试时P/R/map全部为0的问题。这些问题通常是由于显卡硬件和软件配置不当导致的。为了解决这些问题,可以尝试以下几种方法:

  1. 调整学习率:学习率过高可能导致训练过程中的数值溢出或下溢,从而产生nan值。可以尝试减小学习率,以避免这种情况的发生。
  2. 增加梯度下降的步长:在某些情况下,梯度下降的步长过小可能导致训练不稳定,产生nan值。可以尝试增加步长,以提高训练的稳定性。
  3. 开启梯度检查:在训练过程中,可以开启梯度检查来检测梯度的合理性。如果发现梯度不合理(例如梯度过大或过小),可以采取相应的措施进行调整。
  4. 检查数据集:数据集的质量对模型的训练至关重要。如果数据集中存在噪声或异常值,可能会导致训练不稳定或产生nan值。因此,需要仔细检查数据集的完整性、标注的准确性等。
  5. 更新显卡驱动和CUDA版本:显卡驱动和CUDA版本过旧可能导致与YOLO系列模型的兼容性问题。尝试更新到最新版本的驱动和CUDA,以解决潜在的兼容性问题。
  6. 检查模型结构和参数:有时候,模型的结构或参数设置不当也可能导致训练不稳定或产生nan值。可以尝试调整模型的结构或参数,以找到最优的设置。
  7. 使用混合精度训练:混合精度训练是一种提高训练速度的方法,它使用float16和float32两种数据类型进行训练。然而,在某些情况下,混合精度训练可能会导致数值不稳定性,产生nan值。在这种情况下,可以尝试关闭混合精度训练,只使用float32数据类型进行训练。
  8. 检查代码实现:在某些情况下,代码实现可能存在错误或不当之处,导致训练或测试过程中出现问题。仔细检查代码实现,确保符合YOLO系列模型的规范和要求。
    如果尝试了以上方法仍然无法解决问题,可以考虑使用其他版本的YOLO系列模型或更换其他型号的显卡进行训练和测试。同时,也可以参考相关社区和论坛中其他用户的经验和解决方案,以获取更多的帮助和建议。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——贪心算法

860. 柠檬水找零 - 力扣(LeetCode) 这道题目乍一看可能没有什么头绪,但是当你仔细想想就会明白一个道理,那就是,《论电子支付的重要性》哈哈哈哈,言归正传,其实很简单无非就是找钱,…

Alembic:python中数据库迁移的瑞士军刀

Alembic 简介 Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成,还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史,确保数据库的版本与应用代码…

linux内核 时间同步机理分析笔记

1 内核时间管理的相关组件 1.1 clocksource 和 clock_event_device 1.1.1 简介 外部时钟设备的主要作用是提供精确的计时功能和定期产生中断的功能,内部把提供精确计时的功能抽象为clocksource对象,把定期产生中断的功能抽象为clock_event_device对象…

微信支付流程

1. 创建订单 请求创建订单的 API 接口:把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果:订单编号 2.订单预支付 请求订单预支付的 API 接口:把步骤1得到的 订单编号 发送到服务器服务器响应的结果:…

P9145 [THUPC 2023 初赛] 世界杯

[题目通道]([THUPC 2023 初赛] 世界杯 - 洛谷) 简要题意:输出五常中的最强球队。 众所周知,每个国家的球队都有自己的长处,在不同规则下最强球队也有所不同。而小 M 制定的规则是输球场数最少,这是有道理的,因为输球…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑,一剑破长空。 8月20日10点,《黑神话:悟空》正式开服,同时轰动了国内外游戏圈子,冲顶国内各大社媒平台,一天包揽120个热搜。上线之后,《黑神话:悟空》火速登顶Steam热销游…

网络通信编程UDP/TCP

一、不同体系结构间的互联互通 通信本质:不同主机上进程间的通信。通过 IP 标识网络中的一台主机,本质上是 32 位的整型数据;通过端口号标识某个进程,本质上是 16 位的整型数据。网络模型:主要有 C/S(客户…

克服编程学习中的挫折感:从心态到策略的全方位指南

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一、心态调整:积极乐观,合理期望 二、学习方法:有效策…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目(java-all-in-one)项目里,我们提到了使用Gradle作为项目构建工具。看到这里,不知道你是否有疑惑,什么是项目构建工具。Java项目常用构建工具有哪些?都有什么特点? 带着疑惑&…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…

ETL开发团队应对突发技术故障和危机的策略

建立有效的监控和警报系统 首先,建立有效的监控和警报系统是应对突发技术故障和危机的重要步骤。通过监控ETL流程和相关系统的关键指标,例如数据传输速度、资源利用率和错误日志,您可以提前发现潜在的问题。设置警报机制,及时通知…

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律:当k大于等于链表中节点总数n时,会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时,无论k的值为多少都可以…

C程序设计——常量后缀

本节内容,如果感觉学的比较吃力,可以最后再翻回来看。 上一节,我们讲了两种常量,在这里我个人给他们起名字,分别叫做数值常量、名称常量。 下面这些是数值常量: // 下面是数值常量 987; 0123; 0xba9; 6.…

关于HTTP HEAD介绍

一、HTTP HEAD介绍 HTTP HEAD 是一种 HTTP 请求方法,它用于请求服务器返回指定资源的元信息(metadata),而不包括响应体的内容。这种请求方式常用于客户端预先评估资源的大小、最后修改日期或其他头信息,而无需实际下载…

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…

Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录 一、部署alertmanager相关组件1.alertmanager-config2.alertmanager-message-tmpl3.alertmanager 二、调试邮件告警三、钉钉群/企业微信群 报警3.1添加钉钉群机器人3.2添加企业微信群机器人3.3部署alertmanager-webhook-adaptermessage-tmplalertmanager-webhook-adap…

Vue组件命名报错 Component name “index“ should always be multi-word

原因 在Vue创建组件时我们往往会使用 index.vue 之类来命名,但是此时组件会报错【Component name "index" should always be multi-word】,组件名应该总是为多个单词组成。这是因为官方文档建议组件名写成驼峰式或者-衔接的形式&#…

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP(Hypertext Preprocessor)超文本预处理器是一种开源的通用脚本语…

哈希环算法(C语言版本)

文章目录 理论分析:经典案例案例一:开放寻址法案例二:经典哈希环算法案例总结 理论分析: 所谓的哈希环就是就是数据结构里面的数组,只不过我们通过设置使其首尾相连,而这个数组又非常的大,这些…

设计模式实战总结与Java程序员学习路线图

经过一系列的设计模式实战练习,从在线购物系统到旅行预订系统,本专栏已涵盖了多种常用设计模式的应用与实现。本文将对整个专栏进行总结,并为Java程序员提供一份学习路线图,帮助更好地规划未来的学习与职业发展方向。 一、设计模式学习总结 本专栏分为26篇文章,内容涵盖…