“在对齐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
文档信息
- 本文作者:焦逸凡
- 本文链接:https://ailovejinx.github.io/2023/11/01/blog-debug/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)