在Tensorflow中,使用get_variable()
生成的变量是以指定的name属性为唯一标识,并不是定义的变量名称。使用时一般通过name属性定位到具体变量,并将其共享到其他模型中去,实现变量共享。
Variable的用法
var1 = tf.Variable(1.0,name='firstvar')
print("var1:",var1.name)
var1 = tf.Variable(2.0,name='firstvar')
print("var1:",var1.name)
var2 = tf.Variable(3.0)
print("var2:",var2.name)
var2 = tf.Variable(4.0)
print("var2:",var2.name)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("var1:",var1.eval())
print("var2:",var2.eval())
以上程序的输出为:
var1: firstvar:0
var1: firstvar_1:0
var2: Variable:0
var2: Variable_1:0
var1: 2.0
var2: 4.0
以上代码定义了2次var1,可以看到在内存中生成了两个var1,因为他们的name属性其实是不一样的(虽然在定义的时候传入的参数name都是一样的)。对于图来讲后面的var1=2.0是生效的。
var2表明了:Variable如果在定义的时候没有传入name参数,系统会自动给加上一个名字。
get_variable()
get_var1 = tf.get_variable(name="firstvar",shape=[1],initializer=tf.constant_initializer(0.3))
print("get_var1:",get_var1.name)
get_var1 = tf.get_variable(name="firstvar",shape=[1],initializer=tf.constant_initializer(0.4))
print("get_var1:",get_var1.name)
输出为:
get_var1: firstvar_2:0
程序在定义第二个get_var1的时候会报错,原因在于使用get_variable定义变量只能定义一次指定名称的变量。同时犹豫变量firstvar在前面使用Variable定义过一次,所以系统会将该变量自动变成firstvar_2:0。
如果将最后一段定义get_var1的地方改成:
get_var1 = tf.get_variable(name="firstvar_new",shape=[1],initializer=tf.constant_initializer(0.4))
print("get_var1:",get_var1.name)
用first_new去重新命名name,就不会报错了。
同样的,新的get_var1值0.4会在图的计算中生效,而不是0.3。