我正在运行 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 许可协议
为什么会得到 NaN 结果有几个原因,通常是因为学习率太高,但还有很多其他可能的原因,例如输入队列中的损坏数据或 0 计算的日志。
无论如何,无法通过简单的打印来完成您所描述的使用打印进行调试(因为这只会导致打印图形内部的张量信息,而不会打印任何实际值)。
但是,如果您使用 tf.print 作为构建图形 ( tf.print ) 的操作,那么当图形被执行时,您将打印出实际值(观察这些值以调试和理解行为是一个很好的练习你的网络)。
但是,您使用打印语句的方式并不完全正确。这是一个操作,因此您需要向它传递一个张量并请求一个结果张量,稍后您需要在执行图中使用它。否则该操作将不会被执行并且不会发生打印。尝试这个: