38

我是 TensorFlow 的新手。在阅读现有文档时,我发现这个术语tensor真的很混乱。因此,我需要澄清以下问题:

  1. tensorVariabletensor
    tf.constant、“张量”与之间的关系是什么tf.placeholder
  2. 它们是所有类型的张量吗?
4

4 回答 4

67

TensorFlow 没有一流的 Tensor 对象,这意味着Tensor在运行时执行的底层图中没有概念。相反,该图由相互连接的操作节点组成,表示操作。一个操作为其输出分配内存,这些输出在端点:0:1等上可用,您可以将这些端点中的每一个视为一个Tensor. 如果您有tensor对应的,nodename:0您可以将其值获取为sess.run(tensor)sess.run('nodename:0')。执行粒度发生在操作级别,因此该run方法将执行 op,它将计算所有端点,而不仅仅是:0端点。可能有一个没有输出的 Op 节点(比如tf.group) 在这种情况下,没有与之关联的张量。没有底层 Op 节点就不可能有张量。

您可以通过执行以下操作来检查底层图中发生的情况

tf.reset_default_graph()
value = tf.constant(1)
print(tf.get_default_graph().as_graph_def())

所以tf.constant你得到一个单一的操作节点,你可以使用sess.run("Const:0")或获取它sess.run(value)

同样,value=tf.placeholder(tf.int32)创建一个具有 name 的常规节点Placeholder,您可以将其作为feed_dict={"Placeholder:0":2}or提供feed_dict={value:2}。您不能在同一个调用中提供和获取占位符,但您可以通过在顶部session.run附加一个节点并获取它来查看结果。tf.identity

对于变量

tf.reset_default_graph()
value = tf.Variable(tf.ones_initializer()(()))
value2 = value+3
print(tf.get_default_graph().as_graph_def())

您会看到它创建了两个节点,并且Variable端点是在这两个节点上获取的有效值。但是有一个特殊的类型,意味着它可以用作变异操作的输入。Python 调用的结果是一个 Python对象,并且有一些 Python 魔法可以替代或取决于是否需要突变。由于大多数操作只有 1 个端点,因此被删除。另一个例子是--方法将创建一个连接到op 的新 op 节点。总结一下——根据使用情况,对 python 对象的操作喜欢并映射到不同的底层 TensorFlow 操作节点。Variable/read:0Variable:0reftf.VariableVariableVariable/read:0Variable:0:0Queueclose()CloseQueueVariableQueue

对于像tf.splitor那样tf.nn.top_k创建具有多个端点的节点的操作,Python 的session.run调用会自动将输出包装在可以单独获取的对象中tuple或对象中。collections.namedtupleTensor

于 2016-06-16T22:51:35.910 回答
14
于 2016-06-16T08:48:38.163 回答
10

正如其他人已经提到的,是的,它们都是张量。

我理解这些的方式是首先可视化和理解 1D、2D、3D、4D、5D 和 6D 张量,如下图所示。(来源:knoldus

张量定义

现在,在 TensorFlow 的上下文中,您可以想象如下图所示的计算图,

计算图

在这里,Ops 采用两个张量ab作为输入将张量与自身相乘,然后这些乘法的结果相加以产生结果张量t3。这些乘法加法 Op发生在计算图中的节点上。

而这些张量a可以b是常数张量、可变张量或占位符。没关系,只要它们具有相同的数据类型和兼容的形状(或broadcast能够)来实现操作。

于 2018-01-12T22:48:01.027 回答
-1

TensorFlow 的中心数据类型是张量。张量是计算的基础组件,也是 TensorFlow 中的基本数据结构。在不使用复杂的数学解释的情况下,我们可以说张量(在 TensorFlow 中)描述了一个多维数值数组,具有零维或 n 维数据集合,由秩、形状和类型决定。阅读更多:TensorFlow 中的张量是什么?

于 2018-05-20T06:54:38.573 回答