1、使用tf.estimator时出现: ERROR:tensorflow:Model diverged with loss = NaN
基本可以判断就是版本导致的问题,我是从tf 1.4切换到1.12出现该问题的,网上给出的解决方法有很多,我最终通过以下配置完成解决的:
Windows SET CUDA_VISIBLE_DEVICES=0
Linux export CUDA_VISIBLE_DEVICES=0
参考链接: https://github.com/tensorflow/models/issues/4881
其它 NaN Loss的原因及解决方法 参考: https://zhuanlan.zhihu.com/p/114150904
- 梯度爆炸
原因:学习的过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹。
症状:观察每次迭代的loss值,会发现loss明显增长,最后因为loss值太大以至于不能用浮点去表示,所以变成了Nan。
可采取的措施:1 降低学习速率,2 如果模型中有多个loss层,就需要找到梯度爆炸的层,然后降低该层的loss weight。
- 学习率过高
原因:过高的学习率乘上所有的梯度使得所有参数变成无效的值。
症状:观察输出日志,会发现学习率变成nan
可采取的措施:设置合适的学习速率
- 损失函数有误
原因:损失函数的计算,如交叉熵损失函数的计算可能出现log(0),所以就会出现loss为Nan的情况
症状: loss逐渐下降,突然出现Nan
可采取的措施: 尝试重现该错误,打印损失层的值进行调试.
- 输入数据有误
原因: 你的输入中存在Nan
症状: loss逐渐下降,突然出现Nan
可采取的措施: 逐步去定位错误数据,然后删掉这部分数据. 可以使用一个简单的网络去读取输入,如果有一个数据是错误的,这个网络的loss值也会出现Nan
- Pooling层的步长大于核的尺寸
- 设置远距离的Label会得到NAN