如何理解 TensorFlow 中的术语“张量”?
How to understand the term `tensor` in TensorFlow?
我是 TensorFlow 的新手。在阅读现有文档时,我发现术语 tensor
非常令人困惑。因此,我需要澄清以下问题:
tensor
和Variable
有什么关系,tensor
对比 tf.constant
、'tensor' 对比 tf.placeholder
?
- 它们都是张量类型吗?
来自glossary:
A Tensor is a typed multi-dimensional array. For example, a 4-D array of floating point numbers representing a mini-batch of images with dimensions [batch, height, width, channel].
基本上,每个 data 都是 TensorFlow 中的张量(因此得名):
- 占位符是张量,您可以向其输入值(使用
sess.run()
中的 feed_dict
参数)
- 变量是可以更新的张量(
var.assign()
)。从技术上讲,tf.Variable
不是 tf.Tensor
的子类,但
tf.constant
只是最基本的Tensor,它包含了创建时给定的固定值
然而,在图中,每个节点都是一个操作,可以将张量作为输入或输出。
TensorFlow 没有 first-class 张量对象,这意味着在运行时执行的基础图中没有 Tensor
的概念。相反,该图由相互连接的 op 节点组成,代表操作。操作为其输出分配内存,这些输出在端点 :0
、:1
等上可用,您可以将这些端点中的每一个视为 Tensor
。如果你有 tensor
对应 nodename:0
你可以获取它的值作为 sess.run(tensor)
或 sess.run('nodename:0')
。执行粒度发生在操作级别,因此 run
方法将执行计算所有端点的操作,而不仅仅是 :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)
创建一个名称为 Placeholder
的常规节点,您可以将其作为 feed_dict={"Placeholder:0":2}
或 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
和 Variable/read
,:0
端点是在这两个节点上获取的有效值。但是 Variable:0
有一个特殊的 ref
类型,这意味着它可以用作变异操作的输入。 Python 调用 tf.Variable
的结果是一个 Python Variable
对象,并且有一些 Python 魔法可以替代 Variable/read:0
或 Variable:0
取决于关于是否需要突变。由于大多数操作只有 1 个端点,因此 :0
被删除。另一个例子是 Queue
-- close()
方法将创建一个新的 Close
op 节点连接到 Queue
op。总而言之——对 python 对象(如 Variable
和 Queue
的操作映射到不同的底层 TensorFlow 操作节点,具体取决于使用情况。
对于像 tf.split
或 tf.nn.top_k
这样创建具有多个端点的节点的操作,Python 的 session.run
调用会自动将输出包装在 tuple
或 collections.namedtuple
个可以单独获取的 Tensor
个对象。
正如其他人已经提到的,是的,它们都是张量。
我理解这些的方法是首先可视化和理解 1D、2D、3D、4D、5D 和 6D 张量,如下图所示。 (来源:knoldus)
现在,在 TensorFlow 的上下文中,您可以想象一个如下图所示的计算图,
这里,Op
s取两个张量a
和b
作为输入; 将张量与自身相乘,然后加上这些乘法的结果以产生结果张量t3
。这些乘法和加法Op
发生在计算图中的节点。
而这些张量a
和b
可以是常数张量,也可以是变量张量,也可以是占位符。没关系,只要它们具有相同的数据类型和兼容的形状(或broadcast
能够)来实现操作。
TensorFlow 的核心数据类型是张量。张量是计算的基础组件,也是 TensorFlow 中的基本数据结构。在不使用复杂的数学解释的情况下,我们可以说张量(在 TensorFlow 中)描述了一个多维数值数组,具有零维或 n 维数据集合,由等级、形状和 type.Read 确定更多:What is tensors in TensorFlow?
我是 TensorFlow 的新手。在阅读现有文档时,我发现术语 tensor
非常令人困惑。因此,我需要澄清以下问题:
tensor
和Variable
有什么关系,tensor
对比tf.constant
、'tensor' 对比tf.placeholder
?- 它们都是张量类型吗?
来自glossary:
A Tensor is a typed multi-dimensional array. For example, a 4-D array of floating point numbers representing a mini-batch of images with dimensions [batch, height, width, channel].
基本上,每个 data 都是 TensorFlow 中的张量(因此得名):
- 占位符是张量,您可以向其输入值(使用
sess.run()
中的feed_dict
参数) - 变量是可以更新的张量(
var.assign()
)。从技术上讲,tf.Variable
不是tf.Tensor
的子类,但 tf.constant
只是最基本的Tensor,它包含了创建时给定的固定值
然而,在图中,每个节点都是一个操作,可以将张量作为输入或输出。
TensorFlow 没有 first-class 张量对象,这意味着在运行时执行的基础图中没有 Tensor
的概念。相反,该图由相互连接的 op 节点组成,代表操作。操作为其输出分配内存,这些输出在端点 :0
、:1
等上可用,您可以将这些端点中的每一个视为 Tensor
。如果你有 tensor
对应 nodename:0
你可以获取它的值作为 sess.run(tensor)
或 sess.run('nodename:0')
。执行粒度发生在操作级别,因此 run
方法将执行计算所有端点的操作,而不仅仅是 :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)
创建一个名称为 Placeholder
的常规节点,您可以将其作为 feed_dict={"Placeholder:0":2}
或 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
和 Variable/read
,:0
端点是在这两个节点上获取的有效值。但是 Variable:0
有一个特殊的 ref
类型,这意味着它可以用作变异操作的输入。 Python 调用 tf.Variable
的结果是一个 Python Variable
对象,并且有一些 Python 魔法可以替代 Variable/read:0
或 Variable:0
取决于关于是否需要突变。由于大多数操作只有 1 个端点,因此 :0
被删除。另一个例子是 Queue
-- close()
方法将创建一个新的 Close
op 节点连接到 Queue
op。总而言之——对 python 对象(如 Variable
和 Queue
的操作映射到不同的底层 TensorFlow 操作节点,具体取决于使用情况。
对于像 tf.split
或 tf.nn.top_k
这样创建具有多个端点的节点的操作,Python 的 session.run
调用会自动将输出包装在 tuple
或 collections.namedtuple
个可以单独获取的 Tensor
个对象。
正如其他人已经提到的,是的,它们都是张量。
我理解这些的方法是首先可视化和理解 1D、2D、3D、4D、5D 和 6D 张量,如下图所示。 (来源:knoldus)
现在,在 TensorFlow 的上下文中,您可以想象一个如下图所示的计算图,
这里,Op
s取两个张量a
和b
作为输入; 将张量与自身相乘,然后加上这些乘法的结果以产生结果张量t3
。这些乘法和加法Op
发生在计算图中的节点。
而这些张量a
和b
可以是常数张量,也可以是变量张量,也可以是占位符。没关系,只要它们具有相同的数据类型和兼容的形状(或broadcast
能够)来实现操作。
TensorFlow 的核心数据类型是张量。张量是计算的基础组件,也是 TensorFlow 中的基本数据结构。在不使用复杂的数学解释的情况下,我们可以说张量(在 TensorFlow 中)描述了一个多维数值数组,具有零维或 n 维数据集合,由等级、形状和 type.Read 确定更多:What is tensors in TensorFlow?