在tensorflow中检索未命名变量

在tensorflow中检索未命名变量,tensorflow,Tensorflow,我训练了一个模型并将其保存在检查点中,但我刚刚意识到我忘记了在恢复模型时要检查的一个变量的名称 我知道如何从tensorflow中检索命名变量(g=tf.get\u default\u graph()然后g.get\u tensor\u by\u name([name]))。在这种情况下,我知道它的范围,但它没有命名。我试着在tf.GraphKeys.GLOBAL_VARIABLES中查找,但出于某种原因,它没有出现在那里 以下是它在模型中的定义方式: 以tf.name\u范围(“对比损失”)作

我训练了一个模型并将其保存在检查点中,但我刚刚意识到我忘记了在恢复模型时要检查的一个变量的名称

我知道如何从tensorflow中检索命名变量(
g=tf.get\u default\u graph()
然后
g.get\u tensor\u by\u name([name])
)。在这种情况下,我知道它的范围,但它没有命名。我试着在
tf.GraphKeys.GLOBAL_VARIABLES
中查找,但出于某种原因,它没有出现在那里

以下是它在模型中的定义方式:

以tf.name\u范围(“对比损失”)作为范围:
l2_dist=tf.cast(tf.sqrt(1e-4+tf.reduce_sum(tf.subtract(pred_left,pred_right),1)),tf.float32)#我想要的变量
#我在这里用它来计算另一个命名的张量,如果这有帮助的话。
对比损失=对比损失(l2区)
损失=tf.减少金额(con\u损失,name=“损失”)

有没有办法找到没有名字的变量

首先,继我的第一条评论之后,有理由认为给定的名称范围不起作用。从中,如果提供范围,则只返回具有指定名称的变量或操作。那就完了

您可以尝试的一件事是,使用以下命令列出您网络中每个节点的名称:

print([tf.get_default_graph().as_graph_def().node]中节点的node.name])
或者,当从检查点恢复时:

saver=tf.train.import\u meta\u图(/path/to/meta/graph)
sess=tf.Session()
saver.restore(ses、/path/to/checkpoints)
graph=sess.graph
打印([node.name用于图形中的节点。如图所示\u def().node])
另一个选项是使用tensorboard或Jupyter笔记本和命令显示图形。现在可能有一个内置的
show_graph
,但该链接指向一个定义了一个的git存储库。然后,您必须在图形中搜索您的操作,然后可能使用以下方法检索它:

my_op=tf.get_集合('full_operation_name')[0]
如果希望将来对其进行设置,以便按名称检索,则需要使用以下命令将其添加到集合中:

my_op=tf.some_操作(stuff,name='my_op')
tf.将_添加到_集合(“我的_op_名称”,我的_op)
然后通过还原图形,然后使用以下方法检索:

my\u restored\u op=tf.get\u集合('my\u op\u name')[0]

您也可以通过命名它,然后在
tf.get_collection
中指定它的范围来获取,但我不确定。可以找到更多信息和有用的教程。

tf.get\u集合不适用于未命名变量。因此,请列出以下操作:

graph = sess.graph
print(graph.get_operations())
。。。在列表中找到张量,然后:

global_step_tensor = graph.get_tensor_by_name('complete_operation_name:0')

我发现这对理解这些现象背后的机制非常有帮助。

。基本上,您可以使用
tf.get\u collection
指定作用域。嗯,我看到了-
tf.GraphKeys.GLOBAL\u VARIABLES
中没有出现变量,尝试进一步指定作用域会返回一个空数组。现在我想起来,这有点奇怪,因为我应该把命名变量
loss
也放在范围内…不知道发生了什么。它看起来像
tf.GraphKeys.GLOBAL\u VARIABLES
只显示用
tf.variable
定义的变量。哦,对了,因为你的
l2\u dist
是一个操作,不是一个变量。我要去参加一个会议,但如果你还没弄明白的话,我回来后会尽力帮忙的。查看检索操作。也许这是一个愚蠢的评论,但对我来说,再次获取训练模型并尝试在那里恢复变量似乎更容易。应为其分配与第一次运行时相同的名称。然后复制到命名变量并再次保存。我不确定,但从理论上讲,它应该可以胜任。谢谢,这非常有用!作为b/w检索操作与张量区别的后续——如果我确实命名了l2_dist cast操作,我将如何检索它?它是graph.get_tensor_by_name(“对比损失/l2_dist:0”)还是graph.get_operation_by_name(“对比损失/l2_dist:0”)还是….?作为测试,我尝试了命名cast操作(
l2_dist=tf.cast(..,tf.float32,name=“l2_dist”
)并试图检索它,但我似乎在操作或张量列表中找不到它。在某种程度上,强制转换是不同的吗?@Jess更新了我的答案,希望能解决你的问题。我最近一直在努力解决这个问题;希望它能帮上忙!问题是如何在不知道名称的情况下获取张量。
按名称获取张量。
在任务中提到离子