【Pytorch】各网络层的默认初始化方法

在模型权重的初始化函数一文中,已经介绍了常见的网络权重初始化方法,本文再分下在pytorch源码中,对各网络层的默认初始化策略。

在pytorch的所有自带网络层中,均通过reset_parameters函数在初始化网络Parameters

1. FC层
weight参数采用了He-uniform初始化策略,而bias采用了简单的均匀分布初始化策略(均匀分布参数根据特征数计算)

def reset_parameters(self):
    init.kaiming_uniform_(self.weight, a=math.sqrt(5))
    if self.bias is not None:
        fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
        bound = 1 / math.sqrt(fan_in)
        init.uniform_(self.bias, -bound, bound)

2. Embedding层
采用了标准的(-1,1)匀分布初始化策略,注意若设置了padding,则其初始化值为元素为0的张量,且不参与梯度的更新。

def reset_parameters(self):
    init.normal_(self.weight)
    if self.padding_idx is not None:
        with torch.no_grad():
            self.weight[self.padding_idx].fill_(0)

3. Conv层
卷积网络的基类中采用了和FC层一样的初始化方法,即weight参数采用了He-uniform初始化策略,而bias采用了简单的均匀分布初始化策略(均匀分布参数根据特征数计算):

def reset_parameters(self):
    n = self.in_channels
    init.kaiming_uniform_(self.weight, a=math.sqrt(5))
    if self.bias is not None:
        fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
        bound = 1 / math.sqrt(fan_in)
        init.uniform_(self.bias, -bound, bound)

4.RNN层
递归网络的基类采用了均匀分布的初始化策略,其参数由设置的hidden_size计算:

def reset_parameters(self):
    stdv = 1.0 / math.sqrt(self.hidden_size)
    for weight in self.parameters():
        init.uniform_(weight, -stdv, stdv)

你可能感兴趣的:(Pytorch)