为了账号安全,请及时绑定邮箱和手机立即绑定

使用默认范围名称时不会重用 variable_scope

使用默认范围名称时不会重用 variable_scope

泛舟湖上清波郎朗 2021-08-17 16:57:35
我在重用变量时有一个关于子作用域的问题。这import tensorflow as tfdef make_bar():  with tf.variable_scope('bar'):    tf.get_variable('baz', ()) with tf.variable_scope('foo') as scope:  make_bar()  scope.reuse_variables()  make_bar()工作得很好,只foo/bar/baz创建了一个变量。但是,如果我更改make_bar为def make_bar(scope=None):  with tf.variable_scope(scope, 'bar'):    tf.get_variable('baz', ()) 代码现在失败了ValueError: Variable foo/bar_1/baz does not exist问题:为什么在使用default names时变量作用域重用会失败?如果是故意的,那么这个选择背后的理由是什么?
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

在您的示例中,您实际上并未使用范围 'foo'。您需要将参数传递给tf.variable_scope('foo', 'bar')or tf.variable_scope(scope, 'bar')。make_bar在任何一种情况下,您都在不带参数的情况下调用方法,这意味着在您的第一个示例中name_or_scope='bar',在第二个示例中name_or_scope=scope(带有 value None)和default_name='bar'.


这可能是你想要的:


import tensorflow as tf


def make_bar(scope=None):

    with tf.variable_scope(scope, 'bar'):

        tf.get_variable('baz', ())


with tf.variable_scope('foo') as scope:

    make_bar(scope)

    scope.reuse_variables()

    make_bar(scope)

我实际上建议不要使用默认参数,因为它们会像您的示例一样降低可读性。None示波器何时是您想要的答案?如果你测试它会更有意义,也许像这样?


import tensorflow as tf


def make_bar(scope=None):

    if scope is None:

        scope = 'default_scope'

    with tf.variable_scope(scope, 'bar'):

        tf.get_variable('baz', ())



with tf.variable_scope('foo') as scope:

    make_bar(scope)   # use foo scope

    scope.reuse_variables()

    make_bar()        # use 'default_scope'

但这会降低代码的可读性,并且更容易导致错误


查看完整回答
反对 回复 2021-08-17
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信