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

系列文章目录

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 框架实现线性回归:从数据预处理到模型训练全流程


文章目录

  • 系列文章目录
  • 前言
  • 一、构建数据集
    • 1.1 示例代码
  • 二、数据加载器
    • 2.1 示例代码
  • 三、定义模型
    • 3.1 示例代码
  • 四、定义损失函数与优化器
    • 4.1 示例代码
  • 五、训练模型
    • 5.1 示例代码
  • 六、绘制结果
    • 6.1 示例代码
  • 七、主函数
    • 7.1 示例代码
    • 7.2 示例输出
  • 八、总结
    • 8.1 完整代码


前言

在之前的文章中,通过手动方式构建了一个简单的线性回归模型。然而,面对复杂的网络设计,手动实现不仅繁琐,还容易出错。为了提高效率和灵活性,可以利用 PyTorch 提供的组件来快速搭建模型。

本文将通过 PyTorch 实现线性回归,主要包括以下内容:

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

一、构建数据集

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

1.1 示例代码

import torch
from sklearn.datasets import make_regression

# 构建数据集
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

在上面的代码中,生成了一个 150 个样本、带有噪声的数据集,并将其转换为 PyTorch 支持的张量格式,便于后续训练使用。


二、数据加载器

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

2.1 示例代码

from torch.utils.data import TensorDataset, DataLoader

# 构建数据加载器
def create_dataloader(x, y):
    dataset = TensorDataset(x, y)  # 创建数据集对象
    dataloader = DataLoader(dataset, batch_size=20, shuffle=True)  # 批量大小为20
    return dataloader

DataLoader 可以轻松实现数据的分批次处理,同时支持打乱数据顺序以提高模型的泛化能力。


三、定义模型

PyTorch 提供了 nn.Linear 作为线性模型的实现,只需定义输入和输出的特征数量。

线性模型的核心公式为:
y ^ = x ⋅ w + b \hat{y} = x \cdot w + b y^=xw+b
其中,w 是权重,b 是偏置,均为模型的可学习参数。

3.1 示例代码

import torch.nn as nn

# 构建线性模型
def create_model():
    model = nn.Linear(in_features=1, out_features=1)  # 输入和输出特征均为1
    return model

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

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

4.1 示例代码

import torch.optim as optim

# 定义损失函数和优化器
def create_loss_and_optimizer(model):
    criterion = nn.MSELoss()  # 均方误差损失
    optimizer = optim.SGD(model.parameters(), lr=0.01)  # 学习率为0.01
    return criterion, optimizer

五、训练模型

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

5.1 示例代码

# 训练模型
def train_model(dataloader, model, criterion, optimizer, epochs=100):
    for epoch in range(epochs):
        for batch_x, batch_y in dataloader:
            # 前向传播:计算预测值
            y_pred = model(batch_x)
            # 计算损失
            loss = criterion(y_pred, batch_y.unsqueeze(1))
            # 清空梯度
            optimizer.zero_grad()
            # 反向传播:计算梯度
            loss.backward()
            # 更新参数
            optimizer.step()
        # 打印每10个epoch的损失
        if (epoch + 1) % 10 == 0:
            print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")

在训练过程中,每次从数据加载器中取出一个批次的数据进行训练,并更新模型参数。


六、绘制结果

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

6.1 示例代码

# 可视化模型拟合结果
def plot_results(x, y, model, coef, bias):
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
    plt.rcParams['axes.unicode_minus'] = False   # 正常显示负号

    # 绘制散点图
    plt.scatter(x.numpy(), y.numpy(), label="数据点", alpha=0.7)

    # 绘制模型预测的直线
    x_range = torch.linspace(x.min(), x.max(), 100).reshape(-1, 1)
    y_pred = model(x_range).detach().numpy()
    plt.plot(x_range.numpy(), y_pred, label="拟合直线", color="r")

    # 绘制真实的直线
    coef = torch.tensor(coef, dtype=torch.float32)
    bias = torch.tensor(bias, dtype=torch.float32)
    y_true = coef * x_range + bias
    plt.plot(x_range.numpy(), y_true.numpy(), label="真实直线", color="g", linestyle="--")

    # 添加标题和标签
    plt.title("线性回归拟合结果")
    plt.xlabel("自变量 X")
    plt.ylabel("因变量 Y")

    # 显示图例和网格
    plt.legend()
    plt.grid(True)

    # 显示绘图
    plt.show()

七、主函数

7.1 示例代码

if __name__ == "__main__":
    # 构建数据
    x, y, coef = create_dataset()
    dataloader = create_dataloader(x, y)
    model = create_model()
    criterion, optimizer = create_loss_and_optimizer(model)
    
    # 训练模型
    train_model(dataloader, model, criterion, optimizer, epochs=100)
    
    # 绘制结果
    plot_results(x, y, model, coef, bias=10.0)

7.2 示例输出

在这里插入图片描述
运行结果将显示数据点与拟合直线,直线与真实线性关系高度吻合,说明模型训练效果良好。


八、总结

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

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

8.1 完整代码

import torch
from torch.utils.data import TensorDataset, DataLoader
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
import 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

