Loss不收敛或变为NaN时如何debug

2023/11/01 Pytorch 科研 Debug 共 673 字,约 2 分钟

“在对齐Tensor的Shape后,下一个面临的问题就是Loss的问题。”——麦克·阿瑟

Loss不收敛

确定正确进行了反向传播

train_one_epoch()函数最后打印参数和梯度:

for name, parms in model.named_parameters():
	print('-->name:', name, '-->grad_requirs:', parms.requires_grad, '--weight', torch.mean(parms.data), ' -->grad_value:', torch.mean(parms.grad))

如果parms.grad不存在,有可能是loss.backward()被注释掉或者没写。这种情况下loss的变化一般是随机跳动的,没有一个明显的下降或上升趋势。

确定学习率问题

可以从0.1开始降低学习率,每次除以5或降低一个数量级,观察Loss的变化情况

Loss变为NaN

网络中某个feature或其他值出现NaN

可以在main.py或者train.py文件开头加上下面这句,开启正向传播时自动求导的异常侦测:

torch.autograd.set_detect_anomaly(True)

反向传播时,也可以开启求导异常侦测:

with torch.autograd.detect_anomaly(): 
	loss.backward()

一般情况下,报错位置会定位在出现NaN值的代码行附近。

Loss计算失误

有的Loss计算会除以box.sum()等,该值为0时会导致NaN的出现。可以在分母上加1e-6

文档信息

Search

    Table of Contents