【转账】常见的几种initializers

【原文https://blog.csdn.net/qq_39037910/article/details/72954176

对自行创建的变量以及一些方法中创建的内部使用的变量进行初始化的方法.

Tensorflow中的变量初始化有两类方法:

  1. 使用xxxx()方法生成一个Tensor, 将这个Tensor作为tf.Variable()中的initial_value参数的入参, 来初始化这个变量;
  2. 使用xxxx_initializer()创建一个初始化方法, 指明一种初始化的方法, 但并不生成具体的Tensor, 使用在tf.get_variable()和tf.variable_scope()等方法中, 其中的initializer参数指定为初始化方法, 则在环境中创建或获取的变量都将使用这个方法进行初始化.

例如:

a = tf.Variable(tf.random_uniform(shape=[2,2], minval=0.0, maxval=1.0, dtype=tf.float32), name="a")
b = tf.get_variable("b",
                    shape=[2,2],
                    initializer=tf.truncated_normal_initializer(mean=0.0, stddev=1.0, dtype=tf.float32))

with tf.variable_scope("test", initializer=tf.truncated_normal_initializer(mean=10.0, stddev=1.0, dtype=tf.float32)):
    c = tf.get_variable("c", shape=[2,2])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print("a:\n", a.eval())
    print("b:\n", b.eval())
    print("c:\n", c.eval())
'''
结果:
a:
 [[ 0.93527687  0.17724955]
 [ 0.93378794  0.20970833]]
b:
 [[ 0.26235873 -0.30409873]
 [-1.76498365 -0.21139114]]
c:
 [[ 10.03858566   9.59233952]
 [ 11.18356609  10.3871088 ]]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • tf.random_uniform()
  • tf.random_uniform_initializer()

    均匀分布

'''
参数:
    tf.random_uniform()
        shape: (must)初始化Tensor的大小;
        minval: 取值上限, Tensor或与dtype相同的数值;
        maxval: 取值下限, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
        name: op的名称.
    tf.random_uniform_initializer()
        minval: 取值上限, Tensor或与dtype相同的数值;
        maxval: 取值下限, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
输出:
    tf.random_uniform():
        初始化生成的Tensor.
    tf.random_uniform_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • tf.truncated_normal()
  • tf.truncated_normal_initializer()

    截断正态分布, 采样时当样本偏离均值两个标准差时, 放弃本次采样样本, 重新采样.

'''
参数:
    tf.truncated_normal()
        shape: (must)初始化Tensor的大小;
        mean: 分布的均值, Tensor或与dtype相同的数值;
        stddev: 分布的标准差, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
        name: op的名称.
    tf.truncated_normal_initializer()
        mean: 分布的均值, Tensor或与dtype相同的数值;
        stddev: 分布的标准差, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
输出:
    tf.truncated_normal():
        初始化生成的Tensor.
    tf.truncated_normal_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • tf.random_normal()
  • tf.random_normal_initializer()

    正态分布

'''
参数:
    tf.random_normal()
        shape: (must)初始化Tensor的大小;
        mean: 分布的均值, Tensor或与dtype相同的数值;
        stddev: 分布的标准差, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
        name: op的名称.
    tf.random_normal_initializer()
        mean: 分布的均值, Tensor或与dtype相同的数值;
        stddev: 分布的标准差, Tensor或与dtype相同的数值;
        dtype: 数值类型;
        seed: 随机种子;
输出:
    tf.random_normal():
        初始化生成的Tensor.
    tf.random_normal_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • tf.zeros()
  • tf.zeros_initializer()

    使用0值初始化

'''
参数:
    tf.zeros()
        shape: (must)初始化Tensor的大小;
        dtype: 数值类型;
        name: op的名称.
    tf.zeros_initializer()
        dtype: 数值类型;
输出:
    tf.zeros():
        初始化生成的Tensor.
    tf.zeros_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • tf.ones()
  • tf.ones_initializer()

    使用1值初始化

'''
参数:
    tf.ones()
        shape: (must)初始化Tensor的大小;
        dtype: 数值类型;
        name: op的名称.
    tf.ones_initializer()
        dtype: 数值类型;
