使用pytorch实现一个直线的拟合模型,具体参数介绍等见注释
import torch
x_data = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_data = torch.tensor([[3.0], [5.0], [7.0], [9.0]])
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
# 这里的参数1, 1指的是线性层的输入和输出维度。torch.nn.Linear()函数的第一个参数是输入维度,第二个参数是输出维度。在这个代码中,
# 输入数据x的维度为1,输出数据y的维度也为1,因此使用torch.nn.Linear(1, 1)创建了一个输入维度为1,输出维度为1的线性层。
# 这个线性层的作用是将输入数据x映射到输出数据y,即y = wx + b,其中w是线性层的权重,b是线性层的偏置。在模型训练过程中,模型会自动学习到最优的权重和偏置,使得模型能够更好地拟合数据。
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
# self.linear(x)是在进行线性变换,即将输入数据x通过线性层进行映射,得到输出数据y_pred。在这个代码中,self.linear是一个torch.nn.Linear对象,
# 它包含了一个权重矩阵和一个偏置向量,这些参数会在模型训练过程中自动学习到最优值。当输入数据x传入self.linear(x)时,线性层会将x与权重矩阵相乘,
# 再加上偏置向量,得到输出数据y_pred。具体来说,y_pred = self.linear(x)的计算过程为:y_pred = x * w + b,
# 其中x是输入数据,w是权重矩阵,b是偏置向量。这个线性变换是线性回归模型的核心部分,它将输入数据x映射到输出数据y_pred,用于拟合输入数据和对应的输出数据。
y_pred = self.linear(x)
return y_pred
model = LinearModel()
criterion = torch.nn.MSELoss(size_average=False)
# optimizer = torch.optim.SGD(model.parameters(), lr=0.01)是在定义优化器,即随机梯度下降优化器。在这个代码中,
# 使用了torch.optim.SGD()函数创建了一个随机梯度下降优化器,它的作用是根据损失函数的梯度来更新模型参数,使得模型能够更好地拟合数据。
# 具体来说,SGD优化器会根据损失函数的梯度对模型参数进行更新,更新公式为:θ = θ - lr * ∇L(θ),其中θ表示模型参数,lr表示学习率,∇L(θ)表示损失函数关于模型参数的梯度。
# 在这个代码中,使用了model.parameters()来获取模型的所有参数,
# 然后将其传入SGD优化器中,使得优化器能够更新模型的所有参数。同时,lr=0.01表示学习率为0.01,它控制了每次参数更新的步长,过大或过小的学习率都会影响模型的训练效果。
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(1000):
# 对x_data的每个值求出y hat,这里的y_pred对应x中每个值计算后的value
y_pred = model(x_data)
# 计算均方误差
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
# 梯度归零方便更新新的梯度
optimizer.zero_grad()
loss.backward()
# 更新模型参数
optimizer.step()
print('w=', model.linear.weight.item())
print('b=', model.linear.bias.item())
x_test = torch.Tensor([[5.0]])
y_test = model(x_test)
print('y_pred=', y_test.data)