tensorflow的实用变量方法为tf.Variable()函数,在每次调用时,都会简单的生成一个新的变量。如果想高效的共享变量,就要使用tf.get_variable()和tf.variable_scope()这两方面的函数。
在java或者c中,变量限制使用的方式一般为先定义一个空间,然后在这个空间中定义变量。在tf中,为了使模块更加的解耦,将变量的定义和空间(scope)的定义分开,这样可以使变量的定义更加复用。然后在使用中可以使用tf.get_variable()搜索确定的变量,当然,也可以scope中对var进行定义。
首先来看var的定义,tf.get_variable(name,shape = None,dtype = tf.float32,initializer = None,trainable = True,collections = None) 一般需要传入name,shape和initializer,initializer常用的有三个:tf.constant_initializer(value)/tf.random_uniform_initializer(a,b)/tf.random_normal_initializer(mean,stddev)分别是常数的初始化值,平均的初始化值和正态分布的初始化值。
在tensorflow中使用包含scope的变量,有两种处理方式:
(1)先定义scope,然后在该scope中使用get_variable()函数,过程如下:
在scope下创建了一个全名为“foo/v:0”的变量,然后将scope的reuse设置为True,即可对该变量进行共享和访问
只有将scope的reuse 参数设置为True,才能get到variable,否则会抛出错误。
(2)在tensorflow如果想使变量可以进行复用,通常应采用以下的步骤:
-
构造变量的时候,使用tf.get_variable()函数进行构造。
-
在使用的时候,增加with tf.Variable_scope("name") as scope,这样可以将该变量限制在该命名空间之内,形成了一个以此scope+name的一个全限定名,这样可以实现变量的复用。
-
之后,就可以该函数进行调用,但是因为默认的scope的reuse为False,需要将之设置为True之后才能使之共享。
-
这里采用的scope 的层结构,也就是说,本层(conv1/conv2)的resue为默认的False,可以增加一个他们的上层(upper_scope),然后将这一层reuse设置为True,其子层自动设置为True。
*这里敬请小心。
变量部分python api还有一个稀疏变量更新,这一部分我不感兴趣,先不整理了。