1. 学习率太大,步子迈的太大导致梯度爆炸等都是有可能的。
梯度消失或者爆炸的优化,请参考:https://blog.csdn.net/u013250416/article/details/81410693
2. 网络结构不合理,导致的Non
1. 增加或者减少网络的深度
2. 增加网络的宽度
3. 不当的损失函数
4. relu和softmax两层不要连着用,最好将relu改成tanh,也算一个技巧。
3. 数据处理的不合理,导致的Non
1. batch size 选择过小
2. 检查 参数初始化
3. 数据本身,是否存在Nan,可以用numpy.any(numpy.isnan(x))
检查一下input和target
4. 在训练的时候,整个网络随机初始化,很容易出现Nan,这时候需要把学习率调小,可以尝试0.1,0.01,0.001,直到不出现Nan为止,如果一直都有,那可能是网络实现问题。学习率和网络的层数一般成反比,层数越多,学习率通常要减小。有时候可以先用较小的学习率训练5000或以上次迭代,得到参数输出,手动kill掉训练,用前面的参数fine tune,这时候可以加大学习率,能更快收敛哦
- 最后还没有排除问题的话,TensorFlow有专门的内置调试器(tfdbg)来帮助调试此类问题
tensorflow.org/programmers_guide/debugger