TensorFlow 如何命名张量?
Posted
技术标签:
【中文标题】TensorFlow 如何命名张量?【英文标题】:How does TensorFlow name tensors? 【发布时间】:2016-07-09 03:07:41 【问题描述】:不知道这是不是正确的理解:
所有张量都派生自某个操作,并且操作要么在构造函数中指定名称,要么为特定类型的操作指定默认名称。如果名称不是唯一的,TensorFlow 会通过附加 "_1"
、"_2"
等自动处理此问题。具有 n 个张量输出的操作将这些张量命名为 "op_name:0"
、"op_name:1"
、...、"op_name:n-1"
。
似乎出现了一个问题:如果x
是tf.Variable
,那么x.name
给出"variable_name:0"
。这令人困惑:"variable_name"
指的是什么?
【问题讨论】:
【参考方案1】:您对Tensor
命名的观察是绝对正确的:Tensor
的名称是
-
产生它的操作的名称,
冒号 (
:
) 和
该张量在产生它的操作的输出中的索引。
因此,名为 "foo:2"
的张量是名为 "foo"
的操作在位置 2 的输出(索引从零开始)。
tf.Variable
对象的naming 有点奇怪。每个tf.Variable
都包含一个可变张量 对象,该对象保存变量(以及一些其他张量)的状态。 "Variable"
op(在您的示例中名为 "variable_name"
)每次运行时都会“产生”这个可变张量作为其第 0 个输出,因此可变张量的名称是 "variable_name:0"
。
由于tf.Variable
与tf.Tensor
几乎无法区分——因为它可以在相同的地方使用——我们决定让变量名称类似于张量名称,因此Variable.name
属性返回的名称可变张量。 (这与 tf.QueueBase
和 tf.ReaderBase
对象形成对比,它们不可直接用作张量(相反,您必须在它们上调用方法来创建对其状态进行操作的操作),所以这些不有一个类似张量的名称。)
【讨论】:
有没有一种简单的方法来产生输出名称?没有 pb 文件,只有检查点? 有没有一个例子来说明规则 3:产生它的操作的输出中该张量的索引? @Alpha Sure:print(tf.split([0, 1, 2, 3, 4, 5], 5, name="split_op")[3].name)
,在"split_op"
的输出中打印索引 3 处的张量名称,将打印"split_op:3"
。
@mrry 挑剔:应该是 print(tf.split([0, 1, 2, 3, 4], 5, name="split_op")[3].name) (Array大小为 6 的不分为 5 个部分)。感谢您的评论,顺便说一句,它为我清除了一切。以上是关于TensorFlow 如何命名张量?的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow中张量(tensor)的属性——维数(阶)形状和数据类型
如何在 pytorch 和 tensorflow 中使用张量核心?