在我们搭建网络模型时,初始化模型参数是非常重要的,过大或者过小以及​​参数分布​​​都会影响​​模型的收敛​​​以及​​训练速度​​。

但是对于一些已经实现好的层,这些层已经根据不同层的特点实现好了​​参数初始化​​策略,例如Linear和Conv2d等已经实现好了内部参数,不需要手动设置。

但是我们也可以使用自定义的初始化策略来代替pytorch默认的参数初始化策略,可以使用nn模块中的​​init​​​来实现这个功能,该模块内部已经实现了许多参数初始化策略,例如:​​xavier_uniform​​​、​​xavier_normal​​等。

下面我们使用实例来说明如何使用:

class Linear(nn.Module):
def __init__(self):
super().__init__()
self.w = nn.Parameter(torch.randn(3, 4))
self.b = nn.Parameter(torch.randn(1, 3))

def init_parameter():
nn.init.xavier_normal_(self.w)
nn.init.xavier_normal_(self.b)

def forward(self, x):
return F.linear(x, w, b)

我们首先需要定义好需要的参数矩阵,然后利用nn.init模块中的参数初始化函数进行初始化,只需要把需要修改的参数矩阵传入即可。

如果对于nn.init模块中没有我们需要的初始化策略,我们可以自己定义函数进行初始化,无非就是定义一些运算修改参数矩阵罢了。