TensorFlow没有一流的Tensor对象,这意味着Tensor
在运行时执行的基础图中没有任何概念。相反,该图由相互连接的op节点组成,代表操作。操作分配内存的输出,这些都可以在端点上:0
,:1
等等,你可以认为这些端点作为的Tensor
。如果具有tensor
,则nodename:0
可以将其值提取为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)
创建一个具有name的常规节点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
是一个PythonVariable
对象,并且有一些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
调用会自动将输出包装在tuple
或可单独获取collections.namedtuple
的Tensor
对象中。