![](https://img-blog.csdnimg.cn/20210412224055543.png)
一、概述
模型的权重是模型的参数,模型初始构建时,权重参数的初始化对模型的确定影响比较大,keras中通过initializers模块定义了模型初始化的常见方法。该模块的导入语句和初始化方法定义语句为:
from keras import initializers
my_init = initializers.initFunXXXXX()
其中的initFunXXXXX泛指某个初始化方法,在实际使用时根据模型初始化方法使用不同的函数。
二、常见初始化方法详解
下面是一些常见的模型参数初始化方法及keras对应的具体函数:
2.1、零值初始化
所有权重参数初始化为0,在keras中用Zeros()函数实现
2.2、1值初始化
所有权重参数初始化为1,在keras中用Ones()函数实现
2.3、常量初始化
所有权重参数初始化为某个常量,在keras中用Constant(value)函数实现,其中value是要初始化为指定常量的具体值
2.4、正态分布初始化
权重参数初始化从参数指定的具有特定均值和标准差的正态分布中随机抽取值来填充权重矩阵,用于以正态分布(高斯分布)的方式初始化神经网络的权重,使用正态分布初始化的权重有助于梯度下降算法在训练开始时更稳定地收敛。从具有特定均值和标准差的正态分布中随机抽取值来填充权重矩阵,有助于打破权重的对称性,避免在训练开始时所有神经元的响应相同。
在keras中用RandomNormal(mean,stddev,seed)函数实现,其中:
- 参数mean :一个 Python 标量或者一个标量张量。要生成的随机值的平均数,默认为 0.0;
- 参数stddev : 一个 Python 标量或者一个标量张量,要生成的随机值的标准差,正态分布的标准差,控制权重的初始范围,默认为 0.05。较小的标准差意味着权重初始值更接近 0,而较大的标准差意味着权重初始值分散得更广;
- 参数seed:整数, 随机数生成器的种子。用于确保随机数生成的可重复性。如果未指定,将使用随机种子。
2.5、均匀分布初始化
权重参数初始化从特定的均匀分布数据中随机抽取值来初始化神经网络的权重,均匀分布的区间上下限由参数指定,这种初始化方式有助于打破权重的对称性,并且可以控制权重的初始范围。
在keras中用RandomUniform(minval ,maxval,seed)函数实现,其中:
- minval:一个 Python 标量或者一个标量张量。要生成的随机值的区间下限,默认为浮点类型的-0.05
- maxval : 一个 Python 标量或者一个标量张量。要生成的随机值的区间下限,默认为浮点类型的 0.05
2.6、截断正态分布初始化
权重参数初始化从参数指定的截断正态分布中随机抽取值来填充权重矩阵,生成的随机值与 RandomNormal 生成的类似,但是在距离平均值两个标准差之外的随机值将被丢弃并重新生成。这种模式从一个标准正态分布中抽取值,但是排除了距离均值较远的值(即距离均值超过某个标准差倍数的值),以避免生成极端值,这有助于维持权重的稳定性,特别是在深度学习中使用 ReLU 激活函数时非常有用。这可以减少由于权重过大或过小导致的梯度消失或爆炸问题。
在keras中用TruncatedNormal(mean=0.0, stddev=0.05,seed)函数来实现,这个函数的参数含义与RandomNormal相同。
2.7、lecun 正态分布初始化
使用输入单元数相关的 lecun 正态分布数据中随机抽取值来初始化神经网络的权重。LeCun 正态分布并不是统计学中的术语,而是是一种神经网络特定类型的权重初始化方法。lecun 正态分布以 0 为中心,根据输入单元数(fan_in)来计算标准差,其方差固定为σ²=1/fad_in,因此标准差sqrt(1/fad_in)。
在keras中用lecun_normal(seed=None)函数实现;
2.8、lecun 均匀分布初始化
权重参数从 [-limit,limit] 中的均匀分布中抽取样本,样本方差固定为:1/fan_in,fan_in 是输入单元数量, 因此 limit= sqrt(3 / fan_in)。
lecun 均匀分布初始化器在keras中用lecun_uniform(seed=None)函数实现。
老猿注:区间[a,b]上的均匀分布的方差为(b-a)²/12,b和a分别为上下限,具体推导过程在此不展开介绍。在lecun 均匀分布下b=limit,a=-limit,因此方差为limit²/3,其值又等于 1 / fan_in,因此可以得到均匀分布上限limit的值。
2.9、Glorot 正态分布初始化
也称为 Xavier 正态分布初始化器。Glorot 正态分布定义为以 0 为中心、方差为: 2 / (fan_in + fan_out) 、标准差为: sqrt(2 / (fan_in + fan_out)) 的截断正态分布, 其中 fan_in 是输入单元的数量, fan_out 是输出单元的数量。这种初始化方法特别适用于具有sigmoid或tanh激活函数的网络。
在keras中用glorot_normal(seed=None)函数实现;
2.10、Glorot 均匀分布初始化
也称为 Xavier 均匀分布初始化,Glorot 均匀分布定义为区间 [-limit,limit] 上的均匀分布,其方差要求为:2/(fan_in + fan_out)、标准差为sqrt(2/(fan_in + fan_out)),其中fan_in 是输入单元数量, fan_out 是输出单元数量,按照方差可以推出limit = sqrt(6 / (fan_in + fan_out))。Glorot 均匀分布初始化从Glorot 均匀分中抽取样本初始化权重参数 。
2.11、He 正态分布初始化
He 正态分布定义为以 0 为中心,方差为:2/fan_in、标准差为: sqrt(2 / fan_in) 的截断正态分布,其中 fan_in 是权值张量中的输入单元的数量。
在keras中用he_normal(seed=None)函数实现。
2.12、He 均匀方差缩放初始化
He 均匀方差定义为 [-limit,limit] 区间上的均匀分布,其方差要求为:2/fan_in 、标准差为:sqrt(2/fan_in),其中fan_in 是输入单元数量,按照方差可以推出limit = sqrt(6/fan_in )。
在keras中用he_uniform(seed=None)函数实现。
2.13、可变缩放初始化
根据网络层的特定特征(如输入单元数或输出单元数n,由参数指定)和缩放因子scale来初始化权重,这些初始化权重的方差固定设置为 scale / n,其中scale为缩放因子参数,n 是输入单元数和输出单元数来计算,具体根据参数决定。
在keras中用VarianceScaling(scale=1.0, mode=‘fan_in’,distribution=‘uniform’)函数来实现,其中:
- 参数scale:一个正数浮点数,scale 是一个乘法因子。默认情况下,scale 的值是 1.0,通过改变 scale 的值,可以控制权重的初始大小,较大的 scale 值会使权重的初始值更大,而较小的 scale 值会使权重的初始值更小。如果权重初始值太大,可能会导致梯度爆炸;如果太小,则可能会导致梯度消失;
- mode:一个字符串,指定n取值的模式。可以是 ‘fan_in’(默认)、 ‘fan_out’、‘fan_avg’,这三个取值分别设定n的值为输入单元数量、输出单元数量、输入和输出单元数的平均值;
- distribution:一个字符串,指定用于初始化的分布。可以是 ‘uniform’ 或 ‘normal’,分别表示均匀分布和截断正态分布,相关分布首先满足分布的方差固定设置为 scale / n,如果是均匀分布,其分布区间的上下限[-limit,limit]中的limit = sqrt(3 * scale / n),对于正态分布N(x|u,σ²),样本是从一个以u=0 为中心、方差σ=sqrt(scale / n)的截断正态分布中抽取的。
老猿注:
- 对于正态分布N(x|u,σ²),其方差为 σ²,标准差stddev为σ,由于VarianceScaling将方差固定设置为 scale / n,因此可使用stddev = σ=sqrt(scale / n)公式找到正态分布的标准差stddev值;
- 对于均匀分布,使用limit = sqrt(3 * scale / n)公式找到均匀分布的极限,在均匀分布中,极限是指分布的上下限,即随机变量可能取值的范围边界;
- 均匀分布的方差为(b-a)²/12,b和a分别为上下限,在此情况下b=limit,a=-limit,因此方差为limit²/3,其值又等于 scale / n,因此可以得到均匀分布上限limit的值。
2.14、随机正交矩阵初始化
权重参数使用随机正交矩阵进行初始化,生成的随机正交矩阵先进行列向量归一化,使得它们的范数(或长度)为1,然后根据参数对归一化后的正交矩阵进行缩放,以调整权重的初始大小。
keras中使用Orthogonal(gain=1.0, seed=None)函数实现,其中gain为正交矩阵的缩放因子
2.15、单位矩阵初始化
用单位矩阵(是一个主对角线上的元素都是1,其余位置的元素都是0的方阵)作为权重参数初始矩阵,仅用于 权重参数矩阵为2D 方阵情况。
keras中使用Identity(gain=1.0)函数实现,参数gain为缩放因子,1.0表示仅用单位矩阵,如果是其他值,则用该值乘以单位矩阵的结果作为权重参数初始矩阵
2.16、自定义初始化
在Keras中支持自定义初始化器来初始化权重参数,函数必须使用参数 shape(需要初始化的权重矩阵的形状)和 dtype(数据类型),下面是段示例代码:
from keras import backend as K
def my_init(shape, dtype=None):
return K.random_normal(shape, dtype=dtype)
model.add(Dense(64, kernel_initializer=my_init))
## 三、一个完整的构建Keras层并训练的例子
```python
import numpy as np
import tensorflow as tf
from keras import models,initializers
from keras.layers import Dense
from keras.constraints import MinMaxNorm
# 获取 TensorFlow 的日志器
logger = tf.get_logger()
# 设置日志级别为 ERROR,这样就不会显示 INFO 级别的训练输出信息
logger.setLevel('ERROR')
#设置模型的输入数据个数为4
shape = 4
# 设置随初始权重为6
my_init = initializers.Constant(value =6)
#设置约束为MinMaxNorm
my_constrain = MinMaxNorm(min_value = min, max_value = max, rate = rate, axis = 0)
#创建模型
model1 = models.Sequential()
model1.add(Dense(shape, activation='relu', kernel_initializer=my_init,kernel_constraint=my_constrain,input_shape=(shape,)))
# 使用优化器和损失函数编译模型
model1.compile(optimizer='adam', loss='mean_squared_error')
# 创建一些全1的数据来训练
x_train = np.ones((shape, shape))
y_train = np.ones((shape, 1))
# 使用训练数据对模型训练一个周期
model1.fit(x_train, y_train, epochs=1, batch_size=4,verbose=0)
三、小结
本文详细介绍了Keras中initializers模块常见模型初始化方法的含义,文章大部分内容来源于官网参考文档:Keras初始化器的用法 ,部分内容为笔者单独研究进行的补充,有助于深入理解各个初始化器的用法。最后使用keras提供了一个完整的简单模型进行训练的例子。
更多人工智能知识学习请关注专栏《零基础机器学习入门》后续的文章。
更多人工智能知识学习过程中可能遇到的疑难问题及解决办法请关注专栏《机器学习疑难问题集》后续的文章。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。