【pytorch】反向传播遇到Nan的排查解决方式

news/2025/2/28 18:01:41/

在跑自己的课题时,突然发现自己的模型的最终输出全是[Nan,Nan,Nan…],这时候就开始了逐步的排查:
参考链接:https://blog.csdn.net/qq_41682740/article/details/126304613。
一般模型输出为Nan有这么几个原因:

  • 1.数据问题:输入数据中可能存在NaN或Inf(无穷大)的值,这可能会导致计算结果为NaN。建议检查输入数据,确保其数值范围正确。
  • 2.模型结构问题:模型中的某些层或操作可能会导致NaN的输出。例如,当计算log或sqrt等函数的负数时,会出现NaN。建议检查模型结构,确保模型中的所有操作都是数值稳定的。
  • 3.梯度问题:当模型的梯度变得非常大时,会导致计算结果为NaN。这可能是由于学习率设置过高或梯度爆炸导致的。建议检查学习率设置,或尝试使用梯度剪裁来控制梯度范围。
  • 4.数据类型问题:当数据类型不匹配时,会出现NaN。例如,在计算浮点数时使用整数类型的数据,或在计算整数时使用浮点数类型的数据。建议检查数据类型,确保输入和模型参数的类型匹配。

顺着思路一个一个找就可以了,我这里直接检查模型的梯度:

    for name, param in model.named_parameters():if param.requires_grad:print(name, param.data)if param.data!=param.data:    #Nan数据的判断方法之一print('Nan')

发现梯度中有很多的Nan的产生。使用torch.autograd.detect_anomaly() 可以方便定位报错的位置,使用方式如下:

with torch.autograd.detect_anomaly():#反向传播的部分代码optimizer.zero_grad()loss_all.backward()

该方式会大幅度减慢模型的运行速度,但pytorch会自动定位至初步产生Nan的地方,方便进行进一步的检查。
最终我遇到的问题是模型的数据类型不对,我用到的clip模型是一个FP16的,这种训练很容易导致溢出产生Nan的数据,故转成FP32即可:

 model.to(torch.float32)

http://www.ppmy.cn/news/51349.html

相关文章

【多线程】为什么不建议使用Executors来创建线程池?

目录 一、线程池类型1.1 固定数量的线程池1.2 单个线程线程池1.3 带缓冲的线程池1.4 延迟任务线程池 二、代码示例2.1 固定数量的线程池2.2 单个线程的线程池2.3 带缓冲的线程池2.4 延迟线程池 一、线程池类型 1.1 固定数量的线程池 1.创建的队列为LinkedBlockingQueue&#x…

C技能树:判断闰年

输入任意年份的正整数n&#xff0c;判断该年份是否为闰年。请选出错误答案。 闰年的定义&#xff1a;能被400整除的年份为闰年;能被4整除同时不能被100整除年份为闰年。 #include <stdio.h> int main(int argc, char** argv) {int year;printf("请输人年份&#x…

Linux网络基础

这篇博客我们将初步讲解网络中的一些基本概念&#xff0c;为后续套接字编程和的学习和对网络进行一步的了解打下一定基础。 目录 1.网络发展背景 2.IP地址 2.1内容 2.2本质 3.端口 3.1内容 3.2本质 4.协议 4.1内容 4.2分层 5.网络字节序 5.1引入 5.2内容 1.网络…

RabbitMQ--详情概述

一、消息队列(Rabbit Message Queue) 1、概念 消息队列是一种应用之间的通信方式&#xff0c;消息发送之后可以立即返回&#xff0c;由消息系统来确保消息的可靠传递。消息发布者只发布消息到MQ&#xff0c;消息使用者值从MQ中拿消息&#xff0c;两者不知道对方的存在。 简…

Java运行时内存管理

一、前言 希望能在我们平时开发写代码的时候&#xff0c;能够知道当前写的这段代码&#xff0c;内存方面是如何分配的。 我们深知&#xff0c;一个Java程序员在很多时候根本不用操心内存的释放&#xff0c;而是依靠JVM去管理&#xff0c;以前写C代码的时候&#xff0c;却要时刻…

掌握Linux字符设备驱动程序的核心要点

目录标题 Linux设备驱动程序的重要性 | Importance of Linux Device Drivers字符设备驱动程序概述 | Overview of Character Device Drivers Linux字符设备驱动程序的基本组件 | Basic Components of Linux Character Device Drivers文件操作结构体 | File Operations Structur…

Sharding-JDBC之垂直分库水平分表

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、订单表3.3、用户表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存订单数据5.4.2、查询订单数据5.4.3、保存用户数据5.4.4…

中国剩余定理在RSA解密中的效率提升逻辑

中国剩余定理&#xff08;Chinese Remainder Theorem&#xff0c;简称CRT&#xff09;是数论中的一项重要定理。它提供了一种方法&#xff0c;可以从一系列模不同整数的同余方程组中&#xff0c;找到一个整数解。CRT在密码学、计算机科学和工程中都有广泛应用。 假设我们有一组…