在向后传递中调试nans

时间:2015-12-02 15:07:03

标签: tensorflow

我正在尝试调试一个有点复杂和非规范的NN架构。计算前向传递很好,并且给我预期的结果,但是当我尝试使用Adam或任何标准优化器进行优化时,即使在一次学习率非常小的迭代之后,我也无处不在。我正试图将它们本地化,并且想知道是否有办法捕获第一次出现的纳米并检测它出现在哪个操作中?我试过tf.add_check_numerics_ops(),但它似乎没有做任何事情,或者我使用的不正确。

2 个答案:

答案 0 :(得分:22)

调试NaN可能很棘手,尤其是在您拥有大型网络的情况下。 tf.add_check_numerics_ops()向图中添加操作,断言图中的每个浮点张量都不包含任何NaN值,但默认情况下不运行这些检查。相反,它返回一个可以定期运行的操作,或者每个步骤,如下所示:

train_op = ...
check_op = tf.add_check_numerics_ops()

sess = tf.Session()
sess.run([train_op, check_op])  # Runs training and checks for NaNs

答案 1 :(得分:2)

也许您可以将Print ops添加到可疑的ops打印值,就像这样

print_ops = []
for op in ops:
  print_ops.append(tf.Print(op, [op],
                   message='%s :' % op.name, summarize=10))
print_op = tf.group(*print_ops)
sess.run([train_op, print_op])

要添加到所有操作,您可以沿add_check_numerics_ops行进行循环。