在使用detectron2进行目标检测训练时,训练数轮后遇到了以下bug:FloatingPointError: Loss became infinite or NaN at iteration=856!
百度一下,发现有可能是以下几种情况:
1.如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。
2.如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决)
3.可能用0作为了除数;
4.可能0或者负数作为自然对数
5.需要计算loss的数组越界(尤其是自己,自定义了一个新的网络,可能出现这种情况)
6.在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等))
7.训练深度网络的时候,label缺失问题也会导致loss一直是nan,需要检查label
鉴于我是在训练几轮后才出现报错,个人猜测有可能是因为lr过大,有的文章提到甚至会把lr调成1e-7,于是将lr由0.0025调为了0.00025,运行,终于不再报这个错
参考文章: