美文网首页
Tensorflow训练网络出现了loss = NAN解决方案

Tensorflow训练网络出现了loss = NAN解决方案

作者: Oscar_hailiang | 来源:发表于2018-10-22 10:25 被阅读0次

    注:内容来源与网络
    最近用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
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:Tensorflow训练网络出现了loss = NAN解决方案

          本文链接:https://www.haomeiwen.com/subject/oyvwzftx.html