# 训练模型
def train_model(dataloader, model, criterion, optimizer, epochs=100):
    for epoch in range(epochs):
        for batch_x, batch_y in dataloader:
            # 前向传播:计算预测值
            y_pred = model(batch_x)
            # 计算损失
            loss = criterion(y_pred, batch_y.unsqueeze(1))
            # 清空梯度
            optimizer.zero_grad()
            # 反向传播:计算梯度
            loss.backward()
            # 更新参数
            optimizer.step()
        # 打印每10个epoch的损失
        if (epoch + 1) % 10 == 0:
            print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")

# 可视化模型拟合结果
def plot_results(x, y, model, coef, bias):
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
    plt.rcParams['axes.unicode_minus'] = False   # 正常显示负号

    # 绘制散点图
    plt.scatter(x.numpy(), y.numpy(), label="数据点", alpha=0.7)

    # 绘制模型预测的直线
    x_range = torch.linspace(x.min(), x.max(), 100).reshape(-1, 1)
    y_pred = model(x_range).detach().numpy()
    plt.plot(x_range.numpy(), y_pred, label="拟合直线", color="r")

    # 绘制真实的直线
    coef = torch.tensor(coef, dtype=torch.float32)
    bias = torch.tensor(bias, dtype=torch.float32)
    y_true = coef * x_range + bias
    plt.plot(x_range.numpy(), y_true.numpy(), label="真实直线", color="g", linestyle="--")

    # 添加标题和标签
    plt.title("线性回归拟合结果")
    plt.xlabel("自变量 X")
    plt.ylabel("因变量 Y")

    # 显示图例和网格
    plt.legend()
    plt.grid(True)

    # 显示绘图
    plt.show()



# 主函数
if __name__ == "__main__":
    # 构建数据
    x, y, coef = create_dataset()
    dataloader = create_dataloader(x, y)
    model = create_model()
    criterion, optimizer = create_loss_and_optimizer(model)
    
    # 训练模型
    train_model(dataloader, model, criterion, optimizer, epochs=100)
    
    # 绘制结果
    plot_results(x, y, model, coef, bias=10.0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! 在现代 Web 应用中,文件上传和下载是非常常见的需求。然而,当文件较大时,传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址

文章目录 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。代码代码2 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。 代码 #include <iostream> using namespace std;class b…

分布式Id方案选择

分布式 ID 方案选择 在当今分布式系统日益盛行的背景下&#xff0c;分布式 ID 生成方案的选择成为了众多开发者关注的焦点。一个优秀的分布式 ID 方案&#xff0c;不仅能够确保生成的 ID 全局唯一&#xff0c;避免数据冲突&#xff0c;还能在高并发、大规模的分布式环境中保持…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

【递归与分治】Leetcode23:合并K个升序链表

一、题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数…

将分支A某一个commit合并到分支B

1.寻找A分支的commit 在分支B下&#xff0c;点击git找到分支A的历史提交记录,如图所示&#xff1a; 2.点击分支A的某个commit&#xff0c;进行合并到分支B 将这个commit&#xff0c;进行cherry-Pick&#xff0c;就可以把分支A的合并到分支B上的本地仓库中&#xff0c;然后就可…

如何快速上手一个鸿蒙工程

作为一名鸿蒙程序猿&#xff0c;当你换了一家公司&#xff0c;或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档&#xff0c;然后把一个鸿蒙工程交接给你了&#xff0c;说以后就是你负责了。之后几天你的状态大概就是下边这样的&#xff0c;一堆…

预训练语言模型——BERT

1.预训练思想 有了预训练就相当于模型在培养大学生做任务&#xff0c;不然模型初始化再做任务就像培养小学生 当前数据层面的瓶颈是能用于预训练的语料快被用完了 现在有一个重要方向是让机器自己来生成数据并做微调 1.1 预训练&#xff08;Pre - training&#xff09;vs. 传…

关于FPGA(现场可编程门阵列)工程技术人员的详细介绍

一、FPGA工程技术人员概述 FPGA工程技术人员是专注于现场可编程门阵列&#xff08;FPGA&#xff09;设计、开发、测试及优化的专业技术人员。他们利用FPGA的灵活性和可编程性&#xff0c;为各种应用创建高效、定制化的硬件解决方案。 二、主要工作任务 FPGA逻辑设计&#xf…

机器学习模型评估指标

模型的评估指标是衡量一个模型应用于对应任务的契合程度&#xff0c;常见的指标有&#xff1a; 准确率&#xff08;Accuracy&#xff09;: 正确预测的样本数占总样本数的比例。适用于类别分布均衡的数据集。 精确率&#xff08;Precision&#xff09;: 在所有被预测为正类的样…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…

文件传输速查表:Windows 和 Linux

文件传输速查表&#xff1a;Windows 和 Linux 免责申明 本文章仅供网络安全相关学习与研究使用&#xff0c;旨在促进技术交流与安全知识普及&#xff0c;严禁将本文内容及相关工具用于未授权的渗透测试或任何违法活动。 重要声明&#xff1a; 由于传播、使用本文章所提供的信…

基于SpringBoot+Vue的“有光”摄影分享网站系统

基于SpringBootVue的“有光”摄影分享网站系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345…

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…

《机器学习》集成学习之随机森林

目录 一、集成学习 1、简介 2、集成学习的代表 3、XGBoost和随机森林的对比 相同点&#xff1a; 不同点&#xff1a; 二、Bagging之随机森林 1、简介 2、随机森林的核心思想 3、随机森林生成步骤 4、随机森林的优点 5、随机森林的缺点 三、随机森林的代码实现 1、…