- 特性:两个都会给
tf.Variable
创建的变量加上命名前缀,但是tf.name_scope
不会给tf.get_varibale
创建的变量加上命名前缀,tf.variable_scope
会给tf.get_variable
创建的变量加上命名前缀,这么做是与这两个方法的作用有关的。
-
name_scope
的作用是为了在tensorboard
中有折叠的层次化显示组件,不至于所有组件都糊在一起,比如我们有一个generator
和一个discriminator
那么就可以这样:
with tf.name_scope(name = 'generator') as vs:
...
-
variable_scope
的所用是为保护和重用变量,比如我的模型中有两个LSTM
,那么我就应该不同的LSTM
设置不同的variable_scope
这样dynamic_rnn
内部的get_variable
就能正确的区分两个LSTM
的组件(因为dynamic_rnn
内部的get_variable
的name
都是一样的如果不使用variable_scope
进行保护的话,重用都不知道重用哪一个了)。
variable_scope
中reuse
的几种方法
-
reuse
的几种填写: None
表示查看上一层的当 reuse=tf.AUTO_REUSE
时,自动复用,如果变量存在则复用,不存在则创建。这是最安全的用法。
def foo():
with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = foo() # Creates v.
v2 = foo() # Gets the same, existing v.
assert v1 == v2
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v", [1])
assert v1 == v
- 所以
reuse
不要一上来就设置成True
,设置成tf.AUTO_REUSE
是最靠谱的。
with tf.variable_scope("foo", reuse=True):
v = tf.get_variable("v", [1])
# Raises ValueError("... v does not exists ...").
网友评论