nan:Not a Number
错误后果:造成训练准确率的断崖式下跌
两种出现地点:
1)在loss函数中出现nan
出现原因:一般是因为tf中的log函数输入了‘负数’或‘0’值(出现log(0)*0的情况)
解决方法:使用tf.clip_by_value限制tf.log的输入值
例如: cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-8,tf.reduce_max(y))))
cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-8,1e+100)))
cross_entropy = -tf.reduce_sum(y_*tf.log(y+1e-8))
safe_log = tf.clip_by_value(some_tensor, 1e-10, 1e100)
2)在更新网络时出现nan
出现原因:一般是学习率设置过高导致的(-->梯度值过大-->梯度爆炸)
解决方法:调低学习率
3)脏数据
出现原因:训练数据中存在脏数据,不适应当前网络,输出错误数值
解决方法:人工清理数据
更多细节可参考:
blog.sina.com.cn/s/blog_6ca0f5eb0102wr4j.html#cmt_5A0D972D-72F73880-BE365276-926-938
https://www.zhihu.com/question/49346370
https://www.zhihu.com/question/52242037/answer/184101547
https://www..com/bonelee/p/8603750.html