TensorFlow中的变量空间管理

一 get_variable() 函数



get_variable() 函数用于创建或获取变量。 在实现创建变量的功能时,其使用方法和 Variable () 函数基本相同。

 

登录后复制

import tensorflow as tf# 通过一个常量来初始化一个变量# a = tf.Variable(tf.constant(1.0,shape=[1],name='a'))
# 使用一个 get_variable()创建一个变量# 原型 : get_variable(name,shape,dtype,initializer,regularizer,trainable,...)
a = tf.get_variable("a",shape=[1],initializer=tf.constant_initializer(1.0))init_op = tf
.global_variables_initializer()with tf.Session() as sess:    sess.run(init_op)    print(sess.run(a))    
print(a)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

从上面的代码中看出,get_variable() 函数调用时提供的形状信息(shape)和 Variable() 函数类似。

get_variable() 函数通过 initializer 参数提供初始化方法 , 下表为一些初始化函数 :

初始化函数功能
constant_initializer()将变量初始化为给定的常量
random_normal_initializer()将变量初始化为满足正态分布的随机值
truncated_normal_initializer()将变量初始化为满足正态分布的随机值,但如果随机出来的偏离平均值超过2个标准差,那么这个数将重新随机
random_uniform_initializer()将变量初始化为满足平均分布的随机数值
uniform_uint_scaling_initializer()将变量初始化为满足平均分布但不影响输出数量级的随机值
zeros_initializer()将变量初始化全为0
ones_initializer()将变量初始化全为1

在 get_variable() 中 name 是一个必选的参数 。

二  variable_scope()

在使用 get_variable() 函数之前,我们要使用函数 variable_scope() 结合上下文管理器(with) 生成一个变量空间。

在相同的变量空间中使用 get_variable() 函数创建name 属性相同的两个变量会导致错位的发生。

登录后复制

import tensorflow as tf# 在名为 one 的变量空间内创建名字 为 a 的变量with tf.variable_scope("one") :    a = tf
.get_variable("a",[1],initializer=tf.constant_initializer(1.0))init_op = tf
.global_variables_initializer()with tf.Session() as sess:    sess.run(init_op)    
print(a)#下面会出错with tf.variable_scope("one") :    a2 = tf
.get_variable("a",[1])1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

    上面的程序简单的说明了variable_scope() 函数影响了get_variable() 函数的使用。在执行创建变量 a2的代码时会由于"one" 这个变量空间中已经存在 name属性为 a 的变量二产生报错信息,提示是否在 variable_scope() 函数中使用reuse= True 参数。

   reuse 参数的默认值为 False , 当variable_scope() 函数使用 reuse = True 参数生成上下文管理器时,这个上下文管理器内所有的get_variable() 函数会直接获取 name 属性相同的已经创建的变量。如果变量不存在,则 get_variable() 函数会报错.

登录后复制

import tensorflow as tf# 在名为 one 的变量空间内创建名字 为 a 的变量with tf.variable_scope("one") :    
a = tf.get_variable("a",[1],initializer=tf.constant_initializer(1.0))with tf
.variable_scope("one",reuse=True) :    a2 = tf.get_variable("a",[1])    
print(a.name,a2.name)输出 : one/a:0 one/a:01.2.3.4.5.6.7.8.9.10.11.12.

如果 使用默认的 resue = False ,创建变量空间,那么 get_variable() 函数将创建新的变量; 如果name属性相同的变量已经存在,get_variable() 函数将会报错。

  使用 variable_scope() 函数创建变量空间时,在变量空间内创建的变量名称都会带上这个变量空间名称作为前缀。上面代码中

输出 one/a:0 one 就是变量空间。下面展示的是变量空间的嵌套 :

登录后复制

import tensorflow as tfa = tf.get_variable("a",[1],initializer=tf.constant_initializer(1.0))
print(a.name)with tf.variable_scope("one"):    a2 = tf.get_variable("a",[1],initializer=tf
.constant_initializer(1.0))    print(a2.name)with tf.variable_scope("one") :    with tf
.variable_scope("two"):        a4 = tf.get_variable("a",[1])        print(a4.name)        
#  输出 one/two/a  ,变量空间嵌套之后,        # 变量的名称会加入所有变量的名称作为前缀    
b = tf.get_variable("b",[1])    print(b.name)with tf.variable_scope("",reuse=True) :    
# 也可以直接通过变量空间名的前缀的变量名来获取相应的变量    a5 = tf.get_variable("one/two/a",[1])    
print(a5 == a4)    #输出 True1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.

下面展示如何确定 reuse 参数的取值 :

登录后复制

import tensorflow as tfwith tf.variable_scope("one") :    # 使用get_variable_scope() 函数可以获取当前的变量空间    
print(tf.get_variable_scope().reuse)    #输出 False    with tf.variable_scope("two",reuse=True):        
print(tf.get_variable_scope().reuse)        # 在一个嵌套变量空间中如果不指定 reuse 参数,        
# 那么会默认和外面最近的一层保持一致        with tf.variable_scope("three"):            
print(tf.get_variable_scope().reuse)            # 输出 True    #回到 reuse 值为默认 False 的最外层变量空间    
print(tf.get_variable_scope().reuse)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

三 name_scope()

name_scope() 函数提供了类似于 variable_scope() 函数的变量空间管理功能,但是在搭配 get_variable() 函数使用时二者会有所差别 。

登录后复制

import tensorflow as tfwith tf.variable_scope("one") :    a = tf.get_variable("var1",[1])    
print(a.name)with tf.variable_scope("two"):    b = tf.get_variable("var2",[1])    
print(b.name)with tf.name_scope("a") :    #使用 Variable() 函数生成变量会受到 name_scope() 的影响    
a = tf.Variable([1],name='a')    print(a.name)    a = tf.get_variable("b",[1])    
print(a.name)'''with tf.name_scope("b") :    #企图创建 name 属性为 b 的变量c ,然而这个变量已经被声明了    
c = tf.get_variable("b",[1])'''1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

从上面的代码中可以看出, 在 name_scope() 内部使用 get_variable() 函数时,生成的变量名称不会被添加变量空间名称前缀;

而 Variable() 函数在 name_scope() 内部会被添加变量空间名称前缀.使用 variable_scope() 变量空间时 ,无论是 get_variable()

还是 Variable() 都会在生成的变量名称前面添加变量空间名称前缀。



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空