tensorflow学习(5):变量管理

我们在写神经网络的时候,往往需要传递很多参数。而且当网络结构更复杂,参数更多的时候,在一个函数中写若干要传递的参数往往不现实,如

def inference(w1,w2,w3,w4,w5.....)

因此,我们需要有一个更好的方式来传递和管理神经网络中的参数。tensorflow提供了通过变量名称来创建或获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式传递。这种机制主要通过tf.get_variable和tf.variable_scope函数实现。

#下面两个定义是等价的
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函数创建变量的过程基本是一样的。
tensorflow中提供的initializer函数和随机数生成函数以及常量生产恒函数有着一一对应关系,如tf.constant对应tf.constant_initializer
上述两行代码的区别在于tf.get_variable必须指定变量名称,而tf.Variable变量名称是可选的。tf.get_variable会根据这个名字去创建或者获取变量。
如果需要通过tf.get_variable获取一个已经创建的变量,需要通过tf.variable_scope函数来生成一个上下文管理器,并明确指定在这个上下文管理器中,tf.get_variable将直接获取已经生成的变量(reuse=True)
关于reuse的说明:当在上下文管理器中指定reuse的值时,按照指定的来,默认的reuse=False。如果没有指定,并且存在上一层上下文管理器,那么本层的reuse就跟着上层的reuse的值,例如:

with tf.variable_scope('x',reuse=True):  #reuse=True
	with tf.variable_scope('y'):   #reuse=True
		pass
with tf.variable_scope('z')  #reuse=FALSE
	pass 

另外,当reuse=True时,这个上下文管理器内所有的tf.get_variable函数会直接获取已经创建的变量,如果变量不存在,则会报错。反之,当reuse=False时,tf.get_variable会创建新的变量,如果同名的变量已经存在,则会报错。
下面的代码显示的说明了这一过程:

v1 = tf.get_variable('v',[1])   #注意,默认初始化值为0
print(v1.name)   #v
with tf.variable_scope('foo'):
	v2  = tf.get_variable('v',[1])
	print(v2.name)  #foo/v:0

with tf.variable_scope('foo'):
	with tf.variable_scope('bar'):
		v3 = tf.get_variable('v',[1])
		print(v3.name)  #foo/bar/v:0
	v4 = tf.get_variable('v1',[1])
	print(v4.name)  #foo/v1:0

with tf.variable('',reuse = True):
	v5 = tf.get_variable('foo/bar/v',[1])  #通过名称获取变量
	print(v5==v3)   #True
	v6 = tf.get_variable('foo/v1',[1])
	print(v6==v4)   #True	

至此,关于变量管理的tf.get_variable和tf.variable_scope已经阐述完了。

另外,在多说一句:
tf.global_variables()函数维护了一个列表,这个列表包含了所有的变量。

猜你喜欢

转载自blog.csdn.net/shanlepu6038/article/details/84559864
今日推荐