我正在运行TensorFlow,我的代码中出现了一个NaN值。我想知道是什么导致了这个问题,但我不知道该如何解决。在“普通”的过程式程序中,我通常会在操作执行之前写一个print语句以便找到问题所在。但在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。但是,我正在计算一个正值(成对欧几里得距离),然后取其平方根。因此,我不认为数据具体会是问题所在。
x
的有用的代码片段:DEBUGGING = False
x = x if not DEBUGGING else tf.Print(x, [x], 'Value of x: ')
如果DEBUGGING
为假,则x
不会被改变。否则,将使用 TensorFlow 的tf.Print
函数打印出x
的值。 - Toke Faurby