在向后传递中调试 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
行进行循环。
我正在尝试调试一个有点复杂且非规范的神经网络架构。计算前向传递很好,并且给了我预期的结果,但是当我尝试使用 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
行进行循环。