本文最后更新于:2024年5月7日 下午
在深度学习模型的训练中,权重的初始值极为重要。一个好的初始值,会使模型收敛速度提高,使模型准确率更精确, 本文介绍 Pytorch 的模型初始化 。
参考 深入浅出PyTorch ,系统补齐基础知识。
本节目录
- 常见的初始化函数
- 初始化函数的使用
torch.nn.init内容
通过访问torch.nn.init的官方文档链接 ,我们发现torch.nn.init
提供了以下初始化方法:
torch.nn.init.uniform_
(tensor, a=0.0, b=1.0)torch.nn.init.normal_
(tensor, mean=0.0, std=1.0)torch.nn.init.constant_
(tensor, val)torch.nn.init.ones_
(tensor)torch.nn.init.zeros_
(tensor)torch.nn.init.eye_
(tensor)torch.nn.init.dirac_
(tensor, groups=1)torch.nn.init.xavier_uniform_
(tensor, gain=1.0)torch.nn.init.xavier_normal_
(tensor, gain=1.0)torch.nn.init.kaiming_uniform_
(tensor, a=0, mode=‘fan__in’, nonlinearity=‘leaky_relu’) __torch.nn.init.kaiming_normal_
(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)torch.nn.init.orthogonal_
(tensor, gain=1)torch.nn.init.sparse_
(tensor, sparsity, std=0.01)torch.nn.init.calculate_gain
(nonlinearity, param=None) 关于计算增益如下表:
nonlinearity | gain |
---|---|
Linear/Identity | 1 |
Conv{1,2,3}D | 1 |
Sigmod | 1 |
Tanh | 5/3 |
ReLU | sqrt(2) |
Leaky Relu | sqrt(2/1+neg_slop^2) |
我们可以发现这些函数除了calculate_gain
,所有函数的后缀都带有下划线,意味着这些函数将会直接原地更改输入张量的值。
torch.nn.init使用
我们通常会根据实际模型来使用torch.nn.init
进行初始化,通常使用isinstance()
来进行判断模块(回顾3.4模型构建)属于什么类型。
1 |
|
对于不同的类型层,我们就可以设置不同的权值初始化的方法。
1 |
|
初始化函数的封装
人们常常将各种初始化方法定义为一个initialize_weights()
的函数并在模型初始后进行使用。
1 |
|
这段代码流程是遍历当前模型的每一层,然后判断各层属于什么类型,然后根据不同类型层,设定不同的权值初始化方法。我们可以通过下面的例程进行一个简短的演示:
1 |
|
参考资料
文章链接:
https://www.zywvvd.com/notes/study/deep-learning/pytorch/torch-learning/torch-learning-5/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付
PyTorch 学习 -5- 模型初始化
https://www.zywvvd.com/notes/study/deep-learning/pytorch/torch-learning/torch-learning-5/