5.3 变量管理(下)

本文详细介绍了TensorFlow中tf.variable_scope函数的使用方法,通过创建命名空间管理变量名称,提高神经网络模型代码的可读性和维护性。展示了如何在不同命名空间下创建变量,以及如何在空命名空间中复用已定义的变量。
摘要由CSDN通过智能技术生成

tf.variable_scope函数生成的上下文管理器也会创建一个Tensorflow中的命名空间,在命名空间内创建的变量名称都会带上这个命名空间名作为前缀。所以,tf.variable_scope函数除了可以控制tf.get_variable执行的功能之外,这个函数也提供了一个管理变量命名空间的方式。以下代码显示了如何通过tf.variable_scope来管理变量的名称

v1=tf.get_variable("v",[1])
print(v1.name)		#输出v:0。“v”为变量的名称,“:0”表示这个变量是生成变量这个运算的第一个结果

with tf.variable_scope("foo"):
	v2=tf.get_variable("v",[1])
	print(v2.name)	#输出foo/v:0.在tf.variable_scope中创建的变量,名称前面会加入命名空间的名称,并通过/来分割命名空间的名称和变量的名称


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。当命名空间退出后,变量名称也就不会再被加入其前缀了


#创建一个名称为空的命名空间,并设置reuse=True。
with tf.variable_scope("",reuse=True):
	v5=tf.get_variable("foo/bar/v",[1])		#可以直接通过带命名空间的变量名来获取其它命名空间下的变量。
											#比如这里通过指定名称foo/bar/v来获取在命名空间foo/bar/中创建的变量。
	print(v5==v3)	#输出True
	v6=tf.get_variable("foo/v1",[1])
	print(v6==v4)	#输出True

通过tf.variable_scope和tf.get_variable函数,以下代码对5.2.1小节中定义的前向传播结果的函数做了一些改进。

def inference(input_sensor,reuse=False):
	#定义第一层神经网络的变量和前向传播过程
	with tf.variable_scope("layer1",reuse=reuse):
		#根据传进来的reuse来判断是创建新变量还是使用已经创建好的
		#在第一次构造网络时需要创建新的变量,以后每次调用这个函数都直接使用reuse=True就不需要每次将变量传进来了
		weights=tf.get_variable("weights",[INPUT_NODE,LAYER1_NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))
		biases=tf.get_variable("biases",[LAYER1_NODE],initializer=tf.constant_initializer(0.0))
		layer1=tf.nn.relu(tf.matmul(input_sensor,weights)+biases)

	#类似地定义第二层神经网络的变量和前向传播过程
	with tf.variable_scope('layer2',reuse=reuse):
		weights=tf.get_variable("weights",[LAYER1_NODE,OUTPUT_NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))
		biases=tf.get_variable("biases",[OUTPUT_NODE],initializer=tf.constant_initializer(0.0))
		layer2=tf.matmul(layer1,weights)+biases
	#返回最后的前向传播结果
	return layer2

x=tf.placeholder(tf.float32,[None,INPUT_NODE],name='x-input')
y=inference(x)

#在程序中需要使用训练好的神经网络进行推导时,可以直接调用inference(new_x,True).
#如果需要使用滑动平均模型可以参考5.2.1小节中使用的代码,把计算滑动平均的类传到inference函数中即可。
#获取或者创建变量的部分不需要改变。
#new_x=···
#new_y=inference(new_x,True)

使用上面这段代码所示的方式,就不再需要将所有变量都作为参数传递到不同的函数中了。当神经网络结构更加复杂、参数更多时,使用这种变量管理的方式将大大提高程序的可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值