对于一个神经元来说,需要初始化的参数有两类:一类是权重W,还有一类是偏置b,虽然偏置b的初始化为可以使用0或者随机书代替,但是权重的初始化会对模型的训练有重要影响。
这是tensorflow 2中的初始化权重的方法,不同维度的卷积设置不同,如下:
1维卷积Conv1D及其反卷积Conv1DTranspose:
tf.keras.layers.Conv1D(
filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
groups=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
tf.keras.layers.Conv1DTranspose(
filters,
kernel_size,
strides=1,
padding='valid',
output_padding=None,
data_format=None,
dilation_rate=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
二维卷积Conv2D及其反卷积Conv2DTranspose
:
tf.keras.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
groups=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
tf.keras.layers.Conv2DTranspose(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
output_padding=None,
data_format=None,
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
三维卷积Conv3D及其反卷积Conv3DTranspose:
tf.keras.layers.Conv3D(
filters,
kernel_size,
strides=(1, 1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1, 1),
groups=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
tf.keras.layers.Conv3DTranspose(
filters,
kernel_size,
strides=(1, 1, 1),
padding='valid',
output_padding=None,
data_format=None,
dilation_rate=(1, 1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
https://www.tensorflow.org/api_docs/python/tf/keras/initializers
其权重的初始化主要是设置kernel_initializer,它的设置可以在上面网页上选择。
介绍一下正态分布随机初始化和均匀分布随机初始化,分别是是针对连续性问题和随机性问题的随机初始化。基于权重特点初始化的特征,重点介绍一下这两种初始化方法:
import tensorflow as tf
# 进行实例化
initializer = tf.keras.initializers.glorot_normal(seed = 123) # 这里给了随机数,如果每次都要随机,可以不设置。
# 采样得到权重值
values = initializer(shape=(3, 3))
print(values)
print:
tf.Tensor(
[[ 0.04128221 -0.1245332 0.23356739]
[ 0.33747318 0.17235029 -0.2930978 ]
[-0.5966269 0.07215903 -0.3348947 ]], shape=(3, 3), dtype=float32)
import tensorflow as tf
# 进行实例化
initializer = tf.keras.initializers.glorot_uniform(seed = 123) # 这里给了随机数,如果每次都要随机,可以不设置。
# 采样得到权重值
values = initializer(shape=(3, 3))
print(values)
输出:
tf.Tensor(
[[-0.04798412 -0.22223973 -0.9824271 ]
[-0.57410717 -0.79084826 -0.6723347 ]
[-0.54534245 -0.14903617 0.22151732]], shape=(3, 3), dtype=float32)
该方法的基本思想是各层的激活值和梯度的方差在传播过程中保持一致。即初始化通过从均值为零和特定方差的分布中提取权重来初始化网络中的权重。
该初始化的缺点:
因为Xavier的推导过程是基于几个假设的,其中一个是激活函数是线性的,这并不适用于ReLU,sigmoid等非线性激活函数;另一个是激活值关于0对称,这个不适用于sigmoid函数和ReLU函数它们不是关于0对称的。
import tensorflow as tf
# 进行实例化
initializer = tf.keras.initializers.he_normal(seed = 123) # 这里给了随机数,如果每次都要随机,可以不设置。
# 采样得到权重值
values = initializer(shape=(3, 3))
print(values)
输出:
tf.Tensor(
[[ 0.7270484 -0.86636555 0.6590073 ]
[ 1.6904085 -0.21603663 -1.3408647 ]
[-1.0661149 -0.16703579 -0.8237521 ]], shape=(3, 3), dtype=float32)
import tensorflow as tf
# 进行实例化
initializer = tf.keras.initializers.he_uniform(seed = 123) # 这里给了随机数,如果每次都要随机,可以不设置。
# 采样得到权重值
values = initializer(shape=(3, 3))
print(values)
结果:
tf.Tensor(
[[-0.06785977 -0.31429446 -1.3893617 ]
[-0.81191015 -1.1184283 -0.9508248 ]
[-0.7712307 -0.21076894 0.31327283]], shape=(3, 3), dtype=float32)
BN初始化不同于上面说的初始化情况,并不是在初始的时候给一个初始值,它的存在主要是为了防止梯度消失,它作用在每层网络中。具体是随着网络层数的增加,分布逐渐发生偏移,之所以收敛慢,是因为整体分布往非线性函数取值区间的上下限靠近。这会导致反向传播时梯度消失。BN就是通过规范化的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值0方差1的标准正态分布,使得激活输入值落入非线性函数中比较敏感的区域。可以让梯度变大,学习收敛速度快,能大大加快收敛速度。
更多的初始化方法可以见http://121.199.45.168:10006/deeplearning/section1/