在tensorflow中检索未命名的变量

Jes*_*ess 2 tensorflow

我已经训练了一个模型并将其保存在检查点中,但只是意识到我忘记在恢复模型时命名一个我想要检查的变量.

我知道如何从tensorflow(g = tf.get_default_graph()然后g.get_tensor_by_name([name]))检索命名变量.在这种情况下,我知道它的范围,但它是未命名的.我试过看了tf.GraphKeys.GLOBAL_VARIABLES,但由于某种原因它没有出现在那里.

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

with tf.name_scope("contrastive_loss") as scope:
    l2_dist = tf.cast(tf.sqrt(1e-4 + tf.reduce_sum(tf.subtract(pred_left, pred_right), 1)), tf.float32) # the variable I want

    # I use it here when calculating another named tensor, if that helps.
    con_loss = contrastive_loss(l2_dist) 
    loss = tf.reduce_sum(con_loss, name="loss")
Run Code Online (Sandbox Code Playgroud)

有没有找到没有名字的变量的方法?

Eng*_*ero 7

首先,对我的第一条评论进行跟进,tf.get_collection鉴于名称范围不起作用,这是有意义的.从文档中,如果您提供范围,则仅返回具有指定名称的变量或操作.所以那就是了.

您可以尝试的一件事是列出您的每个节点的名称Graph:

print([node.name for node in tf.get_default_graph().as_graph_def().node])
Run Code Online (Sandbox Code Playgroud)

或者,从检查点恢复时:

saver = tf.train.import_meta_graph(/path/to/meta/graph)
sess = tf.Session()
saver.resore(sess, /path/to/checkpoints)
graph = sess.graph
print([node.name for node in graph.as_graph_def().node])
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用tensorboard或Jupyter Notebook和show_graph命令显示图形.show_graph现在可能有一个内置,但该链接是一个git存储库,其中定义了一个.然后,您必须在图表中搜索您的操作,然后可能通过以下方式检索它:

my_op = tf.get_collection('full_operation_name')[0]
Run Code Online (Sandbox Code Playgroud)

如果您希望将来进行设置以便按名称检索它,则需要使用以下命令将其添加到集合中tf.add_to_collection:

my_op = tf.some_operation(stuff, name='my_op')
tf.add_to_collection('my_op_name', my_op)
Run Code Online (Sandbox Code Playgroud)

然后通过恢复图表然后使用以下命令检索它:

my_restored_op = tf.get_collection('my_op_name')[0]
Run Code Online (Sandbox Code Playgroud)

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