PyTorch基本使用-线性回归案例

发布于:2024-12-18 ⋅ 阅读:(82) ⋅ 点赞:(0)


学习目标:掌握PyTorch构建线性回归模型相关API

1. 训练模型步骤

我们使用 PyTorch 的各个组件来构建线性回归的实现。在pytorch中进行模型构建的整个流程一般分为四个步骤:

  1. 准备训练数据集
  2. 构建要使用的模型
  3. 设置损失函数及优化器
  4. 训练模型
    在这里插入图片描述

2. 训练模型API

  • 使用 PyTorch 的 nn.MSELoss()代替自定义的平方损失函数
  • 使用 PyTorch 的 data.DataLoader代替自定义的数据加载器
  • 使用 PyTorch 的 optim.SGD代替自定义的优化器
  • 使用 PyTorch 的 nn.Linear代替自定义的假设函数

3. 训练模型

具体代码:

# 导入相关模块
import torch
from sympy import false
from torch.utils.data import  TensorDataset # 构造数据集对象
from torch.utils.data import DataLoader # 数据加载器
from  torch import  nn # nn模块中有平方损失函数和假设函数
from torch import optim # optim 模块中有优化器函数
from sklearn.datasets import make_regression # 创建线性回归模型数据集
import  matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

# 数据集构建
def create_dataset():
    x, y, coef = make_regression(
        n_samples=100,
        n_features=1,
        noise=10,
        coef=True,
        bias=1.5,
        random_state=0
    )

    x = torch.tensor(x)
    y = torch.tensor(y)
    return x, y, coef

def train():
    # 1. 构造数据集
    x, y, coef = create_dataset()
    # 构造数据集对象
    dataset = TensorDataset(x, y)
    # 构造数据加载器
    # dataset=:数据集对象
    # batch_size=:批量训练样本数据
    # shuffle=:样本数据是否进行乱序
    dataloader = DataLoader(dataset=dataset, batch_size=16, shuffle=True)
    # 2. 构造模型
    # in_features=:输入张量的大小size
    # out_features=:输出张量的大小size
    model = nn.Linear(in_features=1, out_features=1)
    # 3.设置损失函数和优化器
    # 构造平方损失函数
    criterion = nn.MSELoss()
    # 构造优化函数
    optimizer = optim.SGD(model.parameters(), lr=1e-2)
    # 4.训练模型
    epochs = 100
    # 损失变化
    loss_epochs = []
    total_loss=0.0
    train_sample=0.0
    for _ in range(epochs):
        for train_x,train_y in dataloader:
            # 将一个batch的训练数据送入模型
            y_pred = model(train_x.type(torch.float32))
            # 计算损失函数值
            loss = criterion(y_pred, train_y.reshape(-1, 1).type(torch.float32))
            total_loss += loss.item()
            train_sample += len(train_x)
            # 梯度清零
            optimizer.zero_grad()
            # 自动微分(反向传播)
            loss.backward()
            # 更新参数
            optimizer.step()

        # 获取每次batch的损失
        loss_epochs.append(total_loss/train_sample)

    # 绘制损失变化曲线
    plt.plot(range(epochs), loss_epochs)
    plt.title('损失变化曲线')
    plt.grid()
    plt.show()
    # 绘制拟合直线
    plt.scatter(x,y)
    x = torch.linspace(x.min(), x.max(), 1000)
    y1 = torch.tensor([v * model.weight + model.bias for v in x])
    y2 = torch.tensor([v * coef +1.5 for v in x])
    plt.plot(x, y1,label='训练')
    plt.plot(x, y2,label='真实')
    plt.grid()
    plt.legend()
    plt.show()


if __name__ == '__main__':
    # 生成数据
    # x, y, coef = create_dataset()
    # # 绘制数据的真实线性回归结果
    # plt.scatter(x,y)
    # x = torch.linspace(x.min(), x.max(),1000)
    # y1 = torch.tensor([v * coef + 1.5 for v in x])
    # plt.plot(x,y1,label='real')
    # plt.grid()
    # plt.legend()
    # plt.show()
    train()

输出结果:
在这里插入图片描述

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到