pytorch学习笔记十:权值初始化的十种方法

在上一节中了解了为什么要进行权值初始化以及如何选择权值初始化方法,在这一节来了解一下pytroch中十种权值初始化方法

一、权值初始化流程

1、先设定什么层用什么初始化方法,初始化方法在 torch.nn.init 中给出;
2、实例化一个模型之后,执行该函数,即可完成初始化。

示例:

def initialize_weights(self):
    for m in self.modules:
        # 对卷积层进行初始化
        if isinstance(m, nn.Conv2d):
            torch.nn.init.xavier_normal_(m.weight.data)
            if m.bias is not None:
                m.bias.data.zero_()
                
        # 对BN层进行初始化
        elif isinstance(m, nn.BatchNorm2d):
            m.weight.data.fill_(1)
            m.bias.data.zero_()
            
        # 对线性层进行初始化
        elif isinstance(m, nn.Linear):
            torch.nn.init.normal_(m.weight.data, 0, 0.01)
            m.bias.data.zero_()

从self.modules中遍历每一层,判断各层属于什么类型,如 是否是 nn.Conv2d、nn.BatchNorm2d、nn.Linear 等,然后根据不同类型的
层,设定不同的权值初始化方法,例如,Xavier,kaiming,normal_,uniform_等。

二、常用的初始化方法

官网链接
1、Xavier 均匀分布

torch.nn.init.xavier_uniform_(tensor: torch.Tensor, gain: float = 1.0) → torch.Tensor

参数:tensor:一个n维的tensor
gain:缩放因子
W~U[-a, +a]
在这里插入图片描述
2、Xavier 正态分布

torch.nn.init.xavier_normal_(tensor, gain=1.0)

参数:tensor:一个n维的tensor
gain:缩放比例
W~N(0,std2)
在这里插入图片描述
3、kaiming 均匀分布

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

参数:
a:激活函数负半轴的斜率,relu是0
mode:可选fan_in或fan_out,fan_in正向传播时方差一致,fan_out反向传播时方差一致
nonlinearity:可选relu或leaky_relu,默认为leaky_relu
W~U(-bound,bound),其中bound的计算公式:
在这里插入图片描述
4、kaiming 正态分布

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

正态分布~(0,std2)
pytorch学习笔记十:权值初始化的十种方法_第1张图片
5、均匀分布初始化

torch.nn.init.uniform_(tensor, a=0.0, b=1.0)

服从均匀分布U(a,b)

6、正态分布初始化

torch.nn.init.normal_(tensor, mean=0.0, std=1.0)

使值服从正态分布 N(mean, std),默认值为 0,1

7、常数初始化

torch.nn.init.constant_(tensor, val)

使值为常数 val

8、0初始化

torch.nn.init.zeros_(tensor)

9、单位矩阵初始化

torch.nn.init.eye_(tensor)

将二维 tensor 初始化为单位矩阵(the identity matrix)
10、正交初始化

torch.nn.init.orthogonal_(tensor, gain=1)

使得 tensor 是正交的,

你可能感兴趣的:(pytorch,pytorch,学习,深度学习)