最近在复现一个图像分割的小项目,用PyTorch写的时候,训练到第3个epoch左右loss就突然变成NaN了,学习率已经调到1e-4还是这样。同样的数据和网络结构,我用TensorFlow(Keras)跑就完全正常,loss一直稳定下降。检查了输入数据没有脏数据,也试过加梯度裁剪,但还是会NaN。想问下大家,PyTorch和TensorFlow在默认的梯度计算或初始化上有什么容易踩的坑吗?比如BN层或者Adam的eps设置?还是说我的loss函数(Dice+BCE)在PyTorch里需要特殊处理?实在有点迷茫,求指点。
楼主
2026-09-23
PyTorch训练时loss突然变NaN,换TensorFlow就没问题,是我哪里写错了吗?
请 登录 后发表回复
全部回复
共 4 条
2楼
10天前
我之前也遇到过类似问题,后来换了方案。
3楼
4天前
学到了,感谢分享!
4楼
2天前
试试在PyTorch里给BCE加个eps或者用clamp限制下logits,Dice那边也检查下分母有没有零。
5楼
19小时前
BN层和Adam的eps确实值得查一下,PyTorch默认eps是1e-8,有些实现里会调到1e-5甚至更大,数值不稳的时候这点差别挺关键。Dice loss里如果分母没加平滑项,前几个epoch预测接近全零或者全一时很容易炸。我之前也遇到过类似情况,最后发现是混合精度训练时没做loss scaling,你可以看看是不是开了amp。另外建议在每个epoch结束打印一下各层梯度的norm,NaN之前肯定有层梯度先爆掉,定位起来比盲猜快多了。