猿问

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

我在重用变量时有一个关于子作用域的问题。这


import tensorflow as tf


def 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时变量作用域重用会失败?如果是故意的,那么这个选择背后的理由是什么?


泛舟湖上清波郎朗
浏览 131回答 2
2回答

MM们

在您的示例中,您实际上并未使用范围 '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 tfdef 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 tfdef 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'但这会降低代码的可读性,并且更容易导致错误
随时随地看视频慕课网APP

相关分类

Python
我要回答