注:内容来源与网络 最近用Tensorflow训练网络,在增加层数和节点之后,出现loss = NAN的情况,在网上搜寻了很多答案,最终解决了问题,在这里汇总一下。
numpy.any(numpy.isnan(x))
检查一下input和targetfrom 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
等命令进一步查看节点的类型和输入,来发现问题的缘由。