罗斯基白话:TensorFlow+实战系列(四)变量管理

 

白话TensorFlow +实战系列(一)
变量管理

 

       这篇文章主要记录常用的两种管理变量的方法。个人感觉变量管理是比较重要的,特别是当创建一个复杂的神经网络的时候,变量一旦增多,如果不好好管理这些变量,代码的可读性会变得比较差,到最后可能自己都不知道变量到底指的是啥。所以,这次总结了两种常用的管理变量方法。

       

1)基于字典的方法创建变量

       这种方法其实就是用字典的方式,key就是你取的网络层名字,value就是神经网络各层的变量。如要创建有两个隐藏层的神经网络,各层的变量可由如下代码管理:



 

其中layer1表示的是输入层到第一层隐藏层的变量

layer2表示第一层隐藏层到第二层隐藏层的变量

out表示第二层隐藏层到输出层的变量

 

这样我们就将各层的变量通过字典的形式封装起来,当构建神经网络的时候,我们可以直接调用,示例如下:



 

如图通过直接调用w["layer1"]就可以获取layer1的权重,以此类推。

这样就成功的创建了一个全连接神经网络

 

2)变量共享

TensorFlow提供了一种更简单的方法管理变量,即变量共享。该方法主要是通过tf.get_variable()与tf.variable_scope()函数来实现。下面分别说说怎么用

 

1.tf.get_variable()

该函数可以用于创建变量,也可以用于获取已经创建的变量。

当用于创建变量的时候,他的作用与tf.Variable()可以理解成一样,只是参数的设置位置不同而已。

如图,以下这两个变量创建的形式一样:



 

这两个都是创建一个2*3的张量,不同的是,tf.Variable()张量名称这个参数是可选的,tf.get_variable()是必填的,并且tf.get_variable()是用initializer= ....来初始化张量的类型。

其中tf.random_normal_initializer()初始化函数只是在tf.random_normal后面加个initializer()而已,其他的如tf.constant也是加个变成 tf.constant_initializer(),其他相似的函数类似,就不一一列举。

 

当需要用tf.get_variable()获取变量时,就需要通过tf.variable_scope()来创建一个上下文管理器,这个函数包含一个reuse参数,是一个布尔型参数,当reuse= True时,指明在该管理器中,tf.get_variable()用于获取已经创建的变量;当reuse = False时,指明在该管理器中,tf.get_variable()用于创建变量。

 

如图,在命名空间foo中创建一个变量v1:



 

接着在命名空间foo中获取变量v1:



打印结果为True,表明已经获取到之前创建的v1。

 

接下来用变量共享的方法来创建之前的神经网络,代码如下:




这样代码的可读性会比较强。

当需要用训练好的网络时,直接调用network(x_input, reuse = True)即可。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值