输出:
    tf.ones():
        初始化生成的Tensor.
    tf.ones_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • tf.constant()
  • tf.constant_initializer()

    使用指定的常数初始化

'''
参数:
    tf.constant()
        value: (must)常数值, 可以为多维列表直接指定个元素的值;
        shape: 初始化Tensor的大小;
        dtype: 数值类型;
        name: op的名称;
        verify_shape: bool, False允许初始化时不指定shape大小.
    tf.constant_initializer()
        value: 常数值, 可以为多维列表直接指定个元素的值;
        dtype: 数值类型;
        verify_shape: bool, False允许初始化时不指定shape大小.
输出:
    tf.constant():
        初始化生成的Tensor.
    tf.constant_initializer():
        一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • tf.uniform_unit_scaling_initializer()

    在对深度的DNN网络或CNN的权值初始化时使用, 使用输入变量的大小控制缩放比例, 达到消除梯度消失或梯度爆炸的问题.

    本质上是一个均值分布, 这里的上下端值通过计算得出.

    maxval = sqrt(3) / sqrt(dim) * factor
    minval = -sqrt(3) / sqrt(dim) * factor
    • 1
    • 2

    当需要初始化的变量为DNN的权值时, dim = W.shape[0]即一条输入变量的大小; 
    当需要初始化的变量为CNN的卷积层权值时, dim = 前三维数值的乘积, 即卷积核的宽*高*深度, 表示输入变量的数量大小.

    另外, factor作为一个乘数, 也参与到控制缩放的比例中, 用于在激活函数不是线性函数时使用:

    • 线性函数 factor = 1.0
    • ReLU函数 factor = 1.43
    • tanh函数 factor = 1.15
'''
参数:
    factor: 默认为1.0, 校正缩放比例的成熟, 用于在不同激活函数时进行调节;
    seed: 随机种子;
    dtype: 数值类型.
输出: 一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • tf.variance_scaling_initializer()

    对DNN权值进行初始化, 指定缩放比例, 并根据权值的shape进一步自动调节缩放比例(scale)

    distribution = 'normal'时, 从截断正态分布中采样, 分布的均值mean为0, 标准差stddev = sqrt(scale / n)
    distribution = 'uniform'时, 从均匀分布中采样, 其中的maxval = -minval = sqrt(3 * scale / n)

    n值的获取由参数mode决定:

    • mode = 'fan_in', n为权值weight的输入节点的数量, 即n = weight.shape[0];
    • mode = 'fan_out', n为权值weight的输出节点的数量, 即n = weight.shape[1];
    • mode = 'fan_avg', n为权值weight的输入输出节点数量的均值, 即n = (weight.shape[0] + weight.shape[1]) / 2.
'''
参数:
    scale: 指定缩放因子, 正浮点数, 默认为1.0;
    mode: 调整scale的方式, 在截断正态分布中调整标准差stddev参数, 在均匀分布中调整上下界限maxval;
    distribution: 确定分布的形式, 'normal'表示截断正态分布, 'uniform'表示均匀分布;
    seed: 随机种子;
    dtype: 数据类型, 只接受各种float类型.
输出: 一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • tf.orthogonal_initializer()

    生成一个正交矩阵的随机数, 当需要生成的参数是2维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD分解而来.

'''
参数:
    gain: 乘数因子, 对整体结果进行统一放大缩小;
    dtype: 数据类型;
    seed: 随机种子.
输出: 一个Initializer, 初始化变量的方法, 调用对象'__call__()'时生成初始化生成Tensor.
'''

猜你喜欢

转载自blog.csdn.net/xky1306102chenhong/article/details/81131610