在默认情况下不创建新范围的情况下,如何在 tensorflow 中重用变量范围?
How can you re-use a variable scope in tensorflow without a new scope being created by default?
我在图表的一部分创建了一个变量范围,后来在图表的另一部分我想将 OP 添加到现有范围。这相当于这个提炼的例子:
import tensorflow as tf
with tf.variable_scope('myscope'):
tf.Variable(1.0, name='var1')
with tf.variable_scope('myscope', reuse=True):
tf.Variable(2.0, name='var2')
print([n.name for n in tf.get_default_graph().as_graph_def().node])
产生:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope_1/var2/initial_value',
'myscope_1/var2',
'myscope_1/var2/Assign',
'myscope_1/var2/read']
我想要的结果是:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
我看到这个问题似乎没有直接解决问题的答案:TensorFlow, how to reuse a variable scope name
这是在上下文管理器中使用 as
和 somename
的一种直接方法。使用此 somename.original_name_scope
属性,您可以检索该范围,然后向其添加更多变量。下面是一个例子:
In [6]: with tf.variable_scope('myscope') as ms1:
...: tf.Variable(1.0, name='var1')
...:
...: with tf.variable_scope(ms1.original_name_scope) as ms2:
...: tf.Variable(2.0, name='var2')
...:
...: print([n.name for n in tf.get_default_graph().as_graph_def().node])
...:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
备注
另请注意,设置 reuse=True
是可选的;也就是说,即使您通过 reuse=True
,您仍然会得到相同的结果。
另一种方法(感谢 OP 本人!)是在 重用 变量范围的末尾添加 /
,如下例所示:
In [13]: with tf.variable_scope('myscope'):
...: tf.Variable(1.0, name='var1')
...:
...: # reuse variable scope by appending `/` to the target variable scope
...: with tf.variable_scope('myscope/', reuse=True):
...: tf.Variable(2.0, name='var2')
...:
...: print([n.name for n in tf.get_default_graph().as_graph_def().node])
...:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
备注:
请注意,设置 reuse=True
也是可选的;也就是说,即使您通过 reuse=True
,您仍然会得到相同的结果。
kmario23 提到的答案是正确的,但是 tf.get_variable
:
创建的变量有一个棘手的情况
with tf.variable_scope('myscope'):
print(tf.get_variable('var1', shape=[3]))
with tf.variable_scope('myscope/'):
print(tf.get_variable('var2', shape=[3]))
此代码段将输出:
<tf.Variable 'myscope/var1:0' shape=(3,) dtype=float32_ref>
<tf.Variable 'myscope//var2:0' shape=(3,) dtype=float32_ref>
看来tensorflow
还没有提供正式的方法来处理这种情况。我找到的唯一可能的方法是手动分配正确的名称(警告:不能保证正确性):
with tf.variable_scope('myscope'):
print(tf.get_variable('var1', shape=[3]))
with tf.variable_scope('myscope/') as scope:
scope._name = 'myscope'
print(tf.get_variable('var2', shape=[3]))
然后我们可以得到正确的名字:
<tf.Variable 'myscope/var1:0' shape=(3,) dtype=float32_ref>
<tf.Variable 'myscope/var2:0' shape=(3,) dtype=float32_ref>
我在图表的一部分创建了一个变量范围,后来在图表的另一部分我想将 OP 添加到现有范围。这相当于这个提炼的例子:
import tensorflow as tf
with tf.variable_scope('myscope'):
tf.Variable(1.0, name='var1')
with tf.variable_scope('myscope', reuse=True):
tf.Variable(2.0, name='var2')
print([n.name for n in tf.get_default_graph().as_graph_def().node])
产生:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope_1/var2/initial_value',
'myscope_1/var2',
'myscope_1/var2/Assign',
'myscope_1/var2/read']
我想要的结果是:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
我看到这个问题似乎没有直接解决问题的答案:TensorFlow, how to reuse a variable scope name
这是在上下文管理器中使用 as
和 somename
的一种直接方法。使用此 somename.original_name_scope
属性,您可以检索该范围,然后向其添加更多变量。下面是一个例子:
In [6]: with tf.variable_scope('myscope') as ms1:
...: tf.Variable(1.0, name='var1')
...:
...: with tf.variable_scope(ms1.original_name_scope) as ms2:
...: tf.Variable(2.0, name='var2')
...:
...: print([n.name for n in tf.get_default_graph().as_graph_def().node])
...:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
备注
另请注意,设置 reuse=True
是可选的;也就是说,即使您通过 reuse=True
,您仍然会得到相同的结果。
另一种方法(感谢 OP 本人!)是在 重用 变量范围的末尾添加 /
,如下例所示:
In [13]: with tf.variable_scope('myscope'):
...: tf.Variable(1.0, name='var1')
...:
...: # reuse variable scope by appending `/` to the target variable scope
...: with tf.variable_scope('myscope/', reuse=True):
...: tf.Variable(2.0, name='var2')
...:
...: print([n.name for n in tf.get_default_graph().as_graph_def().node])
...:
['myscope/var1/initial_value',
'myscope/var1',
'myscope/var1/Assign',
'myscope/var1/read',
'myscope/var2/initial_value',
'myscope/var2',
'myscope/var2/Assign',
'myscope/var2/read']
备注:
请注意,设置 reuse=True
也是可选的;也就是说,即使您通过 reuse=True
,您仍然会得到相同的结果。
kmario23 提到的答案是正确的,但是 tf.get_variable
:
with tf.variable_scope('myscope'):
print(tf.get_variable('var1', shape=[3]))
with tf.variable_scope('myscope/'):
print(tf.get_variable('var2', shape=[3]))
此代码段将输出:
<tf.Variable 'myscope/var1:0' shape=(3,) dtype=float32_ref>
<tf.Variable 'myscope//var2:0' shape=(3,) dtype=float32_ref>
看来tensorflow
还没有提供正式的方法来处理这种情况。我找到的唯一可能的方法是手动分配正确的名称(警告:不能保证正确性):
with tf.variable_scope('myscope'):
print(tf.get_variable('var1', shape=[3]))
with tf.variable_scope('myscope/') as scope:
scope._name = 'myscope'
print(tf.get_variable('var2', shape=[3]))
然后我们可以得到正确的名字:
<tf.Variable 'myscope/var1:0' shape=(3,) dtype=float32_ref>
<tf.Variable 'myscope/var2:0' shape=(3,) dtype=float32_ref>