tf.print() vs Python print vs tensor.eval()
Posted
技术标签:
【中文标题】tf.print() vs Python print vs tensor.eval()【英文标题】: 【发布时间】:2019-12-19 12:49:00 【问题描述】:好像在Tensorflow中,至少有3种方法可以打印出一个张量的值。我一直在阅读here 和there,但仍然很困惑。
这些作者似乎将不同的用法总结为:
Pythonprint
:只能打印出张量的某些属性,例如它的形状,因为在计算图之外它只是一个操作。
tensor.eval()
:不确定它与 tf.print()
的区别
tf.print()
: 可以输出一个张量的实际值,但必须插入到图中的某处以及被其他一些操作使用,否则它将悬空并且仍然不打印。
我的困惑可能还在于我不确定我们可以在张量流计算图中访问多少 Python 功能,或者计算图“结束”和 Python 代码“开始”在哪里。例如
-
如果我在构建计算图的两行之间插入 Python 打印,当我稍后调用
sess.run()
时,会调用此行吗?
如果我想在计算图中打印出多个张量值,我应该把这些语句放在哪里?
tensor.eval()
和tf.print()
有什么区别?我应该如何以不同的方式使用它们?
【问题讨论】:
【参考方案1】:第一次构建图形时将调用原生 Python print()
语句。看看这个:
a = tf.placeholder(shape=None, dtype=tf.int32)
b = tf.placeholder(shape=None, dtype=tf.int32)
print("a is ",a," while b is ",b)
c = tf.add(a, b)
with tf.Session() as sess:
print(sess.run(c, feed_dict=a: 1, b: 2))
print(sess.run(c, feed_dict=a: 3, b: 1))
通过执行此代码块,输出为:
# a is Tensor("Placeholder:0", dtype=int32) while b is Tensor("Placeholder_1:0", dtype=int32)
# 3
# 4
另一方面,让我们看看tf.print()
:
a = tf.placeholder(shape=None, dtype=tf.int32)
b = tf.placeholder(shape=None, dtype=tf.int32)
print_op = tf.print("a is ",a," while b is ",b)
with tf.control_dependencies([print_op]):
c = tf.add(a, b)
with tf.Session() as sess:
print(sess.run(c, feed_dict=a: 1, b: 2))
print(sess.run(c, feed_dict=a: 3, b: 1))
所以,根据下面的输出,我们可以看到,如果我们添加 tf.print
操作必须在每次运行 c
时运行的依赖项,我们就可以看到我们想要的输出:
# a is 1 while b is 2
# 3
# a is 3 while b is 1
# 4
最后,tensor.eval()
与 sess.run(tensor)
相同。但是,tensor.eval()
的局限性在于您可以运行它来评估单个张量,而tf.Session
可以用于评估多个张量sess.run([tensor1, tensor2])
。如果你问我,我会一直使用 sess.run(list_of_tensors)
来评估我想要的任意数量的张量,并打印出它们的值。
【讨论】:
【参考方案2】:没有。稍后调用sess.run()
时不会调用Python print
。
如果您想在调用sess.run()
时打印,则可以使用tf.print
。
要在图中打印出多个张量值,应在打开tf.Session()
后使用sess.run()
。示例代码如下。
t = tf.constant(42.0)
u = tf.constant(37.0)
pt = tf.print(t)
pu = tf.print(u)
with sess.as_default():
sess.run([pt, pu])
42
37
-
This answer 和 this 在另一个问题中会有所帮助。
tensor.eval()
评估张量运算并且不是运算符。tf.print()
只是一个打印给定张量的运算符。所以在调用tf.Session()
之后,tf.print()
将成为图节点之一。
【讨论】:
以上是关于tf.print() vs Python print vs tensor.eval()的主要内容,如果未能解决你的问题,请参考以下文章
keras 的 model.fit 中没有 tf.Print 的结果