如何在TensorFlow中打印Tensor对象的值?

我一直使用TensorFlow中的matrix乘法的例子。

matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

而当我打印产品时,它显示为一个TensorObject(显然)。

产品

 <tensorflow.python.framework.ops.Tensor object at 0x10470fcd0> 

但是,我怎么知道product的价值呢?

以下不起作用:

 print product Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

我知道图表在Sessions运行,但没有任何方法可以检查TensorObject的输出,而无需在session运行graphics?

评估Tensor对象实际值的最简单方法是将它传递给Session.run()方法,或者当你有一个默认会话时(例如在一个with tf.Session():块,或见下文)。 一般来说,**不能在会话中运行某些代码的情况下打印张量的值。

如果您正在尝试使用编程模型,并且想要简单的方法来评估张量,则tf.InteractiveSession可以让您在程序开始时打开一个会话,然后使用该会话处理所有Tensor.eval() (和Operation.run() )调用。 在一个交互式设置(如shell或IPython笔记本)中,当在每个地方遍历一个Session对象都很繁琐时,这可能会更容易。

对于这样一个小expression式来说,这似乎很愚蠢,但是Tensorflow中的一个关键思想是推迟执行 :构build一个庞大而复杂的expression式是非常便宜的,当你想评估它时,后端(你连接到与Session )能够更有效地安排其执行(例如并行执行独立部分并使用GPU)。


*要打印张量的值而不将它返回给Python程序,可以使用tf.Print()运算符,正如Andrzej在另一个答案中所build议的那样 。 请注意,您仍然需要运行部分图表来查看此op的输出,该输出将打印到标准输出。 如果您运行的是分布式TensorFlow,则tf.Print()会将其输出打印到运行该任务的标准输出。

**您可能可以使用tf.contrib.util.constant_value()函数来获取恒定张量的值,但不能用于一般用途,对于许多运算符也没有定义。

虽然其他答案是正确的,你不能打印价值观,直到你评估图表,他们不谈论一个简单的方法,实际上打印一个值在图表,一旦你评估它。

在评估graphics(使用runeval )时查看张量值的最简单方法是使用“ 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).eval() 

现在,每当我们评估整个图,例如使用b.eval() ,我们得到:

 I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 

不,你不能看到张量的内容而不运行图(做session.run() )。 唯一可以看到的是:

  • 张量的维度(但是我认为TF 的操作列表并不难计算)
  • 将用于生成张量的操作types( transpose_1:0random_uniform:0
  • 张量中元素的types( float32

我没有在文档中find这个,但我相信variables的值(和一些常量不是在赋值时计算的)。


看看这个例子:

 import tensorflow as tf from datetime import datetime dim = 7000 

第一个例子,我只是启动一个随机数的恒定张量运行大约相同的时间0:00:00.003261的暗淡( 0:00:00.003261

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) print datetime.now() - startTime 

在第二种情况下,实际获得常量的值并赋值,时间显然取决于dim( 0:00:01.244642

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) sess = tf.Session() sess.run(m1) print datetime.now() - startTime 

你可以通过计算一些东西来更清楚( d = tf.matrix_determinant(m1) ,记住时间以O(dim^2.8) )运行)

PS我发现是在文档中解释:

张量对象是操作结果的象征性句柄,但实际上并不包含操作输出的值。

重申别人说的话,不可能在没有运行图的情况下检查值。

任何寻找打印值的简单示例的简单代码如下所示。 代码可以在ipython笔记本中不做任何修改的情况下执行

 import tensorflow as tf #define a variable to hold normal random values normal_rv = tf.Variable( tf.truncated_normal([2,3],stddev = 0.1)) #initialize the variable init_op = tf.initialize_all_variables() #run the graph with tf.Session() as sess: sess.run(init_op) #execute init_op #print the random values that we sample print (sess.run(normal_rv)) 

输出:

 [[-0.16702934 0.07173464 -0.04512421] [-0.02265321 0.06509651 -0.01419079]] 

根据上面的答案,用你特定的代码片段,你可以打印这样的产品:

 import tensorflow as tf #Initialize the session sess = tf.InteractiveSession() matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) #print the product print(product.eval()) #close the session to release resources sess.close() 

我认为你需要得到一些基本面。 用上面的例子,你已经创build了张量(multidimensional array)。 但是为了使张量stream动真正起作用,你必须启动一个“ 会话 ”并在会话中运行你的“ 操作 ”。 注意单词“会话”和“操作”。 你需要知道4件事情与tensorflow工作:

  1. 张量
  2. 操作
  3. 会议
  4. 图表

现在从你写的东西给出张量,操作,但你没有会议运行,也没有图表。 张量(图的边)stream过图并由操作(图的节点)操纵。 有默认图表,但你可以启动你的会议。

当你说打印时,你只能访问你定义的variables或常量的形状。

所以你可以看到你缺less的东西:

  with tf.Session() as sess: print(sess.run(product)) print (product.eval()) 

希望它有帮助!

试试这个简单的代码! (这是自我解释)

 import tensorflow as tf sess = tf.InteractiveSession() # see the answers above :) x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax y = tf.nn.softmax(x) # this is the softmax function # you can have anything you like here u = y.eval() print(u) 

您应该将TensorFlow Core程序看作由两个不连续的部分组成:

  • 构build计算图。
  • 运行计算图。

所以对于下面的代码,只需构build计算图。

 matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

您还需要在TensorFlow程序中初始化所有variables,您必须显式调用一个特殊的操作,如下所示:

 init = tf.global_variables_initializer() 

现在您构build图并初始化所有variables,下一步是评估节点,您必须在会话中运行计算图。 会话封装了TensorFlow运行时的控制和状态。

下面的代码创build一个Session对象,然后调用它的run方法来运行足够的计算图来评估product

 sess = tf.Session() // run variables initializer sess.run(init) print(sess.run([product])) 

请注意, tf.Print()将改变张量名称。 如果您试图打印的张量是一个占位符,向其馈送数据将失败,因为在喂食期间将不会find原始名称。 例如:

 import tensorflow as tf tens = tf.placeholder(tf.float32,[None,2],name="placeholder") print(eval("tens")) tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") print(eval("tens")) res = tens + tens sess = tf.Session() sess.run(tf.global_variables_initializer()) print(sess.run(res)) 

输出是:

 python test.py Tensor("placeholder:0", shape=(?, 2), dtype=float32) Tensor("Print:0", shape=(?, 2), dtype=float32) Traceback (most recent call last): [...] InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 

您可以通过启用急切的执行来检查TensorObject的输出,而无需在会话中运行graphics。

只需添加以下两行代码: import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

import tensorflow

print product的输出现在是: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

请注意,截至目前(2017年11月),您将不得不安装一个Tensorflow nightly构build以启用急切的执行。 预制轮可以在这里find。