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

试过上述方法,却同样无效的小伙伴可以考虑:

这里我观察了临界值,打了90分钟的print,发现我的问题出在target上。

我的 target 计算公式,可能会得到 inf 的结果,导致无法正常的梯度下降。可以考虑:

  • 检查 target 是否正确;
  • 计算了 target 后,将其改为自己需要的值,如下。
target[target == float("Inf")] = 0

但请注意该方法在数学上的可行性。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