我一直在使用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)

我知道图在会话上运行,但是没有任何方法可以检查张量对象的输出而不在会话中运行图吗?


当前回答

不,你不能在不运行图(执行session.run())的情况下看到张量的内容。你能看到的只有:

张量的维数(但我假设对TF的操作列表计算它并不难) 用于生成张量(transpose_1:0, random_uniform:0)的操作类型。 张量中元素的类型(float32)

我没有在文档中找到这一点,但我相信变量的值(和一些常数在赋值时没有计算)。


看看这个例子:

import tensorflow as tf
from datetime import datetime
dim = 7000

第一个例子中,我刚刚启动了一个常数的随机数张量运行的时间几乎是相同的不管dim (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_行列式(m1),记住时间将以O(dim^2.8)为单位运行)

附注:我在文档中找到了解释:

张量对象是运算结果的符号句柄, 但是实际上并不保存操作输出的值。

其他回答

不,你不能在不运行图(执行session.run())的情况下看到张量的内容。你能看到的只有:

张量的维数(但我假设对TF的操作列表计算它并不难) 用于生成张量(transpose_1:0, random_uniform:0)的操作类型。 张量中元素的类型(float32)

我没有在文档中找到这一点,但我相信变量的值(和一些常数在赋值时没有计算)。


看看这个例子:

import tensorflow as tf
from datetime import datetime
dim = 7000

第一个例子中,我刚刚启动了一个常数的随机数张量运行的时间几乎是相同的不管dim (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_行列式(m1),记住时间将以O(dim^2.8)为单位运行)

附注:我在文档中找到了解释:

张量对象是运算结果的符号句柄, 但是实际上并不保存操作输出的值。

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

使用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)

特遣部队。Print现在已弃用,下面是如何使用tf。而是打印(小写p)。

虽然运行会话是一个很好的选择,但它并不总是正确的方法。例如,你可能想在一个特定的会话中打印一些张量。

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

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传播到会话调用是很麻烦的。然后,特遣部队。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.

你可以使用Keras,一行回答将使用eval方法,如下所示:

import keras.backend as K
print(K.eval(your_tensor))