注:内容来源与网络
最近用Tensorflow训练网络,在增加层数和节点之后,出现loss = NAN的情况,在网上搜寻了很多答案,最终解决了问题,在这里汇总一下。
- 数据本身,是否存在Nan,可以用
numpy.any(numpy.isnan(x))
检查一下input和target - 在训练的时候,整个网络随机初始化,很容易出现Nan,这时候需要把学习率调小,可以尝试0.1,0.01,0.001,直到不出现Nan为止,如果一直都有,那可能是网络实现问题。学习率和网络的层数一般成反比,层数越多,学习率通常要减小。有时候可以先用较小的学习率训练5000或以上次迭代,得到参数输出,手动kill掉训练,用前面的参数fine tune,这时候可以加大学习率,能更快收敛哦
- 如果是图片,那么得转化为float 也就是/255.
- relu和softmax两层不要连着用,最好将relu改成tanh,什么原因呢
- 参数初始化
- batch size 选择过小
- 最后还没有排除问题的话,TensorFlow有专门的内置调试器(tfdbg)来帮助调试此类问题
tensorflow.org/programmers_guide/debugger
from tensorflow.python import debug as tf_debug
<meta charset="utf-8">
# 建立原来的Session
sess = tf.Session()
# 用tfdbg的Wrapper包裹原来的Session对象:
sess = tf_debug.LocalCLIDebugWrapperSession(sess)
sess.add_tensor_filter("has_inf_or_nan", tf_debug.has_inf_or_nan)
# 以上为所有需要的代码变动,其余的代码可以保留不变,因为包裹有的sess和原来的界面一致。
# 但是每次执行`sess.run`的时候,自动进入调试器命令行环境。
sess.run(train_op, feed_dict=...)
在tfdbg命令行环境里面,输入如下命令,可以让程序执行到inf或nan第一次出现。
tfdbg> run -f has_inf_or_nan
一旦inf/nan
出现,界面现实所有包含此类病态数值的张量,按照时间排序。所以第一个就最有可能是最先出现inf/nan
的节点。可以用node_info, list_inputs
等命令进一步查看节点的类型和输入,来发现问题的缘由。
作者:徐凯_xp
链接:https://www.jianshu.com/p/79ea75c47004
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
网友评论