TensorFlow没有一流的Tensor对象,这意味着在运行时执行的基础图中没有Tensor
概念。相反,该图由相互连接的op节点组成,代表操作。一个操作为其输出分配内存,这些输出可用于端点:0
, :1
等,并且您可以将这些端点中的每一个视为Tensor
。如果您具有与nodename:0
对应的tensor
,则可以将其值获取为sess.run(tensor)
或sess.run('nodename:0')
。执行粒度发生在操作级别,因此run
方法将执行op,该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)
创建一个名为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 op节点。
对于像tf.split
或tf.nn.top_k
这样的操作会创建具有多个终结点的节点,Python的session.run
调用会自动将输出包装在Tensor
对象的tuple
或collections.namedtuple
,这些对象可以单独获取。
0
我是TensorFlow的新手。在阅读现有文档时,我发现
tensor
一词确实令人困惑。因此,我需要澄清以下问题:tensor
和Variable
,tensor
之间是什么关系vs.
tf.constant
,'张量'tf.placeholder
?