从英文的解释上就可以看到:变量空间, 命名空间
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)
上面这段代码,当变量空间重名时,会自动做一种延伸,而不会真的在重复。