1. tf.Variable()
tf.Variable() 的基本用法:
W = tf.Variable(<initial-value>, name=<optional-name>)
w = tf.Variable(tf.constant(1.0,shape=[1]),name="w")
用于生成一个初始值为initial-value的变量。必须指定初始化值
2.tf.get_variable()
tf.get_variable()的基本用法:
W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
regularizer=None, trainable=True, collections=None)
w = tf.get_variable("w",shape=[1],initializer.constant_initializer(1.0))
获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个。 可以用各种初始化方法,不用明确指定值。
3.区别
使用tf.Variable()时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错:
w_1 = tf.Variable(3,name="w_1")
w_2 = tf.Variable(1,name="w_1")
print w_1.name
print w_2.name
#输出
#w_1:0
#w_1_1:0
w_1 = tf.get_variable(name="w_1",initializer=1)
w_2 = tf.get_variable(name="w_1",initializer=2)
#错误信息
#ValueError: Variable w_1 already exists, disallowed. Did
#you mean to set reuse=True in VarScope?
tf.Variable() 每次都在创建新对象。对于get_variable()来说,使用reuse=True,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。不使用reuse=True,如果已经创建的变量对象,就会报错。
4.推荐使用tf.get_variable()
1. 初始化更方便
W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())
2. 方便共享变量
因为tf.get_variable() 会检查当前命名空间下是否存在同样name的变量,可以方便共享变量。而tf.Variable 每次都会新建一个变量。
需要注意的是tf.get_variable() 要配合reuse和tf.variable_scope() 使用。
with tf.variable_scope("scope1"):
w1 = tf.get_variable("w1", shape=[])
w2 = tf.Variable(0.0, name="w2")
with tf.variable_scope("scope1", reuse=True):
w1_p = tf.get_variable("w1", shape=[])
w2_p = tf.Variable(1.0, name="w2")
print(w1 is w1_p, w2 is w2_p)
#输出
#True False
5.参考
https://blog.youkuaiyun.com/u012223913/article/details/78533910?locationNum=8&fps=1
https://blog.youkuaiyun.com/u012436149/article/details/53696970