PyTorch 框架实现线性回归:从数据预处理到模型训练全流程 ...

打印 上一主题 下一主题

主题 1065|帖子 1065|积分 3195

系列文章目次

01-PyTorch新手必看:张量是什么?5 分钟教你快速创建张量!
02-张量运算真简单!PyTorch 数值计算操作完全指南
03-Numpy 还是 PyTorch?张量与 Numpy 的神奇转换技巧
04-揭秘数据处理神器:PyTorch 张量拼接与拆分实用技巧
05-深度学习从索引开始:PyTorch 张量索引与切片最全解析
06-张量形状任意改!PyTorch reshape、transpose 操作超详细教程
07-深入解读 PyTorch 张量运算:6 大焦点函数全面解析,代码示例一步到位!
08-自动微分到底有多强?PyTorch 自动求导机制深度解析
09-从零手写线性回归模型:PyTorch 实现深度学习入门教程
10-PyTorch 框架实现线性回归:从数据预处理到模型训练全流程


  

媒介

在之前的文章中,通过手动方式构建了一个简单的线性回归模型。然而,面对复杂的网络设计,手动实现不仅繁琐,还容易堕落。为了提高服从和灵活性,可以利用 PyTorch 提供的组件来快速搭建模型。
本文将通过 PyTorch 实现线性回归,主要包括以下内容:


  • 使用 nn.MSELoss 代替自定义的平方损失函数
  • 使用 data.DataLoader 代替自定义的数据加载器
  • 使用 optim.SGD 代替自定义的优化器
  • 使用 nn.Linear 代替自定义的线性模型

一、构建数据集

起首,需要生成一组模拟的线性回归数据,并将其转换为 PyTorch 张量。使用 sklearn.datasets.make_regression 函数来创建数据。
1.1 示例代码

  1. import torch
  2. from sklearn.datasets import make_regression
  3. # 构建数据集
  4. def create_dataset():
  5.     x, y, coef = make_regression(
  6.         n_samples=150,       # 样本数量
  7.         n_features=1,        # 特征数量
  8.         noise=15,            # 噪声大小
  9.         coef=True,           # 返回系数
  10.         bias=10.0,           # 偏置项
  11.         random_state=42      # 随机种子
  12.     )
  13.     # 转换为 PyTorch 张量
  14.     x = torch.tensor(x, dtype=torch.float32)
  15.     y = torch.tensor(y, dtype=torch.float32)
  16.     return x, y, coef
复制代码
在上面的代码中,生成了一个 150 个样本、带有噪声的数据集,并将其转换为 PyTorch 支持的张量格式,便于后续训练使用。

二、数据加载器

为了更方便地处理数据批量,使用 PyTorch 的 DataLoader 来加载数据集。
2.1 示例代码

  1. from torch.utils.data import TensorDataset, DataLoader
  2. # 构建数据加载器
  3. def create_dataloader(x, y):
  4.     dataset = TensorDataset(x, y)  # 创建数据集对象
  5.     dataloader = DataLoader(dataset, batch_size=20, shuffle=True)  # 批量大小为20
  6.     return dataloader
复制代码
DataLoader 可以轻松实现数据的分批次处理,同时支持打乱数据顺序以提高模型的泛化能力。

三、定义模型

PyTorch 提供了 nn.Linear 作为线性模型的实现,只需定义输入和输出的特性数量。
线性模型的焦点公式为:
                                                    y                               ^                                      =                            x                            ⋅                            w                            +                            b                                  \hat{y} = x \cdot w + b                     y^​=x⋅w+b
此中,w 是权重,b 是偏置,均为模型的可学习参数。
3.1 示例代码

  1. import torch.nn as nn
  2. # 构建线性模型
  3. def create_model():
  4.     model = nn.Linear(in_features=1, out_features=1)  # 输入和输出特征均为1
  5.     return model
复制代码

四、定义损失函数与优化器

