前言
這兩個都是一個東西,使用上有細微差別。
差別
- Parameter()
Parameter
是Tensor
,即Tensor
擁有的屬性它都有,⽐如可以根據data
來訪問參數數值,⽤grad
來訪問參數梯度。
舉例:
# 隨便定義一個網絡
net = nn.Sequential(nn.Linear(4, 3), nn.ReLU(), nn.Linear(3, 1))
# list讓它可以訪問
weight_0 = list(net[0].parameters())[0]
print(weight_0.data)
print(weight_0.grad)
'output'
tensor([[ 0.2719, -0.0898, -0.2462, 0.0655],
[-0.4669, -0.2703, 0.3230, 0.2067],
[-0.2708, 0.1171, -0.0995, 0.3913]])
None
- register_parameter(name, param)
向我們建立的網絡module
添加parameter
最大的區別:parameter
可以通過註冊網絡時候的name
獲取。
舉例
舉例如下
class Example(nn.Module):
def __init__(self):
super(Example, self).__init__()
print('看看我們的模型有哪些parameter:\t', self._parameters, end='\n')
self.W1_params = nn.Parameter(torch.rand(2,3))
print('增加W1後看看:',self._parameters, end='\n')
self.register_parameter('W2_params' , nn.Parameter(torch.rand(2,3)))
print('增加W2後看看:',self._parameters, end='\n')
def forward(self, x):
return x
輸出:
mymodel = Example()
'''
看看我們的模型有哪些parameter: OrderedDict()
增加W1後看看: OrderedDict([('W1_params', Parameter containing:
tensor([[0.0479, 0.9264, 0.1193],
[0.5004, 0.7336, 0.6464]], requires_grad=True))])
增加W2後看看: OrderedDict([('W1_params', Parameter containing:
tensor([[0.0479, 0.9264, 0.1193],
[0.5004, 0.7336, 0.6464]], requires_grad=True)), ('W2_params', Parameter containing:
tensor([[0.1028, 0.2370, 0.8500],
[0.6116, 0.0463, 0.4229]], requires_grad=True))])
'''
打印出來看看
for k,v in mymodel.named_parameters():
print(k,v)
W1_params Parameter containing:
tensor([[0.4610, 0.2772, 0.5786],
[0.7729, 0.0163, 0.4747]], requires_grad=True)
W2_params Parameter containing:
tensor([[0.4058, 0.8788, 0.2411],
[0.5428, 0.9389, 0.5968]], requires_grad=True)