pytorch训练时前一次迭代的loss正常后一次迭代却报nan
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch训练时前一次迭代的loss正常后一次迭代却报nan相关的知识,希望对你有一定的参考价值。
参考技术A问题描述:训练一个有四个阶段模型的网络(可以简单理解每一阶段就是一个卷积层),每阶段输出都会进行loss计算。现将pytorch原始的ce loss改为focal loss后,网络训练了数个迭代后loss 报nan。输入数据检查过没有问题,报nan时的前一个迭代的loss是正常的。报nan的当前迭代,第一个阶段所有的卷积参数都已经是nan了。
将所有反向梯度打印出来,发现第一个阶段的所有参数梯度为nan,其它正常。
采用toch.autograd.detect_anomaly()发现loss报错为“RuntimeError: Function \'LogBackward\' returned nan values in its 0th output”
说明是在第一阶段计算focalloss时,bp出现了nan。
因为focal loss计算的时候采用了gather,选取了对应label类别的概率来计算loss。
https://github.com/pytorch/pytorch/issues/46225
类似的
避免loss计算出现inf这种结果,如将preds_logsoft = torch.log(preds_softmax)替换为preds_logsoft = torch.log(preds_softmax+1e-8)
以上是关于pytorch训练时前一次迭代的loss正常后一次迭代却报nan的主要内容,如果未能解决你的问题,请参考以下文章