使用 nn.MSELoss 作为损失函数,并使用 optim.SGD 优化器来更新模型参数。
4.1 示例代码

  1. import torch.optim as optim
  2. # 定义损失函数和优化器
  3. def create_loss_and_optimizer(model):
  4.     criterion = nn.MSELoss()  # 均方误差损失
  5.     optimizer = optim.SGD(model.parameters(), lr=0.01)  # 学习率为0.01
  6.     return criterion, optimizer
复制代码

五、训练模型

将数据加载器、模型、损失函数和优化器整合到训练循环中,通过梯度降落来优化模型。
5.1 示例代码

  1. # 训练模型
  2. def train_model(dataloader, model, criterion, optimizer, epochs=100):
  3.     for epoch in range(epochs):
  4.         for batch_x, batch_y in dataloader:
  5.             # 前向传播:计算预测值
  6.             y_pred = model(batch_x)
  7.             # 计算损失
  8.             loss = criterion(y_pred, batch_y.unsqueeze(1))
  9.             # 清空梯度
  10.             optimizer.zero_grad()
  11.             # 反向传播:计算梯度
  12.             loss.backward()
  13.             # 更新参数
  14.             optimizer.step()
  15.         # 打印每10个epoch的损失
  16.         if (epoch + 1) % 10 == 0:
  17.             print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")
复制代码
在训练过程中,每次从数据加载器中取出一个批次的数据进行训练,并更新模型参数。

六、绘制效果

训练完成后,可视化模型的拟合效果,与真实数据进行对比。
6.1 示例代码

  1. # 可视化模型拟合结果
  2. def plot_results(x, y, model, coef, bias):
  3.     # 设置中文字体
  4.     plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
  5.     plt.rcParams['axes.unicode_minus'] = False   # 正常显示负号
  6.     # 绘制散点图
  7.     plt.scatter(x.numpy(), y.numpy(), label="数据点", alpha=0.7)
  8.     # 绘制模型预测的直线
  9.     x_range = torch.linspace(x.min(), x.max(), 100).reshape(-1, 1)
  10.     y_pred = model(x_range).detach().numpy()
  11.     plt.plot(x_range.numpy(), y_pred, label="拟合直线", color="r")
  12.     # 绘制真实的直线
  13.     coef = torch.tensor(coef, dtype=torch.float32)
  14.     bias = torch.tensor(bias, dtype=torch.float32)
  15.     y_true = coef * x_range + bias
  16.     plt.plot(x_range.numpy(), y_true.numpy(), label="真实直线", color="g", linestyle="--")
  17.     # 添加标题和标签
  18.     plt.title("线性回归拟合结果")
  19.     plt.xlabel("自变量 X")
  20.     plt.ylabel("因变量 Y")
  21.     # 显示图例和网格
  22.     plt.legend()
  23.     plt.grid(True)
  24.     # 显示绘图
  25.     plt.show()
复制代码

七、主函数

7.1 示例代码

  1. if __name__ == "__main__":
  2.     # 构建数据
  3.     x, y, coef = create_dataset()
  4.     dataloader = create_dataloader(x, y)
  5.     model = create_model()
  6.     criterion, optimizer = create_loss_and_optimizer(model)
  7.    
  8.     # 训练模型
  9.     train_model(dataloader, model, criterion, optimizer, epochs=100)
  10.    
  11.     # 绘制结果
  12.     plot_results(x, y, model, coef, bias=10.0)
复制代码
7.2 示例输出


运行效果将显示数据点与拟合直线,直线与真实线性关系高度符合,说明模型训练效果良好。

八、总结

本文通过使用 PyTorch 实现线性回归模型,完成了以下内容:


  • 构建数据集并设计数据加载器;
  • 使用 nn.Linear 定义线性假设函数;
  • 使用 nn.MSELoss 设计均方误差损失函数;
  • 使用 optim.SGD 实现随机梯度降落优化方法;
  • 训练模型并可视化拟合效果。
