【解决方案】pytorch中loss变成了nan | 神经网络输出nan | MSE 梯度爆炸/梯度消失
最近在跑一个项目,计算loss时用了很普通的MSE,在训练了10到300个batch时,会出现loss tensor([[nan nan nan nan]]类似的情况。对这个异常的loss进行梯度下降,会导致net的输出变为nan。在网上查了解决方案,都不好用。
·
loss_func = nn.MSELoss()
loss = loss_func(val, target)
最近在跑一个项目,计算loss时用了很普通的MSE,在训练了10到300个batch时,会出现loss tensor([[nan nan nan nan]]类似的情况。对这个异常的loss进行梯度下降,会导致net的输出变为nan。在网上查了解决方案,都不好用:
- 学习率过大;
loss过小(或者说除以了0 / 计算了log(0));- 存在脏数据输入
NaN。
试过上述方法,却同样无效的小伙伴可以考虑:
- 自己手写
loss function,在临界值处改为线性函数,知乎链接:【PyTorch】梯度爆炸、loss在反向传播变为nan; - 或者参考我下面的方案。
这里我观察了临界值,打了90分钟的print,发现我的问题出在target上。
我的 target 计算公式,可能会得到 inf 的结果,导致无法正常的梯度下降。可以考虑:
- 检查
target是否正确; - 计算了
target后,将其改为自己需要的值,如下。
target[target == float("Inf")] = 0
但请注意该方法在数学上的可行性。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)