在深度学习训练过程中,有时需要在网络中添加额外的参数,这时候可有选择nn.Parameter()或者register_buffer()的方式,关于buffer和Parameter,我的理解是:它们都是可以随着model.cuda()一起加载到gpu上的,也可以一起被会保存在model.state_dict()中,但是不同之处在于,nn.Parameter()中的变量是可以计算梯度。并且会被optimizer.step()更新的,而register_buffer()一般来说,requires_grad默认为False,就是说一般不计算梯度,如果手动设置成True可以计算梯度,但是optimizer.step()时,并不会被更新。
import torch
from torch import nn
class mymodel(nn.Module):
def __init__(self):
super(mymodel, self).__init__()
self.linear = nn.Linear(4, 1)
def forward(self, x):
return self.linear(x)
model = mymodel()
print(list(model.named_parameters()))
[(‘linear.weight’, Parameter containing:
tensor([[ 0.1173, -0.0988, -0.0900, -0.2869]], requires_grad=True)), (‘linear.bias’, Parameter containing:
tensor([-0.1965], requires_grad=True))]
注册weight parameters,名字为test
print('注册weight parameters,名字为test:')
my_test = nn.Parameter(torch.tensor([[-0.0995, 0.4867, -0.4920, -0.1703]]))
model.register_parameter('test',my_test)
print(list(model.named_parameters()))
[(‘test’, Parameter containing:
tensor([[-0.0995, 0.4867, -0.4920, -0.1703]], requires_grad=True)), (‘linear.weight’, Parameter containing:
tensor([[ 0.2731, 0.3823, -0.1088, -0.3679]], requires_grad=True)), (‘linear.bias’, Parameter containing:
tensor([-0.4443], requires_grad=True))]
See https://zhuanlan.zhihu.com/p/571590961?utm_id=0