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

时间:2015-11-10 15:19:58

标签: python tensorflow tensor

我一直在TensorFlow中使用矩阵乘法的介绍性例子。

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

当我打印产品时,它会将其显示为Tensor对象:

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

但我怎么知道product的价值?

以下内容无效:

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

我知道图表在Sessions上运行,但是如果不在Tensor中运行图表,我无法检查session对象的输出吗?

24 个答案:

答案 0 :(得分:208)

最简单的 [A] 评估Tensor对象实际值的方法是将其传递给Session.run()方法,或者在Tensor.eval()方法时调用with tf.Session():你有一个默认会话(即在Tensor.eval()块中,或者见下文)。通常 [B] ,如果不在会话中运行某些代码,则无法打印张量值。

如果您正在尝试使用编程模型,并且想要一种简单的方法来评估张量,tf.InteractiveSession可以让您在程序开始时打开一个会话,然后将该会话用于所有Operation.run() }(和Session)调用。这在交互式设置中更容易,例如shell或IPython笔记本,当在任何地方传递Session对象时非常繁琐。

这对于这么小的表达式来说似乎很愚蠢,但Tensorflow中的一个关键想法是延迟执行:构建一个庞大而复杂的表达式非常便宜,当你想要评估它,后端(与tf.Print()连接)能够更有效地安排其执行(例如并行执行独立部分并使用GPU)。

[A]:要打印张量值而不将其返回到Python程序,可以使用tf.Print()运算符作为Andrzej suggests in another answer。请注意,您仍然需要运行图形的一部分来查看此op的输出,该输出将打印到标准输出。如果您正在运行分布式TensorFlow,string会将其输出打印到运行该操作的任务的标准输出。这意味着如果您使用https://colab.research.google.com或任何其他Jupyter Notebook,那么您将看不到笔记本中tf.Print()的输出;在这种情况下,请参考this answer如何让它打印出来。

[B]:你可能能够使用实验tf.contrib.util.constant_value()函数来获得一个常数张量的值,但它并不适合一般用途,并且它并没有为许多运营商定义。

答案 1 :(得分:137)

虽然其他答案是正确的,在评估图表之前无法打印该值,但在评估图表之后,他们并没有谈到在图表中实际打印值的一种简单方法。

在评估图表时(使用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)

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

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

答案 2 :(得分:27)

重申其他人所说的话,如果不运行图表就无法检查数值。

任何寻找打印值的简单示例的人的简单代码如下所示。代码可以在ipython notebook

中执行而无需任何修改
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]]

答案 3 :(得分:20)

不,如果不运行图表,您就无法看到张量的内容(执行session.run())。你能看到的唯一的东西是:

  • 张量的维数(但我认为为TF list of the operations计算它并不困难)
  • 将用于生成张量的操作类型(transpose_1:0random_uniform:0
  • 张量中的元素类型(float32

我没有在文档中找到这个,但我相信变量的值(以及一些常量在分配时不计算)。

看一下这个例子:

import tensorflow as tf
from datetime import datetime
dim = 7000

第一个示例,其中我只是启动一个恒定的随机数张量运行大致相同的时间,无论是昏暗的(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

在第二种情况下,实际评估常量并分配值,时间显然取决于暗淡(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)中运行)来更清晰地显示

P.S。我发现它是在documentation中解释的:

  

Tensor对象是操作结果的符号句柄,   但实际上并没有保存操作输出的值。

答案 4 :(得分:12)

我认为你需要得到一些正确的基础知识。通过上面的示例,您已经创建了张量(多维数组)。但是对于真正有效的张量流,您必须启动“会话”并在会话中运行“操作”。注意“会话”和“操作”这个词。 你需要知道使用te​​nsorflow的4件事:

  1. 张量
  2. 操作
  3. 会话
  4. 图表
  5. 现在从你所写的内容中你已经给出了张量和操作,但你没有会话运行也没有图表。张量(图的边缘)流过图形并由操作(图形的节点)操纵。有默认图表,但您可以在会话中启动您的图表。

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

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

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

    希望它有所帮助!

答案 5 :(得分:7)

根据上面的答案,您可以使用特定的代码段打印产品:

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()

答案 6 :(得分:7)

在最新的Tensorflow 1.13.1

import tensorflow as tf
tf.enable_eager_execution()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

在Tensorflow 2.0中,默认启用了默认模式。因此以下代码适用于TF2.0。

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

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

答案 7 :(得分:6)

您可以通过启用eager execution来检查TensorObject的输出,而无需在会话中运行图表。

只需添加以下两行代码: 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每晚构建以启用急切执行。可以找到预制车轮here

答案 8 :(得分:5)

请注意,tf.Print()会更改张量名称。 如果您要打印的张量是占位符,则向其提供数据将失败,因为在进纸期间将找不到原始名称。 例如:

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

答案 9 :(得分:5)

您应该将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]))

答案 10 :(得分:3)

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

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)

答案 11 :(得分:2)

您可以按如下方式打印会话中的张量值:

