我一直在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
的 Value ?
以下内容没有帮助:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
我知道图表在 Sessions
上运行,但是如果没有在 session
中运行图表,我是否可以检查 Tensor
对象的输出?
13 回答
不,如果不运行图形,你就看不到张量的内容(做
session.run()
) . 你唯一能看到的是:张量的维数(但我认为为TF的list of the operations计算它并不困难)
将用于生成张量的操作类型(
transpose_1:0
,random_uniform:0
)张量中的
元素类型(
float32
)我没有在文档中找到这个,但我相信变量的值(以及一些常量在分配时不计算) .
看看这个例子:
第一个例子,我只是启动一个恒定的随机数张量运行大致相同的时间,不可避免的昏暗(
0:00:00.003261
)在第二种情况下,实际评估常量并分配值,时间显然取决于暗淡(
0:00:01.244642
)并且你可以通过计算某些东西来更清楚(
d = tf.matrix_determinant(m1)
,记住时间将在O(dim^2.8)
中运行)附:我发现它是在documentation中解释的:
请注意
tf.Print()
将更改张量名称 . 如果您要打印的张量是占位符,则向其提供数据将失败,因为在进纸期间将找不到原始名称 . 例如:输出是:
根据上面的答案,您可以使用特定的代码段打印产品,如下所示:
虽然其他答案是正确的,在评估图表之前无法打印该值,但在评估图表之后,他们并没有谈到在图表中实际打印值的一种简单方法 .
评估图形时使用
run
或eval
查看张量值的最简单方法是使用Print操作,如下例所示:现在,每当我们评估整个图表时,例如使用
b.eval()
,我们得到:评估
Tensor
对象实际值的最简单[A]方法是将其传递给Session.run()
方法,或者在有默认会话时调用Tensor.eval()
(即在with tf.Session():
块中,或参见下文) . 通常[B],如果不在会话中运行某些代码,则无法打印张量的值 .如果您正在尝试编程模型,并且想要一种简单的方法来评估张量,tf.InteractiveSession允许您在程序开始时打开一个会话,然后将该会话用于所有
Tensor.eval()
(和Operation.run()
)调用 . 这在交互式设置中可以更容易,例如shell或IPython笔记本,当在任何地方传递Session
对象都很繁琐时 .这对于如此小的表达式来说可能看起来很愚蠢,但Tensorflow中的一个关键思想是延迟执行:构建大型复杂表达式非常便宜,当你想要评估它时,后端(你连接到它)使用
Session
)能够更有效地安排其执行(例如并行执行独立部分并使用GPU) .[A]:要打印张量的值而不将其返回到Python程序,可以使用tf.Print()运算符,如Andrzej suggests in another answer . 请注意,您仍然需要运行图形的一部分来查看此op的输出,该输出将打印到标准输出 . 如果您正在运行分布式TensorFlow,
tf.Print()
将其输出打印到运行该操作的任务的标准输出 . 这意味着如果您使用https://colab.research.google.com或任何其他Jupyter Notebook,那么您将无法在笔记本中看到tf.Print()的输出;在这种情况下,请参考this answer关于如何让它仍然打印 .[B]:您可能可以使用实验tf.contrib.util.constant_value()函数来获取常量张量的值,但是它并没有为许多运算符定义't intended for general use, and it isn't .
重申别人说的话,如果不运行图表就无法检查值 .
任何寻找打印值的简单示例的人都可以使用一个简单的代码段如下 . 代码可以在ipython笔记本中执行而无需任何修改
输出:
我认为你需要得到一些正确的基础知识 . 通过上面的示例,您已经创建了张量(多维数组) . 但是要使张量流真正起作用,你必须启动“ session " and run your " operation " in the session. Notice the word " session " and " operation” . 你需要知道使用tensorflow的4件事:
张量
运营
会话
图表
现在来自你写了什么,你给了张量,操作,但你没有会话运行,也没有图表 . 张量(图的边缘)流过图形并由操作(图形的节点)操纵 . 有默认图表,但您可以在会话中启动您的图表 .
当您说打印时,您只能访问您定义的变量或常量的形状 .
所以你可以看到你缺少的东西:
希望能帮助到你!
试试这个简单的代码! (这是自我解释)
基本上,在tensorflow中,当您创建任何类型的张量时,它们被创建并存储在其中,只有在您运行tensorflow会话时才能访问它 . 假设你已经创建了一个常数张量
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
没有运行会话,你可以得到
op
:一项行动 . 计算此张量的操作 .value_index
:一个int . 生成此张量的操作终点的索引 .dtype
:一个DType . 存储在此张量中的元素类型 .要获取值,您可以使用所需的张量运行会话,如下所示:
输出将是
我们得到两次打印的数组,因为会话只有张量常数通过而且我们有
c.eval()
您应该将TensorFlow核心程序视为由两个独立的部分组成:
构建计算图 .
运行计算图 .
因此,对于下面的代码,您只需构建计算图 .
您还需要要初始化TensorFlow程序中的所有变量,您必须显式调用特殊操作,如下所示:
现在您构建图并初始化所有变量,下一步是评估节点,您必须在会话中运行计算图 . 会话封装TensorFlow运行时的控件和状态 .
以下代码创建一个Session对象,然后调用其run方法运行足够的计算图来评估
product
:直到我执行完之后,即使在阅读完所有答案后,我也很难理解需要什么 . TensofFlow也是我的新手 .
但是仍然可能需要执行会话返回的值 .
您可以通过启用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 .