热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

#变量管理importtensorflowastf#定义一个变量,此时为张量vtf.get_variable(v,shape[1],initializertf.constan

#变量管理
import tensorflow as tf
#定义一个变量,此时为张量
v=tf.get_variable('v',shape=[1],initializer=tf.constant_initializer(1.0))
print(v)
#该v为在默认空间创建的变量


#在命名空间内创建变量,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)


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变量管理的机制!


推荐阅读
author-avatar
白骨精哥哥_350
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有