8.1 完备代码

  1. import torchfrom torch.utils.data import TensorDataset, DataLoaderimport torch.nn as nnimport torch.optim as optimfrom sklearn.datasets import make_regressionimport matplotlib.pyplot as plt# 构建数据集def create_dataset():    x, y, coef = make_regression(        n_samples=150,       # 样本数量        n_features=1,        # 特性数量        noise=15,            # 噪声巨细        coef=True,           # 返回系数        bias=10.0,           # 偏置项        random_state=42      # 随机种子    )    # 转换为 PyTorch 张量    x = torch.tensor(x, dtype=torch.float32)    y = torch.tensor(y, dtype=torch.float32)    return x, y, coef# 构建数据加载器def create_dataloader(x, y):    dataset = TensorDataset(x, y)  # 创建数据集对象    dataloader = DataLoader(dataset, batch_size=20, shuffle=True)  # 批量巨细为20    return dataloader# 构建线性模型def create_model():    model = nn.Linear(in_features=1, out_features=1)  # 输入和输出特性均为1    return model# 定义损失函数和优化器def create_loss_and_optimizer(model):    criterion = nn.MSELoss()  # 均方误差损失    optimizer = optim.SGD(model.parameters(), lr=0.01)  # 学习率为0.01    return criterion, optimizer# 训练模型
  2. def train_model(dataloader, model, criterion, optimizer, epochs=100):
  3.     for epoch in range(epochs):
  4.         for batch_x, batch_y in dataloader:
  5.             # 前向传播:计算预测值
  6.             y_pred = model(batch_x)
  7.             # 计算损失
  8.             loss = criterion(y_pred, batch_y.unsqueeze(1))
  9.             # 清空梯度
  10.             optimizer.zero_grad()
  11.             # 反向传播:计算梯度
  12.             loss.backward()
  13.             # 更新参数
  14.             optimizer.step()
  15.         # 打印每10个epoch的损失
  16.         if (epoch + 1) % 10 == 0:
  17.             print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")
  18. # 可视化模型拟合结果
  19. def plot_results(x, y, model, coef, bias):
  20.     # 设置中文字体
  21.     plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
  22.     plt.rcParams['axes.unicode_minus'] = False   # 正常显示负号
  23.     # 绘制散点图
  24.     plt.scatter(x.numpy(), y.numpy(), label="数据点", alpha=0.7)
  25.     # 绘制模型预测的直线
  26.     x_range = torch.linspace(x.min(), x.max(), 100).reshape(-1, 1)
  27.     y_pred = model(x_range).detach().numpy()
  28.     plt.plot(x_range.numpy(), y_pred, label="拟合直线", color="r")
  29.     # 绘制真实的直线
  30.     coef = torch.tensor(coef, dtype=torch.float32)
  31.     bias = torch.tensor(bias, dtype=torch.float32)
  32.     y_true = coef * x_range + bias
  33.     plt.plot(x_range.numpy(), y_true.numpy(), label="真实直线", color="g", linestyle="--")
  34.     # 添加标题和标签
  35.     plt.title("线性回归拟合结果")
  36.     plt.xlabel("自变量 X")
  37.     plt.ylabel("因变量 Y")
  38.     # 显示图例和网格
  39.     plt.legend()
  40.     plt.grid(True)
  41.     # 显示绘图
  42.     plt.show()
  43. # 主函数if __name__ == "__main__":
  44.     # 构建数据
  45.     x, y, coef = create_dataset()
  46.     dataloader = create_dataloader(x, y)
  47.     model = create_model()
  48.     criterion, optimizer = create_loss_and_optimizer(model)
  49.    
  50.     # 训练模型
  51.     train_model(dataloader, model, criterion, optimizer, epochs=100)
  52.    
  53.     # 绘制结果
  54.     plot_results(x, y, model, coef, bias=10.0)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表