如何在 TensorFlow 中调试 NaN 值?

新手上路,请多包涵

我正在运行 TensorFlow 并且碰巧有一些东西产生了 NaN。我想知道它是什么,但我不知道该怎么做。主要问题是,在“正常”程序程序中,我只会在执行操作之前写一条打印语句。 TensorFlow 的问题是我不能这样做,因为我首先声明(或定义)图形,因此向图形定义添加打印语句没有帮助。是否有任何规则、建议、启发式方法可以追踪可能导致 NaN 的原因?


在这种情况下,我更准确地知道要查看哪一行,因为我有以下内容:

 Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance
Z = tf.sqrt(Delta_tilde)
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity)
Z = tf.pow(Z, 2.0)
A = tf.exp(Z)

当出现这一行时,我知道它会返回 NaN,正如我的摘要作者所声明的那样。为什么是这样?有没有办法至少探索 Z 在平方根后有什么价值?


对于我发布的具体示例,我尝试了 tf.Print(0,Z) 但没有成功,它什么也没打印。如:

 Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance
Z = tf.sqrt(Delta_tilde)
tf.Print(0,[Z]) # <-------- TF PRINT STATMENT
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity)
Z = tf.pow(Z, 2.0)
A = tf.exp(Z)

我实际上不明白 tf.Print 应该做什么。为什么需要两个参数?如果我想打印 1 张量,为什么我需要传递 2 张量?我觉得很奇怪。


我正在查看函数 tf.add_check_numerics_ops() 但它没有说明如何使用它(加上文档似乎不是很有帮助)。有谁知道如何使用这个?


由于我有评论指出数据可能不好,所以我使用的是标准 MNIST。但是,我正在计算一个正数(成对欧几里得距离),然后对其求平方根。因此,我不会看到数据具体如何成为问题。

原文由 Charlie Parker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 476
1 个回答

为什么会得到 NaN 结果有几个原因,通常是因为学习率太高,但还有很多其他可能的原因,例如输入队列中的损坏数据或 0 计算的日志。

无论如何,无法通过简单的打印来完成您所描述的使用打印进行调试(因为这只会导致打印图形内部的张量信息,而不会打印任何实际值)。

但是,如果您使用 tf.print 作为构建图形 ( tf.print ) 的操作,那么当图形被执行时,您将打印出实际值(观察这些值以调试和理解行为是一个很好的练习你的网络)。

但是,您使用打印语句的方式并不完全正确。这是一个操作,因此您需要向它传递一个张量并请求一个结果张量,稍后您需要在执行图中使用它。否则该操作将不会被执行并且不会发生打印。尝试这个:

 Z = tf.sqrt(Delta_tilde)
Z = tf.Print(Z,[Z], message="my Z-values:") # <-------- TF PRINT STATMENT
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity)
Z = tf.pow(Z, 2.0)

原文由 Phillip Bock 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题