zoukankan      html  css  js  c++  java
  • [翻译] Tensorflow中name scope和variable scope的区别是什么

    翻译自:https://stackoverflow.com/questions/35919020/whats-the-difference-of-name-scope-and-a-variable-scope-in-tensorflow

    问题:下面这几个函数的区别是什么?

    tf.variable_op_scope(values, name, default_name, initializer=None)
    Returns a context manager for defining an op that creates variables. This context manager validates that the given values are from the same graph, ensures that that graph is the default graph, and pushes a name scope and a variable scope.

    tf.op_scope(values, name, default_name=None) Returns a context manager for use when defining a Python op. This context manager validates that the given values are from the same graph, ensures that that graph is the default graph, and pushes a name scope.

    tf.name_scope(name)
    Wrapper for Graph.name_scope() using the default graph. See Graph.name_scope() for more details.

    tf.variable_scope(name_or_scope, reuse=None, initializer=None)
    Returns a context for variable scope. Variable scope allows to create new variables and to share already created ones while providing checks to not create or share by accident. For details, see the Variable Scope How To, here we present only a few basic examples.

    回答1:

           首先简单介绍一下变量共享(variable sharing)。这是Tensorflow中的一种机制,它允许在代码的不同位置可以访问到共享变量(在不需要传递变量引用的情况下)。tf.get_variable方法可以将变量的名字作为参数,以创建具有该名称的新变量或者如果已经存在这个变量了,就取回这个变量。这与 tf.Variable是不同的。每次调用 tf.Variable都会创建一个新的变量(如果具有此名称的变量已经存在,则可能向变量名添加后缀)。针对共享变量机制,引进了scope (variable scope) 。

           结果,我们有2中不同的scopes类型:

    这两个scopes在所有的操作(operation)和使用tf.Variable创建的变量上都有相同的作用。

           然而,tf.get_variable会忽略name scope,我们可以看看如下的例子:

    with tf.name_scope("my_scope"):
        v1 = tf.get_variable("var1", [1], dtype=tf.float32)
        v2 = tf.Variable(1, name="var2", dtype=tf.float32)
        a = tf.add(v1, v2)
    
    print(v1.name)  # var1:0
    print(v2.name)  # my_scope/var2:0
    print(a.name)   # my_scope/Add:0

           在一个scope中使用tf.get_variable来使得变量可以被访问唯一方法就是使用一个variable scope,例子如下:

    with tf.variable_scope("my_scope"):
        v1 = tf.get_variable("var1", [1], dtype=tf.float32)
        v2 = tf.Variable(1, name="var2", dtype=tf.float32)
        a = tf.add(v1, v2)
    
    print(v1.name)  # my_scope/var1:0
    print(v2.name)  # my_scope/var2:0
    print(a.name)   # my_scope/Add:0

           这可以使得我们在程序的不同地方可以很容易的共享变量,甚至在不同的name scope中:

    with tf.name_scope("foo"):
        with tf.variable_scope("var_scope"):
            v = tf.get_variable("var", [1])
    with tf.name_scope("bar"):
        with tf.variable_scope("var_scope", reuse=True):
            v1 = tf.get_variable("var", [1])
    assert v1 == v
    print(v.name)   # var_scope/var:0
    print(v1.name)  # var_scope/var:0

    更新:

    Tensorflow版本r0.11之后,op_scope 和 variable_op_scope都被弃用了,替代的是op_scope 和 variable_op_scope

    回答2:

           举了一个例子,并将其可视化。

    import tensorflow as tf
    def scoping(fn, scope1, scope2, vals):
        with fn(scope1):
            a = tf.Variable(vals[0], name='a')
            b = tf.get_variable('b', initializer=vals[1])
            c = tf.constant(vals[2], name='c')
            with fn(scope2):
                d = tf.add(a * b, c, name='res')
    
            print '
      '.join([scope1, a.name, b.name, c.name, d.name]), '
    '
        return d
    
    d1 = scoping(tf.variable_scope, 'scope_vars', 'res', [1, 2, 3])
    d2 = scoping(tf.name_scope,     'scope_name', 'res', [1, 2, 3])
    
    with tf.Session() as sess:
        writer = tf.summary.FileWriter('logs', sess.graph)
        sess.run(tf.global_variables_initializer())
        print sess.run([d1, d2])
        writer.close()

    输出结果如下:

    scope_vars
      scope_vars/a:0
      scope_vars/b:0
      scope_vars/c:0
      scope_vars/res/res:0 
    
    scope_name
      scope_name/a:0
      b:0
      scope_name/c:0
      scope_name/res/res:0 

    在TensorBoard中可视化如下:

    从上面的可以看出来,tf.variable_scope()为所有变量(不管你是怎么创建的)、操作(ops)、常量(constant)添加一个前缀,而tf.name_scope()会忽视使用tf.get_variable()创建的变量,因为它假设你知道你使用的变量位于哪个scope中。

     Sharing variables文档中告诉你:

    tf.variable_scope(): Manages namespaces for names passed to tf.get_variable().

    更详细的可以查看官方文档。

  • 相关阅读:
    [BZOJ3829][Poi2014]FarmCraft 贪心
    【BZOJ 3144】 [Hnoi2013]切糕 真·最小割
    【BZOJ1458】士兵占领 最大流的模板题
    【COGS 14】 [网络流24题] 搭配飞行员 网络流板子题
    【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
    【BZOJ4325】NOIP2015 斗地主 搜索+贪心
    【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
    【NOIP模拟赛】天神下凡 动态开点线段树
    【NOIP模拟赛】藏宝图 最小生成树
    【NOIP模拟赛】黑红树 期望概率dp
  • 原文地址:https://www.cnblogs.com/hejunlin1992/p/7783881.html
Copyright © 2011-2022 走看看