1. 变量管理机制
Tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。实该机制主要是通过tf.get_variable 和tf.variable_scope函数实现。
2.Variable和get_variable函数
tf.get_variable和tf.Variable 创建变量的时候是等价的,都需要提供维度,初始化方法和命名:
v = tf.get_variable("v", shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape=[1], name="v")
以上常数生成函数tf.constant功能和tf.constant_initializer常数初始化函数的功能就是一致的。常用的函数初始化函数有:
初始化函数 | 功能 | 主要参数 |
---|---|---|
tf.constant_initializer | 将变量初始化为给定常量 | 常量的取值 |
tf.random_normal_initializer | 将常量初始化为满足正态分布的随机值 | 正太分布的均值和标准差 |
tf.truncated_normal_initializer | 将变量初始化为满足正太分布的随机值,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将被重新随机 | 正太分布的均值和标准差 |
tf.random_uniform_initializer | 将变量初始化满足平均分布的随机值 | 最大、最小值 |
tf.uniform_unit_scaling_initializer | 将变量初始化为满足平均分布但不影响输出数量级的随机值 | factor(产生随机值乘以的系数) |
tf.zeros_initializer | 将随机变量全部设置为0 | 变量维度 |
tf.ones_initializer | 将随机变量全部设置为1 | 变量维度 |
tf.Variable和tf.get_variable函数最大的区别在于,tf.Variable变量名称是一个可选的参数,但是对于tf.get_variable是一个必填的参数。tf.get_variable会根据这个名字去创建或者获取变量。
3.get_variable和variable_scope
通过下面示例来说明,如何通过variable_scope来生成上下文管理器,并利用get_variable来获取变量。
import tensorflow as tf
#在命名空间foo里面创建名字为v的变量
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1], initializer=tf.constant_initializer(1.0))
#因为命名为v的变量已经存在,以下代码会报错
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
#在生成上下文管理器的时候,将reuse设置为True,get_variable将直接获取已经定义的变量
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v", [1])
print v==v1
#在设置resue为True的情况下,如果变量没声明过,将会报错:
with tf.variable_scope("bar", reuse=True):
v1 = tf.get_variable("v", [1])
print v==v1