目录
变量管理
随着神经网络的结构更加复杂,参数更多时,需要一个更好的方式来传递和管理变量。在TF中提供了通过变量的名字来创建或者获取一个变量的机制,通过这个机制不同函数可以直接通过变量的名字来直接使用变量。这机制主要是通过tf.get_variable和tf.variable_scope实现的。
- tf.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.Variable和tf.get_variable最大的区别在于指定变量名称的参数。tf.Variable的变量名称是一个可选的参数,通过name='v'给出。但是tf.get_variable的变量名称是一个必填的参数,tf.get_variable会根据这个名字去创建参数,因此不能创建一个已经存在的名字,否则就会报错。
- tf.variable_scope
如果需要通过tf.get_variable来获取一个已经创建的变量,则需要通过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))
#由于已经存在v,所以以下代码将会报错
with tf.variable_scope('foo'):
v = tf.get_variable('v',[1])
#Variable foo/v already exists, disallowed. Did you mean to set reuse=True in VarScope?
#在生成上下文管理器时,将reuse设置为True,即可获取变量
with tf.variable_scope('foo', reuse=True):
v = tf.get_variable('v',[1])
tf.variable_scope函数会创建一个TF的命名空间,在命名空间内创建的变量名称都会带上这个空间名字作为前缀,所以这个函数也提供了一个管理变量命名空间的方式:
v1= tf.get_variable('v', [1])
print(v1.name)
#v:0
#0表示是这个变量运算的第一个结果
with tf.variable_scope('foo'):
v2 = tf.get_variable('v', [1])
print(v2.name)
#foo/v:0
with tf.variable_scope('foo'):
with tf.variable_scope('bar'):
v3 = tf.get_variable('v', [1])
print(v3.name)
#foo/bar/v:0
tf.variable_scope的参数reuse=True时,tf.get_variable将直接且只能获取已经存在的变量,若变量不存在,就会报错。
with tf.variable_scope('foo'):
v = tf.get_variable('v', [1])
print(v.name)
#foo/v:0
with tf.variable_scope('foo',reuse=True):
v1 = tf.get_variable('v', [1])
print(v = v1)#因为之前已经创建了foo/v 所以v=v1
#True
v1 = tf.get_variable('v1', [1]) # 这句会报错,因为并没有叫v1的变量
with tf.variable_scope('',reuse=True):
v2 = tf.get_variable('foo/v', [1]) #另外也可以直接在一个空的空间直接获取其他空间的变量
print(v2 = v) #因为之前已经创建了foo/v 所以v=v2
初始化函数 | 功能 | 主要参数 |
---|---|---|
tf.constant_initializer | 将变量初始化为给定常量 | 常量的取值 |
tf.random_normal_initializer | 将变量初始化为满足正太分布的随机值 | 正太分布的均值和标准差 |
tf.truncated_normal_initializer | 将变量初始化为满足正太分布的随机值,但若随机出来的值偏离平均值超过两个标准差,那么这个数将会被重新随机 | 正太分布的均值和标准差 |
tf.random_uniform_initializer | 将变量初始化为满足平均分布的随机值 | 最大,最小值 |
tf.uniform_unit_scaling_initializer | 将变量初始化为满足平均分布但不影响输出数量级的随机值 | factor(产生随机值时乘以的系数) |
tf.zeros_initializer | 将变量设置为全为0 | 变量维度 |
tf.ones_initializer | 将变量设置为全为1 | 变量维度 |
使用变量管理对(三)中的TF模型进行改进,这种方法可以提高复杂程序的可读性:
def inference(input_tensor,avg_class,regularizer):
if avg_class==None:
with tf.variable_scope('layer1'):
weights = tf.get_variable('weights', [INPUT_NODE, LAYER1_NODE], initializer=tf.truncated_normal_initializer(stddev=0.1))
biases = tf.get_variable("biases", [LAYER1_NODE], initializer=tf.constant_initializer(0.0))