最近在做一个图像分类的小项目,用PyTorch写了个简单的CNN,训练到第3个epoch左右loss突然变成NaN了,准确率直接掉到10%。我检查了学习率已经调到1e-4了,也加了梯度裁剪,但还是会出现。后来换成TensorFlow 2.x试了一下,居然也在差不多同样的位置炸了。这就让我有点困惑了,如果是框架的问题不可能两个都炸吧?是不是我的数据里有脏样本或者标签有问题?有没有人遇到过类似的情况,一般从哪开始排查比较好?
楼主
28天前
PyTorch训练时loss突然变NaN,换了几个框架都这样,是我数据的问题吗?
请 登录 后发表回复
全部回复
共 5 条
2楼
26天前
两个框架都在差不多位置炸,基本可以排除框架本身的锅了,大概率还是数据或者数值稳定性的事。我之前也遇到过,最后发现是某几张图的标签越界了,比如num_classes是10结果标签里冒出个10,交叉熵一算直接inf。你可以先试试把数据全过一遍,看看有没有NaN像素或者异常标签,再就是检查下网络里有没有log或者除法操作,那些地方也容易出问题。
3楼
24天前
两个框架都在第3个epoch左右炸,基本能排除框架本身的锅,大概率是数据或者数值稳定性问题。我之前遇到过类似的,最后查出来是某几张图的标签越界了,比如num_classes是10但标签里混了个10进去,算loss的时候直接出inf。另外你可以看看输入里有没有全黑的图或者像素值没归一化到0-1,这种也容易让某层输出爆掉。建议在每个epoch结束时打印一下每层权重的max和min,哪个层先出问题一目了然。
4楼
24天前
两个框架都在第3个epoch炸,大概率不是框架的锅,数据里混进脏样本或者标签越界挺常见的。我之前也遇到过,最后查出来是某张图的像素值有inf,normalize之后直接把loss带飞了。建议你先用torch.isfinite查一下输入和标签,再逐batch打印loss看是哪一步开始不对。另外bn层在batch很小的时候也容易出问题,可以顺便看看batch size是不是太小了。
5楼
23天前
两个框架都在同一位置炸,基本排除框架问题,查查数据里有没有标签越界或者全黑图吧。
6楼
15天前
先查查输入里有没有零值或极端值,两个框架都炸,八成是数据里有脏东西。