tensorflow代码梳理3——变量管理(重要!)

#变量管理
import tensorflow as tf
#定义一个变量,此时为张量
v=tf.get_variable('v',shape=[1],initializer=tf.constant_initializer(1.0))
print(v)
#该v为在默认空间创建的变量
<tf.Variable 'v:0' shape=(1,) dtype=float32_ref>
#在命名空间内创建变量,reuse的作用是获取已经创建过的变量,variables_scope的作用是管理变量名称
with tf.variable_scope('foo'):
    v=tf.get_variable('v',shape=[1],initializer=tf.constant_initializer(1.0))
print(v)
with tf.variable_scope('foo',reuse=True):
    v1=tf.get_variable('v',[1])
print(v1.name)
print(v1==v)
<tf.Variable 'foo/v:0' shape=(1,) dtype=float32_ref>
foo/v:0
True
with tf.variable_scope('foo'):#如果指定reuse,变量空间内层与外层的reuse值保持一致
    with tf.variable_scope('bar'):
        v3=tf.get_variable('v',[1])
        print(v3.name)
    v4=tf.get_variable('v1',[1])
    print(v4.name)
foo/bar/v:0
foo/v1:0
#获取了一开始在默认变量空间创建的变量v
with tf.variable_scope('',reuse=True):
    v5=tf.get_variable('foo/bar/v',[1])
    print(v5.name)
    print(v5==v3)
    v6=tf.get_variable('foo/v1',[1])
    print(v6.name)
#设置了在默认变量空间reuse=True,说明变量只能获取先前已经在相应变量空间创建的变量,方便变量的管理
foo/bar/v:0
True
foo/v1:0

综上来看,一个tf的代码,有默认的变量空间,为了更方便地管理变量,可以使用tf.variable_scope来创建相应的变量空间来管理,省去了参数传递的过程。一般来说,第一次创建变量用的是reuse=False,然后再次调用相关变量只需要设置reuse=True,来直接获取该变量空间下的变量,而不需要传递!所以接下来看看改进后的inference.py

def inference(input_tensor,reuse=False):
    with tf.variable_scope('layer1',reuse=reuse):
     #......中间过程省略   
    with tf.variable_scope('layer2,reuse=reuse'): 
    #......中间过程省略
    return result
#使用前向函数inference的时候
new_y=inference(new_x,True)#这时候True意味着,可以直接获取相应变量空间下的权重变量,而不需要权重变量的参数传递。

最后关于tensorflow变量管理要注意的逻辑:
1.上下文管理器tf.variable_scope的reuse之间若无明确规定,则内外层reuse参数一致;
若规定了外层变量空间reuse为True,则内层reuse也为True,但同层reuse不一定为True。
2.关于这里变量的创建与直接获取过程,均与reuse有关。
3.其次,此处所谓的变量均为张量tensor,不同变量空间中的张量名称不一样,必须要启动会话才实现了真正的赋值
4.代码调试,只能一次性run,重复对同一变量获取或创建,调试会出现变量已经存在的情况,需要充分理解tensorflow变量管理的机制!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值