tensorflow 学习笔记14 scope命名方式

来源:互联网 发布:罗马斗兽场 知乎 编辑:程序博客网 时间:2024/06/05 21:50
tf.get_variable tf.Variable不同的一点是,前者拥有一个变量检查机制,会检测已经存在的变量是否设置为共享变量,如果已经存在的变量没有设置为共享变量,TensorFlow 运行到第二个拥有相同名字的变量的时候,就会报错。
tf.variable_scope() 返回的只是 variable_scope,不管 name_scope.所以以后我们在使用tf.variable_scope().reuse_variables() 时可以无视name_scope
import tensorflow as tfwith tf.name_scope("a_name_scope"):    initializer = tf.constant_initializer(value=1)    #get_variable对name_scope无效使用    #使用tf.get_variable()的时候,tf.name_scope()就不会给 tf.get_variable()创建出来的Variable加前缀    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initializer=initializer)    #使用tf.Variable()的时候,tf.name_scope()和tf.variable_scope() 都会给 Variable 和 op 的 name属性加上前缀    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.initialize_all_variables())    print(var1.name)        # var1:0    print(sess.run(var1))   # [ 1.]    print(var2.name)        # a_name_scope/var2:0    print(sess.run(var2))   # [ 2.]    print(var21.name)       # a_name_scope/var2_1:0    print(sess.run(var21))  # [ 2.0999999]    print(var22.name)       # a_name_scope/var2_2:0    print(sess.run(var22))  # [ 2.20000005]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)    #用Variable方式就可以一直重复利用变量    var4 = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)    var4_reuse = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)    #用get_variable方式,为了能够重复利用变量 name='var3'    scope.reuse_variables()    #var3 与var3_reuse是同一个variable,共享变量,用reuse_variable比如RNN中train与test结构有所不同但参数都一致    var3_reuse = tf.get_variable(name='var3',)with tf.Session() as sess:    init = tf.global_variables_initializer()    sess.run(init)    print(var3.name)            # a_variable_scope/var3:0    print(sess.run(var3))       # [ 3.]    print(var4.name)            # a_variable_scope/var4:0    print(sess.run(var4))       # [ 4.]    print(var4_reuse.name)      # a_variable_scope/var4_1:0    print(sess.run(var4_reuse)) # [ 4.]    print(var3_reuse.name)      # a_variable_scope/var3:0    print(sess.run(var3_reuse)) # [ 3.]
运行结果: