为什么同名的tf.name_scope不同?

时间:2017-08-14 08:18:34

标签: tensorflow

查看代码段:

import tensorflow as tf

with tf.name_scope('y'):
    a1 = tf.Variable(1,name='a')

with tf.name_scope('y'):
    a2 = tf.Variable(1,name='b')

print(a1.name)
print(a2.name)

输出

y/a:0
y_1/b:0

为什么变量a2的name_scope是y_1?

2 个答案:

答案 0 :(得分:5)

github上有一个关于这个主题的有趣讨论。

你可以做什么追加' /'最后,将其作为绝对标识符:

import tensorflow as tf

with tf.name_scope('y'):
    a1 = tf.Variable(1,name='a')

with tf.name_scope('y/'):
    a2 = tf.Variable(1,name='b')

print(a1.name)
print(a2.name)

哪个收益率:

y/a:0
y/b:0

同样适用于tf.variable_scope()

问题的底线很可能是Tensorflow无法知道您是否明确想要向范围附加某些内容,或者是否有人在其他地方创建了不同的范围并希望保护您免受无意的重复使用。通过附加' /'最后,您将名称转换为绝对标识符。

答案 1 :(得分:3)

tf.name_scope每次使用字符串作为name参数调用上下文管理器时,如果您不重要提供之前见过的名称,在这种情况下,通过调用unique_name(name)可以使范围的名称变得唯一。

如果要重新输入相同的名称范围,则必须将其捕获到某处,并将该范围用作name_scope的参数。

取自ops.py

的示例
  # Creates a scope called "nested"
  with g.name_scope("nested") as scope:
    nested_c = tf.constant(10.0, name="c")
    assert nested_c.op.name == "nested/c"
    # Creates a nested scope called "inner".
    with g.name_scope("inner"):
      nested_inner_c = tf.constant(20.0, name="c")
      assert nested_inner_c.op.name == "nested/inner/c"
    # Create a nested scope called "inner_1".
    with g.name_scope("inner"):
      nested_inner_1_c = tf.constant(30.0, name="c")
      assert nested_inner_1_c.op.name == "nested/inner_1/c"
      # Treats `scope` as an absolute name scope, and
      # switches to the "nested/" scope.
      with g.name_scope(scope):
        nested_d = tf.constant(40.0, name="d")
        assert nested_d.op.name == "nested/d"
        with g.name_scope(""):
          e = tf.constant(50.0, name="e")
          assert e.op.name == "e"

显然,您可以在名称的末尾加上斜杠(' /'),以避免它成为unique_name d。