variable_scope和name_scope有什么区别? [重复]
python
tensorflow
4
0

variable_scopename_scope什么name_scope变量范围教程讨论了variable_scope隐式打开name_scope 。我还注意到,在name_scope中创建变量name_scope自动将其名称扩展为作用域名称。那么区别是什么呢?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

在尝试通过创建一个简单的示例来可视化所有内容之前,我在理解variable_scopename_scope (它们看起来几乎相同)之间的区别时遇到了问题:

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 '\n  '.join([scope1, a.name, b.name, c.name, d.name]), '\n'
    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 

如果打开TB,您会看到类似的图案(因为您看到bscope_name矩形的外部): 在此处输入图片说明


这给你答案

现在,您看到tf.variable_scope()在所有变量(无论如何创建它们),ops,常量的名称之前添加了一个前缀。另一方面, tf.name_scope()忽略使用tf.get_variable()创建的变量,因为它假定您知道要使用哪个变量以及在哪个范围内。

关于共享变量的良好文档告诉您

tf.variable_scope() :管理传递给tf.get_variable()名称的名称空间。

同一文档提供了更多详细信息,“可变作用域”如何工作以及何时有用。

收藏
评论

当您使用tf.get_variable而不是tf.Variable创建变量时,Tensorflow将开始检查使用相同方法创建的var的名称,以查看它们是否冲突。如果这样做,将引发异常。如果您使用tf.get_variable创建了一个var并尝试使用tf.name_scope上下文管理器更改变量名称的前缀,则不会阻止Tensorflow引发异常。在这种情况下,只有tf.variable_scope上下文管理器才能有效地更改var的名称。或者,如果要重用变量,则应在第二次创建var之前调用scope.reuse_variables()。

总而言之, tf.name_scope只是向在该范围内创建的所有张量添加前缀(使用tf.get_variable创建的var除外),而tf.variable_scope向使用tf.get_variable创建的变量添加前缀。

收藏
评论

tf.variable_scopetf.name_scope用于处理Variable重用。如您tf.name_scope ,它的作用不只是tf.name_scope ,因此没有真正的理由使用tf.name_scope :毫不奇怪, TF开发人员建议仅使用tf.variable_scope

我对仍然tf.name_scope理解是,这两者的行为存在细微的不兼容性,这使tf.variable_scope不能替代tf.name_scope

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号