模型y=x*w+b,使用Pytorch实现梯度下降算法,构建线性回归模型
- import torch
- import sys
- #3行1列的二位tensor
- x_data=torch.Tensor([[1.0],[2.0],[3.0]])
- y_data=torch.Tensor([[2.0],[4.0],[6.0]])
-
- class LinearModel(torch.nn.Module):
- def __init__(self, *args, **kwargs) -> None:
- # 调用父类的__init__()方法,这是PyTorch的约定,确保子类正确地初始化父类的部分
- super(LinearModel,self).__init__()
- # 创建一个线性层,输入通道数为1,输出通道数为1。这通常被称为一个线性模型或者全连接层
- self.linear=torch.nn.Linear(1,1)
-
- def forward(self,x):
- #将输入数据x传递给线性层,并将结果存储在y_pred中。线性层将每个输入值映射到一个输出值。
- y_pred=self.linear(x)
- return y_pred
-
- model=LinearModel()
- # 创建一个均方误差损失函数对象,该对象用于衡量模型预测值与真实值之间的差异
- criterion=torch.nn.MSELoss(size_average=False)
- # 创建一个随机梯度下降优化器对象,该对象用于更新模型的参数。这里的学习率被设置为0.01
- optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
-
- for epoch in range(1000):
- # 调用模型的前向传播方法,计算出模型对训练数据的预测值
- 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([[4.0]])
- y_test=model(x_test)
- print("y_pred=",y_test.data)
- 0 59.847930908203125
- 1 26.652393341064453
- 2 11.874536514282227
- 3 5.295718193054199
- 4 2.366877317428589
- 5 1.0629061460494995
- ...
- 998 9.690893421065994e-09
- 999 9.508596576779382e-09
- w= 1.9999350309371948
- b= 0.0001476586185162887
- y_pred= tensor([[7.9999]])