PyTorch中的参数类torch.nn.Parameter()详解
什么是torch.nn.Parameter()?
torch.nn.Parameter()
类是Tensor
的子类,用于在神经网络中定义可学习的参数。在定义神经网络模型时,我们通常需要考虑模型的参数这一概念。但是仅仅声明一个带参数的函数是远远不够的,这种方式使用的变量是普通的Python变量,而不是网络定义中的参数(参数必须是能够被自动求导并进行梯度下降优化的变量)。
Parameter
是一种高效的、包含梯度信息的可优化的Tensor
。它被设计用于在深度学习框架中方便地添加并优化参数。
如何使用torch.nn.Parameter()?
使用Parameter
类定义网络参数的过程非常简单,我们只需要将需要定义为网络参数的张量转化为Parameter
对象即可。可以像下面这样定义:
import torch.nn as nn
import torch
weight = torch.rand(3, 5)
bias = torch.rand(1, 3)
linear = nn.Linear(5, 3)
# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(weight)
linear.bias = nn.Parameter(bias)
在上面示例中,我们首先通过torch.rand()
函数生成两个随机张量weight
和bias
,并使用nn.Linear(5, 3)
定义了一个线性层linear
。将weight
和bias
转化为Parameter
对象之后,它们就可以被认为是网络中的可训练参数了。
参数的初始化
在深度学习中,参数的选择和初始化是极其重要的,因为它会直接影响最终的算法表现。通常,需要使用合适的初始化方法为参数赋初值,这样可以加速模型的收敛和增加模型的精度。Parameter
类提供了许多常用的初始化方法,如下面的示例:
import torch.nn.init as init
weight = torch.empty(3, 5)
bias = torch.empty(1, 3)
# 使用正态分布(均值为0,标准差为0.02)初始化weight
init.xavier_normal_(weight)
# 使用常量初始化bias
init.constant_(bias, 0.1)
linear = nn.Linear(5, 3)
# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(weight)
linear.bias = nn.Parameter(bias)
示例1:自定义模型
下面示例展示了如何定义自己的模型,并使用网络参数进行前向传播计算。
import torch.nn as nn
import torch
class Net(nn.Module):
def __init__(self):
super().__init__()
self.linear1 = nn.Linear(784, 128)
self.linear2 = nn.Linear(128, 10)
def forward(self, x):
x = self.linear1(x)
x = nn.functional.relu(x)
x = self.linear2(x)
return x
# 使用自定义模型进行前向传播计算
net = Net()
input = torch.randn(16, 784)
output = net(input)
print(output.shape)
在上面的示例中,我们自定义了一个网络模型Net
,该模型包含两个线性层,并使用nn.functional.relu()
作为激活函数。在定义模型时,我们使用了nn.Linear
构造函数创建了两个线性层。在前向传播计算时,我们使用自定义模型Net
并传入一个16×784的张量input
进行计算,并打印输出形状output.shape
。
示例2:手动更新参数
下面示例展示了如何手动更新网络参数。
import torch.nn as nn
import torch
linear = nn.Linear(1, 1)
# 将weight和bias转化为Parameter对象,使其成为可训练参数
linear.weight = nn.Parameter(torch.tensor([[0.5]]))
linear.bias = nn.Parameter(torch.tensor([[-0.5]]))
# 手动更新参数
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)
for i in range(100):
x = torch.tensor([[2.0]])
y = linear(x)
loss = nn.functional.mse_loss(y, torch.tensor([[0.0]]))
print("before step {}: w={}, b={}, loss={}".format(i, linear.weight.data, linear.bias.data, loss))
optimizer.zero_grad()
loss.backward()
optimizer.step()
在上面示例中,我们使用nn.Linear(1, 1)
定义一个线性层,并手动设置其权重和偏置项。在后面的循环中,我们手动进行参数更新,使用torch.optim.SGD()
定义了一个梯度下降优化器,并设置学习率为0.01。每一步中,我们首先用已知的样本输入x计算输出值y并计算损失,然后使用backward()
函数计算梯度并使用step()
函数更新参数。最终,每一步结束后打印出参数及其对应的损失。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch中的参数类torch.nn.Parameter()详解 - Python技术站