参考链接
- https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter04_DL_computation/4.2_parameters
参数的访问
我们可以通过Module类的parameters()或者named_parameters()方法来访问所有参数(以迭代器的形式返回),后者除了返回参数Tensor外还会返回其名字。下面,访问多层感知机net的所有参数:
for name, param in net.named_parameters():
print(name, param.size())
参数的初始化
PyTorch中的nn.Module的模块参数都采取了较为合理的初始化策略。但我们经常需要使用其他方法来初始化权重。PyTorch的init模块里提供了多种预设的初始化方法。下面的例子中,将权重初始化为均值为0、标准差为0.01的正态分布随机数,并将偏差参数清零。
for name, param in net.named_parameters():
if 'weight' in name:
init.normal_(param, mean=0, std=0.01)
print(name, param.data)
for name, param in net.named_parameters():
if 'bias' in name:
init.constant_(param, val=0)
print(name, param.data)
自定义初始化方法
有时候我们需要的初始化方法并没有在init模块中提供。这时,可以实现一个初始化方法,能够像使用其他初始化方法那样使用它。下面实现一个自定义的初始化方法,我们令权重有一半概率初始化为0,有另一半概率初始化为[-10,-5]和[5,10]两个区间里均匀分布的随机数。
def init_weight_(tensor):
with torch.no_grad():
tensor.uniform_(-10, 10)
tensor *= (tensor.abs() >= 5).float()
for name, param in net.named_parameters():
if 'weight' in name:
init_weight_(param)
print(name, param.data)
参数的共享
Module类的forward函数里多次调用同一个层。此外,如果我们传入Sequential的模块是同一个Module示例的话参数也是共享的。
因为模型参数里包含了梯度,所以在反向传播计算时,这些共享的参数的梯度是累加的。