总结:
nan的字面意思:Not a Number的缩写
1.一般来说,出现NaN有以下几种情况:
(1) 如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。
(2)如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决)
(3)可能用0作为了除数;
(4)可能0或者负数作为自然对数
(5)网络结构设计的问题
2.解决方法
个人案例
一开始,我设置每训练10张图片,就输出loss,除了第一个输出为正常值,其余的都为Nan。然后我将训练每张图片的loss都输出,发现数值会慢慢变得很大。
我的解决方法是:将学习率调小,loss的输出总算不为Nan
常见的导致模型发散(Nan问题)原因:
对损失是否开始增加然后发散到无穷大的现象,学习率太高(将学习率调小一点),还可能是输入数据有问题(尝试对输入数据调用assert not np.any(np.isnan(x)),以确保您没有引入nan。还要确保所有目标值(样本Label)均有效。最后,确保数据正确归一化。您可能希望像素在[-1,1]而不是[0,255]范围内)。
参考链接:
https://blog.csdn.net/weixin_39805720/article/details/110979733?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161914290716780366536587%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161914290716780366536587&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-110979733.first_rank_v2_pc_rank_v29&utm_term=nan++python++loss