RuntimeError: CUDA error: device-side assert triggered以及.../ATen/native/cuda/Loss.cu:102: operator():... Assertion `input_val >= zero && input_val <= one` failed错误的解决方法
【Debug 记录】RuntimeError: CUDA error: device-side assert triggered以及.../ATen/native/cuda/Loss.cu:102: operator():... Assertion `input_val >= zero && input_val <= one` failed错误
具体报错信息:
【 解决过程】
程序会报这种错误,在网上查找了许久,改了学习率、改了pytorch版本都没有用,类别标签什么的也没有错误。
最后终于发现了一个同样也出现device-side assert triggered和Loss.cu:102错误的解决方案https://blog.csdn.net/weixin_43590796/article/details/115714248,之前找的那些解决方案里的报错信息的Loss.cu:102的值并不是102,根据这位作者给出的解决方法,检查了报错信息,发现也是最后计算BCEloss时出现了错误,也是由于输入的值为nan导致后面进行计算的数也为nan。
同样我也是在原来别的代码上进行了修改,所以出现的错误应该也与自己添加的那部分代码有关,然而一样去修改了优化器的参数,把不该训练的模块参数过滤掉之后,程序虽然不会再在还未训练就报这个错误了,但是在进行一些epoch的训练后依然报了这个错误,而且训练的速度非常慢,中间训练的结果也很差,基本上mAP为0。
所以只能一步步地调试看到底哪一部分有问题,然后发现添加了自己模块后的输出(我的模块添加在原模块前面)同原模块的输入值的范围不一样,即原输入值为0-256范围变为了0-无穷的范围,所以在网络的最开始又添加了一个归一化的操作image=image/255. ,使之后所有值的范围都为0-1,最后再还原就行。这样改了之后训练就没有报错了,训练时间也正常了。
【反思】
这次改代码真是历经艰辛(好吧,是我太菜了),因为是从tensorflow改到pytorch所以很多都得同等代换不说,两者输入图像各维度代表的含义还是不对应的,tensorflow里为[B,H,W,C],pytorch里为[B,C,H,W],其次最开始改代码的时候由于对pytorch没有全部弄明白,所以在修改代码时不知如何添加模块,重新学了之后才知道应该将要添加的模块继承nn.Module类,同时不进行优化的tensor还应该使用nn.Parameter(,requires_grad=False)或register_buffer将其送入cuda同时还不进行优化,避免模型加载时参数不一致的问题。总的来说,要对模型进行修改时,除模块本身外,还需要特别注意处理前后数据维度、值的范围的变化,模型对数据的各种增强处理、预处理等等也需要注意,优化器输入的参数也需注意。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签