在TensorFlow中怎么打印Tensor对象的值

在TensorFlow中,如何打印Tensor对象的值?对于下面这个TensorFlow矩阵乘法的例子:

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

当我打印product时,显示为一个TensorObject

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

怎么知道product的实际值呢?

以下方法不起作用:

print (product)

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

Tensorflow编程指南中提到, 要在Sessions上运行的计算图,之后才能获取值。那么为了方便起见,有没有什么方法可以直接查看TensorObject的输出,而无需在session中运行计算图?

 

1.常用的解决思路

要获取Tensor对象的实际值,最简单的方法:将其传递给Session.run()方法,或者启用默认会话时(即在with tf.Session():块中,或参见下文)调用Tensor.eval()。一般来说,如果不在会话中运行代码,无法打印Tensor(张量)的值。

如果您正在试验模型编程,并且想要简单的方法来评估张量,则tf.InteractiveSession允许您在程序开始时打开一个会话,然后将该会话用于所有Tensor.eval()(和Operation.run())调用。交互式环境可以是shell或IPython Notebook(或jupyter)。

对于这样一个小表达式来说,这看起来相当麻烦,但是Tensorflow中的一个关键思想是推迟执行:构建一个庞大而复杂的表达式是非常容易的,而且当你想要执行计算时,后端(你连接到的Session)能够更有效地优化执行过程。

另外,在能够运行计算图的情况,要输出张量的值,可以使用tf.Print()运算符(如Andrzej suggests in another answer)。在分布式TensorFlow上,tf.Print()会将其输出打印到运行该任务的标准输出。

还可以使用实验性的tf.contrib.util.constant_value()函数来获得const张量的值。

 

2.输出张量值的完整例子

确实,如果不执行计算图,没法输出Tensor(张量)的实际值,这里给出比较简单的示例。

无论何时评估计算图(使用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]

 

3.另外一个示例

再次强调,不可能在没有运行图的情况下检查值。

任何寻找打印值的简单示例的代码如下所示。代码可以在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]]

 

4.上述问题的可用完整代码

根据上面的分析,用文章开头特定的代码片段,你可以输出张量的值:

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

 

5.另外一个极简的示例

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

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)

 

6.针对上面问题的分析及相应代码

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

参考文献

 

--------------------------------------------------------------------------------------------------------------------

原文:https://vimsky.com/article/3675.html

 

上一篇:Collection集合的学习


下一篇:Collection