5.3 变量管理

TensorFlow的变量初始化函数

初始化函数 功能 主要参数
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 变量维度
#下面这两个定义是等价的
v = tf.get_variable("v", shape = [1], initialzer = tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape = [1]), name = "v")

   tf.get_variable函数与tf.Variable函数最大的区别在于指定变量名称的参数。对于tf.Variable函数,变量名称是一个可选的参数,通过name = "v"的形式给出。但是对于tf.get_variable函数,变量名称是一个必填的参数。tf.get_variable会根据这个名字取创建或者获取变量。在上述示例程序中,tf.get_variable首先会视图创建一个名字为v的参数,如果创建失败(比如已经有同名的参数),那么这个程序就会报错。这是为了避免无意识的变量复用造成的错误。

  如果需要通过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))

#因为在命名空间foo中已经存在名字为v的变量,所以下面代码会报错
with tf.variable_scope("foo"):
    v = tf.get_variable("v", [1])

#生成上下文管理器时,将reuse设置为True。这样tf。get_varibale函数将直接获取已经声明的变量
with tf.variable_scope("foo", reuse = True):
    v1 = tf.get_variable("v", [1])
    print(v == v1)

#将参数reuse设置为True时,代表v, v1代表的是相同的TensorFlow中变量
#命名空间bar中还没有创建变量v,所以下面代码会报错
with tf.variable_scope("bar", reuse = True):
    v = tf.get_variable("v", [1])

  上述样例说明了通过tf.variable_scope函数可以控制tf.get_variable函数的语义。当tf.variable_scope函数使用参数reuse = True生成上下文管理器时,这个上下文管理器内所有的tf.get_variable函数会直接获取已经创建的变量。如果变量不存在,则tf.get_variable函数会报错。相反,如果tf.variable_scope函数使用餐胡reuse = None或者reuse = False创建上下文管理器,tf.get_variable操作将创建新的变量。如果同名的变量已经存在则tf.get_variable函数将报错。

posted @ 2019-07-24 23:35  陈辻柒  阅读(172)  评论(0编辑  收藏  举报