tensorflow和pytorch中的参数初始化调用方法
神经网络中最重要的就是参数了,其中包括权重项
只列一些常用的!
Tensorflow
常数初始化
tf.constant_initializer(value)
value取0,则代表的是全0初始化,也可以表示为 tf.zeros_initializer()
value取1,则代表的是全1初始化,也可以表示为 tf.ones_initializer()
随机均匀初始化器
tf.random_uniform_initializer(minval=0, maxval=None)
不需要指定最小值和最大值的均匀初始化:
tf.uniform_unit_scaling_initializer(factor=1.0)
随机正态初始化器
(均值为0,方差为1)
tf.random_normal_initializer(mean=0.0, stddev=1.0)
截断正态分布初始化器
(均值为0,方差为1)
tf.truncated_normal_initializer(mean=0.0, stddev=1.0)
正交矩阵初始化器
tf.orthogonal_initializer()
生成正交矩阵的随机数。当需要生成的参数是2维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD分解而来。
Xavier uniform 初始化器
tf.glorot_uniform_initializer()
初始化为与输入输出节点数相关的均匀分布随机数,和xavier_initializer()是一个东西
假设均匀分布的区间是[-limit, limit],则
其中的fan_in和fan_out分别表示输入单元的结点数和输出单元的结点数。
Xavier normal 初始化器
tf.glorot_normal_initializer()
初始化为与输入输出节点数相关的截断正太分布随机数
其中的fan_in和fan_out分别表示输入单元的结点数和输出单元的结点数。
变尺度正态、均匀分布
tf.variance_scaling_initializer(scale=1.0,mode="fan_in", distribution="truncated_normal")
- scale: 缩放尺度
- mode: 有3个值可选,分别是 “fan_in”, “fan_out” 和 “fan_avg”,用于控制计算标准差 stddev的值
- distribution: 2个值可选,”normal”或“uniform”,定义生成的tensor的分布是截断正太分布还是均匀分布
distribution选‘normal’的时候,生成的是截断正太分布,标准差 stddev = sqrt(scale / n), n的取值根据mode的不同设置而不同:
- mode = "fan_in", n为输入单元的结点数;
- mode = "fan_out",n为输出单元的结点数;
- mode = "fan_avg",n为输入和输出单元结点数的平均值;
distribution选 ‘uniform’,生成均匀分布的随机数tensor,最大值 max_value和 最小值 min_value 的计算公式:
- max_value = sqrt(3 * scale / n)
- min_value = -max_value
he初始化
如果使用relu激活函数,最好使用He初始化,因为在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所有要保持variance不变。
tf.contrib.layers.variance_scaling_initializer()
Xavier初始化
如果激活函数用sigmoid和tanh,最好用xavier初始化器,
Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0.
from tensorflow.contrib.layers import xavier_initializer
pytorch
PyTorch 中参数的默认初始化在各个层的 reset_parameters()
方法中。例如:nn.Linear
和 nn.Conv2D
,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 limit 是
下面是几种常见的初始化方式
常数初始化
nn.init.constant_(w, 0.3)
均匀分布
nn.init.uniform_(w)
正态分布
nn.init.normal_(w, mean=0, std=1)
xavier_uniform 初始化
Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。这是通用的方法,适用于任何激活函数。
# 默认方法 for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.Linear)): nn.init.xavier_uniform_(m.weight)
也可以使用 gain
参数来自定义初始化的标准差来匹配特定的激活函数:
for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.Linear)): nn.init.xavier_uniform_(m.weight(), gain=nn.init.calculate_gain('relu'))
xavier_normal 初始化
nn.init.xavier_normal_(w)
kaiming_uniform 初始化
nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')
kaiming_normal 初始化
He initialization的思想是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0。推荐在ReLU网络中使用。
for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.Linear)): nn.init.kaiming_normal_(m.weight, mode='fan_in')
正交初始化(Orthogonal Initialization)
主要用以解决深度网络下的梯度消失、梯度爆炸问题,在RNN中经常使用的参数初始化方法。
for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.Linear)): nn.init.orthogonal(m.weight)
Batchnorm Initialization
在非线性激活函数之前,我们想让输出值有比较好的分布(例如高斯分布),以便于计算梯度和更新参数。Batch Normalization 将输出值强行做一次 Gaussian Normalization 和线性变换:
for m in model: if isinstance(m, nn.BatchNorm2d): nn.init.constant(m.weight, 1) nn.init.constant(m.bias, 0)
参考
【知乎文章】权重/参数初始化
【CSDN文章】pytorch中的参数初始化方法总结
【CSDN文章】tensorflow 学习笔记(九)- 参数初始化(initializer)
作者:凌逆战
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
本文章不做任何商业用途,仅作为自学所用,文章后面会有参考链接,我可能会复制原作者的话,如果介意,我会修改或者删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2019-11-10 OpenCV图像处理以及人脸识别