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函数将报错。