tf.Variable与tf.get_variable
tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。 当然,变量也可以通过tf.Varivale来创建。当tf.get_variable用于变量创建时,和tf.Variable的功能基本等价。
#以下两个定义是等价的:
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape=[1], name='v')
tf.Variable() 和tf.get_variable()的区别:
tf.Variable() 每次调用都会产生一个新的变量,他会自动检测命名冲突并自行处理,变量名称是一个可选参数,例如:
a1 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')
a2 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')
print(a1.name)
print(a2.name)
print(a1==a2)
运行结果:
f1/a1:0
f1/a1_1:0
False # a2实际变成了a1_1并且和a1 不是同一个变量
tf.get_variable()则不同,遇到重命名的变量创建且变量名没有设置成共享变量(所谓的共享是指在同一参数空间下的共享,参数空间名称不一样就不能共享了)时,就会报错 ;变量名称这个参数是必填参数,tf.get_variable()会根据这个参数去创建或者获取变量。tf.Variable:tf.Variable的变量名是一个可选项,通过name=’v’的形式给出。
tf.name_scope()
tf.name_scope()主要用于管理图中各种op,而tf.variable_scope()主要用于管理图中变量的名字,这两个函数在大部分情况下是等价的,唯一的区别是tf.get_variable()创建的变量名不受 name_scope 的影响(不受它的约束):
首先是tf.variable_scope:
with tf.variable_scope('foo'):
a = tf.get_variable('bar',[1])
print(a.name)#结果为foo/bar:0
再看tf.name_scope:
with tf.name_scope('a'):
a=tf.Variable([1])
print(a.name)#结果为a/Variable:0
b=tf.get_variable('b',[1])
print(b.name)#结果为b:0
看到,tf.get_variable创建的变量并不是a/b:0,而是b:0。这就表示了在tf.name_scope函数下,tf.get_variable不受其约束。
tf.get_variable与tf.variable_scope
TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。在这里主要解释下reuse问题:当reuse为False或者None时(这也是默认值),tf.get_variable()函数只能创建新的变量,同一个tf.variable_scope下面的变量名不能相同,当同名变量已经存在时,函数就报错;当reuse为True时,tf.variable_scope只能获取已经创建过的变量,即该空间下的所有tf.get_variable()函数将直接获取已经创建的变量,如果参数不存在tf.get_variable()函数将会报错。
当 reuse为False时,下面会报错:
with tf.variable_scope('foo'):
v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))
with tf.variable_scope('foo'):
v1 = tf.get_variable('v',[1])
其原因就是在命名空间foo中创建了相同的变量。如果我要在foo下创建一个变量v1,其name不能是‘v’
只需要将reuse设置为Ture就ok了。将上面第二部分代码修改为:
with tf.variable_scope('foo', reuse=True):
v1 = tf.get_variable('v',[1])
print(v1.name)
from:https://blog.csdn.net/qq_22522663/article/details/78729029
from:https://blog.csdn.net/hyxing520/article/details/80889496