CNN
中最重要的就是参数了,包括W
和b
。训练CNN
的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视。tf
提供的所有初始化方法都定义在tensorflow/python/ops/init_ops.py
。
可以简写为tf.Constant
,初始化为常数,通常偏置项就是用它初始化的。由它衍生出两个初始化方法:
tf.zeros_initializer
:可以简写为tf.Zeros
。tf.ones_initializer
:可以简写为tf.Ones
。在卷积层中,将偏置项b
初始化为0
,有多种写法:
conv1 = tf.layers.conv2d( # 方法1
batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
kernel_initializer=tf.TruncatedNormal(stddev=0.01), bias_initializer=tf.Constant(0))
bias_initializer = tf.constant_initializer(0) # 方法2
bias_initializer = tf.zeros_initializer() # 方法3
bias_initializer = tf.Zeros() # 方法4
将W
初始化成拉普拉斯算子的方法如下:
value = [1, 1, 1, 1, -8, 1, 1, 1, 1]
init = tf.constant_initializer(value)
W = tf.get_variable('W', shape=[3, 3], initializer=init)
可以简写为tf.TruncatedNormal
,生成截断正态分布的随机数:
tf.TruncatedNormal(mean=0.0, stddev=1.0, seed=None, dtype=dtypes.float32)
这四个参数分别用于指定均值、标准差、随机数种子和随机数的数据类型,一般只需要设置stddev
这一个参数。
conv1 = tf.layers.conv2d( # 代码示例1
batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
kernel_initializer=tf.TruncatedNormal(stddev=0.01), bias_initializer=tf.Constant(0))
conv1 = tf.layers.conv2d( # 代码示例2
batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
bias_initializer=tf.zero_initializer())
可以简写为tf.RandomNormal
,生成标准正态分布的随机数,参数和truncated_normal_initializer
一样。
可以简写为tf.RandomUniform
,生成均匀分布的随机数:
tf.RandomUniform(minval=0, maxval=None, seed=None, dtype=dtypes.float32)
这四个参数分别用于指定最小值、最大值、随机数种子和类型。
可以简写为tf.UniformUnitScaling
,和均匀分布差不多:
tf.UniformUnitScaling(factor=1.0, seed=None, dtype=dtypes.float32)
只是这个初始化方法不需要指定最小最大值,它们是通过计算得到的:
max_val = math.sqrt(3 / input_size) * factor
min_val = -max_val
这里的input_size
是指输入数据的维数,假设输入为x
,运算为x * W
,则input_size = W.shape[0]
,它的分布区间为[-max_val, max_val]
。
可以简写为tf.VarianceScaling
:
tf.VarianceScaling(scale=1.0, mode="fan_in", distribution="normal", seed=None, dtype=dtypes.float32)
scale
:缩放尺度(正浮点数)。mode
:fan_in
、fan_out
和fan_avg
中的一个,用于计算标准差stddev
的值。distribution
:分布类型,normal
或uniform
中的一个。 1. 当distribution = "normal"
时,生成truncated normal distribution
(截断正态分布)的随机数,其中stddev = sqrt(scale / n)
,n
的计算与mode
参数有关:
mode = "fan_in"
,n
为输入单元的结点数。mode = "fan_out"
,n
为输出单元的结点数。mode = "fan_avg"
,n
为输入和输出单元结点数的平均值。 2. 当distribution = "uniform"
时,生成均匀分布的随机数,假设分布区间为[-limit, limit]
,则:
limit = sqrt(3 * scale / n)
可以简写为tf.Orthogonal
,生成正交矩阵的随机数。当需要生成的参数是2
维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD
分解而来。
也称为Xavier uniform initializer
,由一个均匀分布(uniform distribution
)来初始化数据。假设均匀分布的区间是[-limit, limit]
,则:
limit = sqrt(6 / (fan_in + fan_out))
其中的fan_in
和fan_out
分别表示输入单元的结点数和输出单元的结点数。
也称之为Xavier normal initializer
,由一个truncated normal distribution
来初始化数据:
stddev = sqrt(2 / (fan_in + fan_out))
其中的fan_in
和fan_out
分别表示输入单元的结点数和输出单元的结点数。