- 据别的文章说,学习率过高或者adam算法没加入eps参数也可能导致模型输出nan. 这个可以一开始就加上试试。
- 先判断loss是否正常,
- 再使用判断梯度是否正常。出现NAN。
loss.backward()for name, parms in model.named_parameters():if parms.grad is None or parms.grad[0] is None:print('-->name:', name, '-->grad_requirs:',parms.requires_grad, ' -->grad_value_has_nan:', parms.grad)else:print('-->name:', name, '-->grad_requirs:',parms.requires_grad, ' -->grad_value_has_nan:', torch.isnan(parms.grad).any())
- 定位具体代码。
torch.autograd.set_detect_anomaly(True)optimizer.zero_grad(set_to_none=True)
print(torch.max(sample_points_cam),torch.min(sample_points_cam),sample_points_cam.dtype)
# 注意数据类型,很可能是数据类型不匹配导致显示为inf
- 一般 乘法除法易出现inf导致nan,多使用torch.squeeze(x,0)而不是x.squeeze(0) 、多使用torch.flatten(x,1)而不是x.flatten(1)。
- 模型如果开启了混合精度训练也可能会导致梯度nan,仔细确认下面的设置。enable_amp,enable_amp_dtype,GradScaler,autocast。