我一直在使用TensorFlow中矩阵乘法的介绍性示例。
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
当我打印乘积时,它显示为一个张量对象:
<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>
但是我怎么知道产品的价值呢?
下面的方法不起作用:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
我知道图在会话上运行,但是没有任何方法可以检查张量对象的输出而不在会话中运行图吗?
求一个Tensor对象的实际值最简单的方法是将它传递给session .run()方法,或者当你有一个默认会话(即在with tf.Session():块中,或见下文)时调用Tensor.eval()。一般来说[B],如果不在会话中运行一些代码,就不能打印张量的值。
如果你正在试验编程模型,想要一种简单的方法来求张量,tf。InteractiveSession允许你在程序开始时打开一个会话,然后将该会话用于所有的Tensor.eval()(和Operation.run())调用。这在交互设置中(比如shell或IPython笔记本)更容易,因为到处传递Session对象很乏味。例如,以下工作在Jupyter笔记本:
with tf.Session() as sess: print(product.eval())
对于如此小的表达式来说,这可能看起来很愚蠢,但这是Tensorflow 1中的关键思想之一。x是延迟执行:构建一个大而复杂的表达式非常便宜,当你想计算它时,后端(你连接到一个会话)能够更有效地调度它的执行(例如并行执行独立的部分并使用gpu)。
[A]:要打印一个张量的值而不返回到你的Python程序,你可以使用tf.print()操作符,正如Andrzej在另一个答案中建议的那样。根据官方文件:
为了确保操作符运行,用户需要将生成的op传递给tf. compat_1 . session的run方法,或者通过指定tf. compat_1 .control_dependencies([print_op])将op作为已执行操作的控制依赖项,输出到标准输出。
还要注意:
在Jupyter笔记本和colabs中,tf。打印打印到笔记本单元格输出。它不会写入笔记本内核的控制台日志。
[B]:你可以使用tf.get_static_value()函数来获得给定张量的常数值,如果它的值是可以有效计算的。
你应该认为TensorFlow核心程序由两个独立的部分组成:
构建计算图。
运行计算图。
因此,对于下面的代码,您只需构建计算图。
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
为了初始化TensorFlow程序中的所有变量,你必须显式调用一个特殊操作,如下所示:
init = tf.global_variables_initializer()
现在您构建了图并初始化了所有变量,下一步是计算节点,您必须在会话中运行计算图。会话封装了TensorFlow运行时的控件和状态。
下面的代码创建一个Session对象,然后调用它的run方法来运行足够的计算图来计算product:
sess = tf.Session()
// run variables initializer
sess.run(init)
print(sess.run([product]))
虽然其他答案是正确的,即在对图求值之前不能打印值,但它们并没有谈到一种简单的方法,即一旦对图求值,就可以在图中实际打印值。
当图被求值(使用run或eval)时,查看张量值的最简单方法是使用Print操作,如下例所示:
# Initialize session
import tensorflow as tf
sess = tf.InteractiveSession()
# Some tensor we want to print the value of
a = tf.constant([1.0, 3.0])
# Add print operation
a = tf.Print(a, [a], message="This is a: ")
# Add more elements of the graph using a
b = tf.add(a, a)
现在,当我们计算整个图时,例如使用b.c eval(),我们得到:
I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3]
Tf.keras.backend.eval用于计算小表达式。
tf.keras.backend.eval(op)
TF - 1。x和TF 2.0兼容。
最小可验证示例
from tensorflow.keras.backend import eval
m1 = tf.constant([[3., 3.]])
m2 = tf.constant([[2.],[2.]])
eval(tf.matmul(m1, m2))
# array([[12.]], dtype=float32)
这很有用,因为您不必显式地创建Session或InteractiveSession。