TensorFlow:如何命名tf.get_variable的操作

时间:2016-08-28 00:35:16

标签: python tensorflow

我的问题与此Tensorflow: How to get a tensor by name?

有关

我可以给操作命名。但实际上他们的名字不同。 例如:

In [11]: with tf.variable_scope('test_scope') as scope:
    ...:     a = tf.get_variable('a',[1])
    ...:     b = tf.maximum(1,2, name='b')
    ...:     print a.name
    ...:     print b.name
    ...:     
    ...:     
    ...:     
test_scope/a:0
test_scope_1/b:0

In [12]: with tf.variable_scope('test_scope') as scope:
    ...:     scope.reuse_variables()
    ...:     a = tf.get_variable('a',[1])
    ...:     b = tf.maximum(1,2, name='b')
    ...:     print a.name
    ...:     print b.name
    ...:     
    ...:     
    ...:     
test_scope/a:0
test_scope_2/b:0

tf.get_variable创建的变量与我要求的名称完全相同。操作为作用域添加前缀。

我想命名我的操作,以便我可以得到它。在我的情况下,我想在我的范围内获得b tf.get_variable('b')

我该怎么办?由于此问题https://github.com/tensorflow/tensorflow/issues/1325,我无法使用tf.Variable执行此操作 可能是我需要为变量范围或操作设置附加参数,或以某种方式使用tf.get_variable

2 个答案:

答案 0 :(得分:4)

我不同意@rvinas的回答,你不需要创建一个变量来保存你想要检索的张量值。您只需使用正确名称的graph.get_tensor_by_name来检索张量:

with tf.variable_scope('test_scope') as scope:
    a = tf.get_variable('a',[1])
    b = tf.maximum(1,2, name='b')

print a.name  # should print 'test_scope/a:0'
print b.name  # should print 'test_scope/b:0'

现在您要重新创建相同的范围并返回ab 对于b,您甚至不需要在范围内,只需要b的确切名称。

with tf.variable_scope('test_scope') as scope:
    scope.reuse_variables()
    a2 = tf.get_variable('a', [1])

graph = tf.get_default_graph()
b2 = graph.get_tensor_by_name('test_scope/b:0')

assert a == a2
assert b == b2

答案 1 :(得分:3)

tf.get_variable()无法进行操作。因此,我将定义一个存储tf.maximum(1,2)的新变量,以便稍后检索它:

import tensorflow as tf

with tf.variable_scope('test_scope') as scope:
    a1 = tf.get_variable('a', [1])
    b1 = tf.get_variable('b', initializer=tf.maximum(1, 2))

with tf.variable_scope('test_scope') as scope:
    scope.reuse_variables()
    a2 = tf.get_variable('a', [1])
    b2 = tf.get_variable('b', dtype=tf.int32)

assert a1 == a2
assert b1 == b2

请注意,您需要使用b定义tf.get_variable(),以便稍后检索。