为什么我们使用tf.name_scope()

时间:2017-03-10 02:15:38

标签: tensorflow

我一直在阅读他们编写的张量流教程

    with tf.name_scope('read_inputs') as scope:
          <insert code here>

我怀疑为什么我们使用name_scope?

    1) a = tf.constant(5)
    2) with tf.name_scope('s1') as scope:
            a = tf.constant(5)

1)和2)都是一回事。那么什么时候使用name_scope创造差异?

3 个答案:

答案 0 :(得分:16)

他们不是一回事。

import tensorflow as tf
c1 = tf.constant(42)
with tf.name_scope('s1'):
    c2 = tf.constant(42)
print(c1.name)
print(c2.name)

打印

Const:0
s1/Const:0

顾名思义,范围函数为您在其中创建的操作的名称创建范围。这会影响你如何引用张量,重用,图表在TensorBoard中的显示方式等等。

答案 1 :(得分:5)

我没有看到重用常量的用例,但这里有一些关于范围和变量共享的相关信息。

<强>作用域

  • name_scope会将范围添加为所有操作的前缀

  • variable_scope会将范围添加为所有变量和操作的前缀

实例化变量

  • tf.Variable() constructer前缀变量名称,包含当前name_scopevariable_scope

  • tf.get_variable()构造函数会忽略name_scope,并且仅使用当前variable_scope

  • 作为名称的前缀

例如:

with tf.variable_scope("variable_scope"):
     with tf.name_scope("name_scope"):
         var1 = tf.get_variable("var1", [1])

with tf.variable_scope("variable_scope"):
     with tf.name_scope("name_scope"):
         var2 = tf.Variable([1], name="var2")

可生产

var1 = <tf.Variable 'variable_scope/var1:0' shape=(1,) dtype=float32_ref>

var2 = <tf.Variable 'variable_scope/name_scope/var2:0' shape=(1,) dtype=string_ref>

重复使用变量

  • 始终使用tf.variable_scope来定义共享变量的范围

  • 重用变量的最简单方法是使用reuse_variables(),如下所示

with tf.variable_scope("scope"):
    var1 = tf.get_variable("variable1",[1])
    tf.get_variable_scope().reuse_variables()
    var2=tf.get_variable("variable1",[1])
assert var1 == var2
  • tf.Variable()总是会创建一个新变量,当使用已使用的名称构造变量时,它只会向其附加_1_2等 - 这会导致冲突:(< / LI>

答案 2 :(得分:0)

我将尝试使用一些宽松但易于理解的语言进行解释。

名称范围

通常用于在操作中将一些变量组合在一起。也就是说,它为您提供了关于此操作中包含多少个变量的说明。但是,对于这些变量,不考虑它们的存在。您只知道,确定,要完成此操作,我需要准备此,此和此变量。实际上,在使用tensorboard时,它可以帮助您将变量绑定在一起,因此您的绘图不会混乱。

可变范围

将其作为抽屉考虑。与名称空间相比,这具有更多的“物理”含义,因为这样的抽屉确实存在。相反,名称空间仅有助于了解其中包含哪些变量。

由于变量空间是“物理上”存在的,因此它限制了此变量已经存在,因此您无法再次重新定义它,并且如果要多次使用它们,则需要指出reuse