我想在类似以下的情况下使用tf.name_scope
:
my_scope = tf.name_scope('something')if cond_1: foo(my_scope)if cond_2: bar(my_scope)
我想避免使用with tf.name_scope('something') as scope
的写法,因为我不知道什么时候会第一次使用名称范围something
。简单的my_scope = tf.name_scope('something')
不起作用,会导致错误TypeError: expected string or buffer
。
目前我使用的是:
with tf.name_scope('something') as scope: passmy_scope = scopeif cond_1: foo(my_scope)if cond_2: bar(my_scope)
这种方法虽然有效,但非常不满意。
回答:
我不确定foo
和bar
应该做什么,但上面提供的代码片段中的两个my_scope
完全不同。
第一个my_scope
是一个上下文管理器,即contextlib.GeneratorContextManager
实例。第二个my_scope
(就像scope
一样)是一个普通的字符串,即"something/"
(参见源代码)。你可以用my_scope="something/"
达到完全相同的效果。根据错误TypeError: expected string or buffer,这正是foo
和bar
所期望的 – 一个字符串。
另外请注意,你可以获取上下文的引用,并在你喜欢的时候进入它。tf.name_scope
只是将名称推到堆栈顶部,然后在退出时弹出它。但如果你多次进入同一个名称范围,你会得到一个后缀:_1
、_2
、…