深度学习网络训练中出现nan的原因分析

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.cnblogs.com/bonelee/p/8603750.html

  

 

猜你喜欢

转载自blog.csdn.net/Strive_For_Future/article/details/81625006