最近在复现一个图像分割的模型,用PyTorch写的时候训练到第3个epoch左右loss就突然变成NaN了,梯度也炸了。我检查了学习率不算大(1e-4),也加了梯度裁剪,但还是会出现。同样的网络结构和数据,我用TensorFlow 2.x跑就完全正常,loss稳稳下降。想问问大家有没有遇到过类似的情况?是不是PyTorch里某些算子默认行为不一样,比如除法或者log?还是我数据加载那块有问题?真的有点懵,求指点。
楼主
3天前
PyTorch训练时loss突然变NaN,换TensorFlow就没问题,是我哪里写错了吗?
请 登录 后发表回复
全部回复
共 2 条
2楼
2天前
PyTorch里log和除法确实容易踩坑,比如log(0)或者除以0直接给你inf,反向传播一传就成NaN了,TensorFlow有些算子默认加了epsilon所以看着没事。你可以先查查loss里有没有手写的log或除法,加个极小值保护试试。另外混合精度训练也可能导致梯度爆炸,amp的GradScaler用对了吗?我之前也遇到过类似情况,最后发现是数据里混进了全黑的mask,算dice系数时除零了。
3楼
1天前
大概率是某个batch里出现了全黑的mask或者空标签,PyTorch那边算dice loss或者cross entropy时除零直接给你爆NaN了。你可以试试在loss计算前加个clamp_min把分母兜住,或者在数据加载时把异常样本过滤掉。另外PyTorch的amp混合精度有时候也会在前期偷偷给你埋雷,关掉试试看还炸不炸。