从英文的解释上就可以看到:变量空间, 命名空间
with tf.name_scope("a_name_scope"): #为了更好的管理变量的命名空间而提出的,变量是该命名空间的变量
initializer2 = tf.constant_initializer(value=2)
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initializer=initializer2)
var2 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
var21 = tf.Variable(name='var2', initial_value=[2.1], dtype=tf.float32)
var22 = tf.Variable(name='var2', initial_value=[2.2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name)
print(sess.run(var1))
print(var2.name)
print(sess.run(var2))
print(var21.name)
print(sess.run(var21))
print(var22.name)
print(sess.run(var22))
比如这里,建立一块区域叫做a_name_scope,然后将tf.Variable申请的变量放到该空间中,在变量的属性name上打上该命名空间的标志,说明该变量是属于这一块空间。
而get_variable产生变量,但是该变量并不属于某一name_scope可以,看成get_variable的优先级更高,name_scope无法控制
它,类似于全局变量。
with tf.variable_scope("a_variable_scope") as scope:#变量空间是所有变量共享的空间,里面有所有变量
initializer = tf.constant_initializer(value=3)
var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer)
scope.reuse_variables()
var3_reuse = tf.get_variable(name='var3')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var3.name)
print(sess.run(var3))
print(var3_reuse.name)
print(sess.run(var3_reuse))
这里是说建立一个变量空间,然后在该变量空间下申请的变量都放在该空间中,然后打上标记,当需要重用该空间中变量时,就可以reuse_variable
def test(name=None):
with tf.variable_scope(name, default_name='scope') as scope:
w = tf.get_variable('w', shape=[2, 10])
test()
test()
ws = tf.trainable_variables()#返回需要训练的变量列表
for w in ws:
print(w.name)
上面这段代码,当变量空间重名时,会自动做一种延伸,而不会真的在重复。