利用Pytorch实现线性回归模型主要步骤为:
(1)定义数据集,这里需要注意在Pytorch中使用的是mini-batch那么因此数据集是矩阵形式
(2)自定义模型类,在定义模型类的时候需要继承自torch.nn.Module类,同时需要提供构造方法和重写forward函数。
(3)构造Loss并且创建优化器,在Pytorch中可以使用多种优化器,具体如下:
torch.optim.Adagrad、torch.optim.Adam、torch.optim.Adamax、torch.optim.ASGD、torch.optim.LBFGS、torch.optim.RMSprop、torch.optim.Rprop、torch.optim.SGD.
(4)迭代训练,更新权重
实现线性模型需要注意的点:
(1)此次线性模型中使用torch.nn.Linear类来创建linear对象,在Linear类当中包括两个参数,weight(权重)和bias(偏置)。
(2)linear对象实现了call()方法,是可调用的,该对象当传入参数以后,会自动将参数用来求预测值。
(3)创建模型对象后直接传入训练数据,此时该对象也是callable的,会将参数直接传给forward函数进行计算。
(4)每次迭代时都需将梯度先归零,防止累加。
代码实现:
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 14:03
# @Author : CH339
# @FileName: Test1_25_2.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_56068397/article/
"""
使用Pytorch实现线性回归
"""
import torch
# 定义数据集
# pytorch中使用的是mini-batch,那么这里的数据集都是矩阵
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
# 定义线性模型类
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
# 构造linear对象,Linear中包括两个参数是weight和bias
self.linear = torch.nn.Linear(1,1)
# 重写forward函数
def forward(self,x):
# linear对象是可调用的,那么传入参数后自动会读取参数
y_pred = self.linear(x)
return y_pred
# 创建模型对象,这个模型对象也是callable的,会自动将传入的参数传到forward函数当中进行计算
model = Model()
# 构造Loss和优化器
criterion = torch.nn.MSELoss(size_average=True)
# 优化器对象创建时需要传入参数,这里的参数取得是模型对象当中的w和bias
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
# 进行训练迭代
for epoch in range(100):
# 前馈得到估计值
y_pred = model(x_data)
# 计算损失
loss = criterion(y_pred,y_data)
print('Epoch=',epoch+1,loss.item())
# 先进行梯度归零
optimizer.zero_grad()
# 进行反向传播
loss.backward()
# 进行权重更新
optimizer.step()
# 经过100次迭代之后输出权重和偏置
print("Weight=",model.linear.weight.item())
print("Bias=",model.linear.bias.item())
# 通过测试集进行测试
x_test = torch.Tensor([[5.0]])
y_test = model(x_test)
print("结果",y_test.data)
当迭代次数为100次时:
由截图可知,当迭代100次时,损失较大,且预测值和真实值还有差距,说明此时参数还没有收敛,那么增加迭代次数;
当增加迭代次数为1000次时,此时观察结果较为接近(这里还可以增加迭代次数,观察合适损失值大致不变):