这个函数理解为类型转换函数,
    将一个不可训练的类型 Tensor 转换成可以训练的类型parameter
    并将这个 parameter 绑定到这个module 里面
    net.parameter() 中就有这个绑定的 parameter,
    所以在参数优化的时候可以进行优化,

    举例:

    1. import torch
    2. import torch.nn as nn
    3. from torch.optim import Adam
    4. class NN_Network(nn.Module):
    5. def __init__(self,in_dim,hid,out_dim):
    6. super(NN_Network, self).__init__()
    7. self.linear1 = nn.Linear(in_dim,hid)
    8. self.linear2 = nn.Linear(hid,out_dim)
    9. self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
    10. self.linear1.bias = torch.nn.Parameter(torch.ones(hid))
    11. self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
    12. self.linear2.bias = torch.nn.Parameter(torch.ones(hid))
    13. def forward(self, input_array):
    14. h = self.linear1(input_array)
    15. y_pred = self.linear2(h)
    16. return y_pred
    17. in_d = 5
    18. hidn = 2
    19. out_d = 3
    20. net = NN_Network(in_d, hidn, out_d)

    其中NN_Network就是这个模型,
    运行

    1. list(net.parameters())

    输出

    [Parameter containing:
     tensor([[0., 0.],
             [0., 0.],
             [0., 0.],
             [0., 0.],
             [0., 0.]], requires_grad=True), Parameter containing:
     tensor([1., 1.], requires_grad=True), Parameter containing:
     tensor([[0., 0.],
             [0., 0.],
             [0., 0.],
             [0., 0.],
             [0., 0.]], requires_grad=True), Parameter containing:
     tensor([1., 1.], requires_grad=True)]
    

    就会发现linear1和linear2 的weight 和bias 都被绑定在net.parameters()中
    而且可以把他放到优化器中,如

    opt = Adam(net.parameters(), lr=0.001)
    

    torch.nn.Parameter是继承自torch.Tensor的子类,
    其主要作用是作为nn.Module中的可训练参数使用。
    它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,
    即加入到parameter()这个迭代器中去;
    而module中非nn.Parameter()的普通tensor是不在parameter中的。
    torch.nn.Linear()函数
    linear里面的weight和bias就是parameter类型,
    且不能够使用tensor类型替换,
    还有linear里面的weight甚至可能通过指定一个不同于初始化时候的形状进行模型的更改。
    一般是多维的可训练tensor。