pytorch中的register_parameter()和parameter()

前言

這兩個都是一個東西,使用上有細微差別。

差別

  1. Parameter()
    ParameterTensor,即 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
  1. 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章