Tensorflow的变量管理

Tensorflow中常见的变量初始化函数

初始化函数功能主要参数
tf.constant_initializer将变量初始化为给定的常量常量的取值
tf.random_normal_initializer将变量初始化为满足正态分布的随机值正态分布的均值和标准差
tf.truncated_normal_initializer将变量初始化为满足正态分布的随机值,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机正态分布的均值和标准差
tf.random_uniform_initializer将变量初始化为满足平均分布的随机值最大,最小值
tf.uniform_unit_scaling_initializer将变量初始化为满足平均分布但不影响输出量级的随机值factor(产生随机值时乘以的系数)
tf.zero_initializer将变量设置为0变量维度
tf.ones_initializer将变量设置为1变量维度

使用tf.variable_scope函数来控制tf.get_variable函数获取已经创建的函数

#在名字为foo的命名空间内创建名字为v的变量
with tf.variable_scope("foo"):
    v = tf.get_variable("v", [1], initializer=tf.constant_initializer(1.0))

'''
命名空间foo中已经存在变量v,所以下面的代码将会报错:Variable foo/v already exitst,disallowed.Did you mean to set reuse=True in VarScope?
'''              
#with tf.variable_scope("foo"):
   # v = tf.get_variable("v", [1])

#在生成上下文管理器时,将参数reuse 设置为True.这样tf.get_variable 函数将直接获取已经声明的变量    
with tf.variable_scope("foo", reuse=True):
    v1 = tf.get_variable("v", [1])
print v == v1   #输出为True,代表v,v1代表的是相同的TensorFlow 中变量。

'''
将参数reuse 设置为True 时,tf.variable_scope 将只能获取已经创建过的变量。因为在命名空间bar 中还没有创建变量v,所以下面的代码将会报错:Variable foo/v not exitst,disallowed.Did you mean to set reuse=None in VarScope?
'''
#with tf.variable_scope("bar", reuse=True):
   # v = tf.get_variable("v", [1])
上面的样例简单地说明了通过tf.variable_scope 函数可以控制tf.get_variable函数的语义。当tf.variable_scope 函数使用参数reuse=True 生成上下文管理器时,这个上下文管理器内所有的tf.get_variable 函数会直接获取已经创建的变量。如果变量不存在,则tf.get_variable函数将报错; 相反,如果tf.variabe_scope 函数使用参数reuse=None 或者reuse=False 创建上下文管理器,tf.get_variable 操作将创建新的变量。如果同名的变量已经存在,则tf.get_variable函数将报错。TensorFlow 中tf.variable_scope函数是可以嵌套的。下面的程序说明了当tf.variable_scope函数嵌套时,reuse参数的取值是如何确定的。
with tf.variable_scope("root"):
#可以通过tf.variable_scope()函数来获取当前上下文管理器中reuse参数的取值

    print tf.get_variable_scope().reuse#输出False,即最外层reuse为False。

    #新建一个嵌套的上下文管理器,并指定reuse 为True。
    with tf.variable_scope("foo", reuse=True):

        print tf.get_variable_scope().reuse

        #新建一个嵌套的上下文管理器但不指定reuse,这时reuse的取值会和外面一层保持一致。    
        with tf.variable_scope("bar"):
            print tf.get_variable_scope().reuse#输出True。

    print tf.get_variable_scope().reuse
    #输出False。退出reuse 设置为True 的上下文之后的值又回到了False。
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",reuse=True):
    v2 = tf.get_variable("v", [1])
print v2.name#输出foo/v:O.在tf.variabie_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("v1", [1])     
    print v6 == v4   #输出True.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值