在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(张量)的实际值,这里给出比较简单的示例。
无论何时评估计算图(使用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).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]))
参考文献