常用初始化方法
PyTorch 中提供了 10 中初始化方法
- Xavier 均匀分布
- Xavier 正态分布
- Kaiming 均匀分布
- Kaiming 正态分布
- 均匀分布
- 正态分布
- 常数分布
- 正交矩阵初始化
- 单位矩阵初始化
- 稀疏矩阵初始化
3、nn.init.kaiming_normal_(m.weight.data)
5、用均匀分布的值填充输入张量, 参数a:均匀分布的下界, 默认为0.; 参数b:均匀分布的上界, 默认为1
uniform_weights = nn.init.uniform_(weights, a=0., b=1.)
6、用正太分布的值填充输入张量, 参数mean:正态分布的均值, 默认为0.; 参数std:正态分布的方差, 默认为1.
normal_weights = nn.init.normal_(weights, mean=0., std=1.)
7、用常数值填充输入张量, 参数val:要填充的常数.
constant_weights = nn.init.constant_(weights, val=2)
用常数1.填充输入张量
ones_weights = nn.init.ones_(weights)
用常数0.填充输入张量
zeros_weights = nn.init.zeros_(weights)
网络层的参数初始化方法
1. 在__init__()方法中遍历self.modules()来获取模型中的每一层,然后使用 isinstance()方法对特定层的weights和bias使用特定的初始化方法。对于使用relu激活的卷积层,通常用'kaiming'初始化卷积层参数;比如:
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
2. 或者先写好初始化函数,然后使用apply()方法进行模型初始化:
def weights_init(m):
if isinstance(m, nn.Conv2d):
nn.init.xavier_normal_(m.weight.data)
nn.init.xavier_normal_(m.bias.data)
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight,1)
nn.init.constant_(m.bias, 0)
model.apply(weights_init)