相同点:
-
都是创建
Variable
对象 -
创建后的
variable
如果collection参数是默认,都保存[tf.GraphKeys.GLOBAL_VARIABLES]
这个tf内部维护的collection
中 -
当参数
trainable
为True
时,同时也保存在[GraphKeys.TRAINABLE_VARIABLES]
中 -
get_variable
的initializer
+shape
参数 和Variable
的initial_value
参数 基础使用下无区别
不同点:
也是本博文的主要目的
1.两者参数的不同
get_variable
必须给name
2.并且两者对variable
命名规律的不同
-
tf.get_variable()
对于重名的,如果不设置reuse=True
会报错(并且对于reuse=True
,可以 不需要initializer
,指定reuse变量的名字即可);
-而tf.Variable
重名并不报错,而是加后缀来处理重名.
import tensorflow as tf
with tf.variable_scope('V1'):
a1 = tf.get_variable(name='a1', initializer=tf.zeros([1]))
with tf.variable_scope('V1', reuse=True):
a3 = tf.Variable(tf.zeros([1]), name='a1')
a4 = tf.Variable(tf.zeros([1]), name='a1')
a2 = tf.get_variable('a1')
print('a1:', a1.name) # a1: V1/a1:0
print('a2:', a2.name) # a2: V1/a1:0
print('a3:', a3.name) # a3: V1_1/a1:0
print('a4:', a4.name) # a4: V1_1/a1_1:0
可以看出,a3
a4
加上_1
处理,而a2
则和a1
名字一样
本质上:可以说每次tf.Variable
都创建新的variable
,所以参数复用这种功能就只能用
tf.get_variable()
了。
3.tf.get_variable()
封装了regularizer
参数,
可以不需要通过
tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, a)
,将avariable
放进去
4.配合tf.variable_scope()
使用更灵活
with tf.variable_scope('V1',initializer=tf.zeros([1])):
a1 = tf.get_variable('a1')
a2 = tf.get_variable('a2', initializer=tf.ones([1]))
当tf.get_variable()
没有定义initializer
,使用tf.variable_scope()
的;包括regularizer
等参数都是如此
最后博主推荐使用~tf.get_variable()
,因为暂时没有发现任何值得用tf.Variable
的地方
你们喜欢哪个用哪个!
参考:https://blog.csdn.net/u012436149/article/details/53696970