Tensorflow:为什么tensorflow不打印此循环中的每个值?

时间:2018-10-23 18:52:06

标签: python tensorflow

我正在查看一些运行tf.while_loop()的Tensorflow代码,我有一个问题。该代码作为学习tensorflow.的实验室的一部分,计算了4级多项式的根。我的问题是为什么特定的打印语句不会输出所有中间值。

代码如下:

import tensorflow as tf

def f(x, w):
    return (w[0] + w[1] * x + w[2] * tf.pow(x,2) + w[3] * tf.pow(x,3) + w[4] * tf.pow(x,4) )

def f1(x, w):
    return (w[1] + 2. * w[2] * x + 3. * w[3] * tf.pow(x,2) + 4. * w[4] * tf.pow(x,3) )

def f2(x, w):
    return (2. * w[2] + 6. * w[3] * x + 12. * w[4] * tf.pow(x,2) )

def fxn_plus_1(xn, w):
    return (xn - (2. * f(xn, w) * f1(xn, w) / (2. * tf.square(f1(xn, w)) - f(xn, w) * f2(xn, w))))

def c(x, weights):
    return tf.abs(x - fxn_plus_1(x, weights)) > 0.001

def b(x, weights):
    x = fxn_plus_1(x, weights)
    return x, weights

weights = tf.constant( [-1000., 1., 1. , 5. , 0.1])

x = fxn_plus_1(-10., weights)

out = tf.while_loop(c, b, [x, weights])

with tf.Session() as sess:
    x, weights = sess.run(out)
    print(x)

输出正确,值为5.575055。现在,我想看看算法进行过程中循环体b()的中间值是多少。我将函数b()更改为以下内容:

def b(x, weights):
    x = fxn_plus_1(x, weights)
    print(x) ## ADDED PRINT STATEMENT
    print(weights)
    return x, weights

我得到的回报是:

Tensor("while_4/sub_4:0", shape=(), dtype=float32)
Tensor("while_4/Identity_1:0", shape=(5,), dtype=float32)
5.575055

这似乎为x,weights的值(而不是实际值)提供了调试输出或图形信息。我不确定如何获得循环以实际打印每个步骤的值。

有什么建议吗? 谢谢。

有关尝试和建议的事情的更新:

评论者之一@ user49593,建议我尝试使用tf.Print()

这是代码和输出。我仍然只是获取图形信息,而不是实际的值向量。

def b(x, weights):
    x = fxn_plus_1(x, weights)
    x = tf.Print(x, [x], message="here: ") #CHANGED TO tf.Print STATEMENT
    return x, weights

输出仍然仅为5.575055。没有中间值的向量。

1 个答案:

答案 0 :(得分:0)

@ user49593确实找到了这个问题的答案。问题在于Jupyter笔记本不显示打印语句的输出。因此,为了查看输出,您需要将代码放入文件中,然后从命令行运行它。

因此,如果我将上面的代码包装到名为equation.py的文件中。然后,我将转到命令行并键入。

python equation.py

这将产生预期的输出。看来还有另一则与此相关的SE帖子,可能还有一些其他见解。

Is there a way to get tensorflow tf.Print output to appear in Jupyter Notebook output