import tensorflow as tf

a = tf.constant([1, 1.5, 2.5], dtype=tf.float32)
b = tf.constant([1, -2, 3], dtype=tf.float32)
c = a * b

with tf.Session() as sess:
    result = c.eval()
   
print(result)

答案 12 :(得分:2)

在我执行此操作之前,即使阅读了所有答案,我也很难理解所需要的内容。 TensofFlow也是我的新手。

def printtest():
x = tf.constant([1.0, 3.0])
x = tf.Print(x,[x],message="Test")
init = (tf.global_variables_initializer(), tf.local_variables_initializer())
b = tf.add(x, x)
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(b))
    sess.close()

但是你仍然可能需要执行会话返回的值。

def printtest():
    x = tf.constant([100.0])
    x = tf.Print(x,[x],message="Test")
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    b = tf.add(x, x)
    with tf.Session() as sess:
        sess.run(init)
        c = sess.run(b)
        print(c)
        sess.close()

答案 13 :(得分:1)

基本上,在张量流中,当您创建任何类型的张量时,它们都会创建并存储在其中,只有在运行张量流会话时才能访问它们。假设您创建了一个恒定张量
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
无需运行会话,您可以获取
-op:一项操作。计算该张量的运算。
-value_index:一个整数。产生此张量的操作端点的索引。
-dtype:DType。存储在该张量中的元素的类型。

要获取值,您可以使用所需的张量运行会话:

with tf.Session() as sess:
    print(sess.run(c))
    sess.close()

输出将是这样的:

  

array([[1。,2.,3.],          [4.,5.,6。]],dtype = float32)

答案 14 :(得分:1)

在Tensorflow 2.0+(或Eager模式环境中)中,您可以调用.numpy()方法:

import tensorflow as tf

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

print(product.numpy()) 

答案 15 :(得分:1)

使用https://www.tensorflow.org/api_docs/python/tf/print中提供的技巧,我使用log_d函数来打印格式化的字符串。

import tensorflow as tf

def log_d(fmt, *args):
    op = tf.py_func(func=lambda fmt_, *args_: print(fmt%(*args_,)),
                    inp=[fmt]+[*args], Tout=[])
    return tf.control_dependencies([op])


# actual code starts now...

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

with log_d('MAT1: %s, MAT2: %s', matrix1, matrix2): # this will print the log line
    product = tf.matmul(matrix1, matrix2)

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

答案 16 :(得分:0)

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

答案:

import tensorflow as tf

# Variable
x = tf.Variable([[1,2,3]])

# initialize
init = (tf.global_variables_initializer(), tf.local_variables_initializer())

# Create a session
sess = tf.Session()

# run the session
sess.run(init)

# print the value
sess.run(x)

答案 17 :(得分:0)

启用1.10版后在tensorflow中引入的热切执行。 它非常易于使用。

# Initialize session
import tensorflow as tf
tf.enable_eager_execution()


# Some tensor we want to print the value of
a = tf.constant([1.0, 3.0])

print(a)

答案 18 :(得分:0)

tf.keras.backend.eval对于评估小表达式很有用。

tf.keras.backends.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)

这很有用,因为您不必显式创建SessionInteractiveSession

答案 19 :(得分:0)

您可以使用Keras,单行答案将是使用float cannot be converted to float[][]这样的方法:

eval

答案 20 :(得分:0)

tf.Print现在已弃用,这是使用tf.print(小写p)的方法。

虽然运行会话是一个不错的选择,但并非总是可行的。例如,您可能想在特定会话中打印一些张量。

新的打印方法返回一个没有输出张量的打印操作:

print_op = tf.print(tensor_to_print)

由于它没有输出,因此无法像使用tf.Print一样将其插入到图形中。相反,您可以添加它以控制会话中的依赖项,以使其打印出来。

sess = tf.compat.v1.Session()
with sess.as_default():
  tensor_to_print = tf.range(10)
  print_op = tf.print(tensor_to_print)
with tf.control_dependencies([print_op]):
  tripled_tensor = tensor_to_print * 3
sess.run(tripled_tensor)

有时,在较大的图中,可能部分地在子函数中创建,将print_op传播到会话调用很麻烦。然后,可以使用tf.tuple将打印操作与另一个操作耦合,然后无论哪个会话执行代码,该操作都将与该操作一起运行。这样做的方法如下:

print_op = tf.print(tensor_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.

答案 21 :(得分:0)

在Tensorflow V2中,使用tf.keras.backend.print_tensor(x, message='')

打印张量值

答案 22 :(得分:0)

我不确定我是否会错过这里,但是我认为最简单,最好的方法是使用tf.keras.backend.get_value API。

print(product)
>>tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(tf.keras.backend.get_value(product))
>>[[12.]]

答案 23 :(得分:0)

import tensorflow as tf
sess = tf.InteractiveSession()
x = [[1.,2.,1.],[1.,1.,1.]]    
y = tf.nn.softmax(x)           

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

print(product.eval())
tf.reset_default_graph()
sess.close()