variable_scope 和 name_scope的区别

从英文的解释上就可以看到:变量空间, 命名空间

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)

上面这段代码,当变量空间重名时,会自动做一种延伸,而不会真的在重复。

猜你喜欢

转载自blog.csdn.net/z2539329562/article/details/79841591