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的主要内容,如果未能解决你的问题,请参考以下文章

8.提升方法AdaBoost

matlab中后一次循环把前一次循环产生的数组覆盖掉怎么解决

PyTorch:模型训练-模型参数parameters

PyTorch:模型训练-模型参数parameters

pytorch结构化封装:线性与逻辑回归

pytorch模型训练之 loss function选择