在tensorflow中检索未命名变量
我训练了一个模型并将其保存在检查点中,但我刚刚意识到我忘记了在恢复模型时要检查的一个变量的名称 我知道如何从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范围(“对比损失”)作
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更新了我的答案,希望能解决你的问题。我最近一直在努力解决这个问题;希望它能帮上忙!问题是如何在不知道名称的情况下获取张量。按名称获取张量。
在任务中提到离子