在向后传递中调试 nans

Debugging nans in the backward pass

我正在尝试调试一个有点复杂且非规范的神经网络架构。计算前向传递很好,并且给了我预期的结果,但是当我尝试使用 Adam 或任何标准优化器进行优化时,即使在以非常小的学习率进行一次迭代之后,我到处都会得到 nans。我正在尝试对它们进行本地化,并想知道是否有办法捕捉 nan 的第一次出现并检测它出现在哪个操作中?我试过 tf.add_check_numerics_ops() 但它似乎没有任何作用,或者我使用不正确。

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

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

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

也许你可以添加 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 行进行循环。