这个函数理解为类型转换函数,
将一个不可训练的类型 Tensor 转换成可以训练的类型parameter
并将这个 parameter 绑定到这个module 里面
net.parameter() 中就有这个绑定的 parameter,
所以在参数优化的时候可以进行优化,
举例:
import torch
import torch.nn as nn
from torch.optim import Adam
class NN_Network(nn.Module):
def __init__(self,in_dim,hid,out_dim):
super(NN_Network, self).__init__()
self.linear1 = nn.Linear(in_dim,hid)
self.linear2 = nn.Linear(hid,out_dim)
self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
self.linear1.bias = torch.nn.Parameter(torch.ones(hid))
self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
self.linear2.bias = torch.nn.Parameter(torch.ones(hid))
def forward(self, input_array):
h = self.linear1(input_array)
y_pred = self.linear2(h)
return y_pred
in_d = 5
hidn = 2
out_d = 3
net = NN_Network(in_d, hidn, out_d)
其中NN_Network就是这个模型,
运行
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。