原因
- epoch <= 100,一般是学习率过高,降低1-10倍试试;
- 如果使用了RNN,可能是因为梯度爆炸,可以增加梯度截断(gradient clipping);
- 可能除数为0;
- 可能自然对数里有0或者负数
ln(0) or ln(-x)
; - 需要计算loss数组越界,即你自己创建的时候,数据结构有问题;
- 设计指数计算,导致某个值非常大,存储不下;
比如不做其他处理的softmax中分子分母需要计算exp(x),值很大很大,最后可能为INF/INF,所以得到了NaN,此时需要确认使用的softmax中在计算exp(x)做了相关处理,比如减去最大值; - label缺失,输入错了,后面输出怎么也不会对;
例子
- 梯度爆炸
- 不当loss function
- 不当输入
参考
[1] 训练网络loss出现Nan解决办法 这篇里的评论区也有很多回答