网络权重自定义初始化
为什么需要权重初始化
在深度学习过程中,良好的权重初始化,会加速模型收敛。我们在定义例如 nn.Conv2d 之后,会自动进行权重初始化。 但是,有些情况下,我们需要进行自定义的权重初始化。例如, DCGan (生成对抗网络)指出,所有模型权重应该随机初始化为一个正则分布(Normal distribution),均值为0,方差为 0.02.
权重初始化的思路
- 首先构建你的网络类。例如 Generate类
- 定义各个模型初始化的函数 weights_init(m) 。这个函数具有通用性,对于其他的网络自定义初始化也可以使用。
- 将 Generate类实例化之后,应用apply方法。
自定义模型初始化函数具体代码剖析
定义自定义模型初始化函数。
1 | # 初始化模型权重 |
nn.init 中提供很多用于权重初始化的方法。
1. nn.init.constant_
1 | torch.nn.init.constant_(tensor, val) |
用 val 值 来填充 tensor 张量。
举例:
以下例子是对网络的某一层参数进行初始化
1 | import torch |
输出
1 | m: tensor([[5.7241e-06, 1.2738e-42], |
2. nn.init.normal_
1 | torch.nn.init.normal_(tensor, mean=0.0, std=1.0, generator=None) |
使用正态分布得到的值填充张量。
注: std 是标准差! 不是方差
举例
1 | import torch |
输出
1 | m: tensor([[0., 0.], |
3. m.weight.data, m.bias.data
m.weight.data, m.bias.data 获得模型的权重和偏置数据,类型是 tensor
1 | import torch |
输出
1 | m.weight -> Parameter containing: |
1 | type m.weight -> <class 'torch.nn.parameter.Parameter'> |
1 | m.weight.data -> tensor([[[[-0.1054, 0.0425, -0.1113], |
1 | type m.weight.data -> <class 'torch.Tensor'> |
1 | type m.weight.data -> <class 'torch.Tensor'> |
1 | type m.bias -> <class 'torch.nn.parameter.Parameter'> |
1 | m.bias.data -> tensor([-0.0249, -0.0707, 0.0400, -0.1284, -0.1467, -0.0915, 0.0905, -0.0056, |
1 | type m.bias.data -> <class 'torch.Tensor'> |
Generator类代码
1 | class Generator(nn.Module): |
应用实例化对象的 apply 方法
对整个网络的参数进行初始化定制
apply函数会递归地搜索网络内的所有module并把参数表示的函数应用到所有的module上。
torch.nn.Module中的方法 .apply(fn)
1 | apply(fn) |
递归的将fn用于每一个子模块。
应用:
1 | netG = Generator().to(device) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 灵鹫宫·宫主!