当前位置: 首页 > news >正文

使用 PyTorch来构建线性回归的实现

🧠 PyTorch线性回归完整案例讲解

一、整体结构

这个案例完整体现了 PyTorch 的四大核心步骤:

步骤名称对应代码模块作用
数据准备make_regression + DataLoader生成并批量加载训练数据
模型构建nn.Linear()定义线性回归模型结构
定义损失和优化器nn.MSELoss + optim.SGD告诉模型“误差怎么算”和“如何改进”
模型训练loss.backward() + optimizer.step()自动微分并更新参数

二、代码逐步讲解


🔹1. 导入依赖与配置

import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
  • torch: 核心计算库(张量、梯度)
  • nn: 网络模块(模型层、损失函数)
  • optim: 优化器模块(SGD、Adam)
  • DataLoader: 用于批量读取训练数据
  • matplotlib: 画图可视化
plt.rcParams['font.sans-serif'] = ['SimHei']  # 支持中文
plt.rcParams['axes.unicode_minus'] = False    # 显示负号

🔹2. 数据准备

def create_dataset():x, y, coef = make_regression(n_samples=100,     # 样本数n_features=1,      # 特征数(1维)noise=10,          # 噪声强度bias=1.5,          # 偏置项(截距)coef=True          # 返回真实权重)x = torch.tensor(x, dtype=torch.float32)y = torch.tensor(y, dtype=torch.float32)return x, y, coef

✅ 输出结果:

  • x.shape = (100, 1) → 每个样本一个特征
  • y.shape = (100,) → 每个样本一个目标值
  • coef ≈ 真实权重 w_true

📘 作用:
生成线性模型:
y=wtruex+b+噪声y = w_{\text{true}}x + b + \text{噪声}y=wtruex+b+噪声


🔹3. 构建模型、损失函数、优化器

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# 线性模型
model = nn.Linear(in_features=1, out_features=1).to(device)# 均方误差损失函数
criterion = nn.MSELoss().to(device)# 优化器:随机梯度下降
optimizer = optim.SGD(model.parameters(), lr=0.01)

📘 说明:

  • nn.Linear(1,1) 就是 ( y = w x + b )
  • criterion 比较预测与真实差距
    L=1n∑(ypred−ytrue)2L = \frac{1}{n}\sum (y_{\text{pred}} - y_{\text{true}})^2L=n1(ypredytrue)2
  • optimizer.step() 用梯度下降法更新参数。

🔹4. 数据加载器(批量训练)

data_loader = DataLoader(dataset=TensorDataset(x, y),batch_size=10,shuffle=True
)

📘 功能:

  • 每次从数据集中随机取 10 条样本,构成一个 mini-batch;
  • 每训练一个 epoch,会打乱样本顺序;
  • 有助于加快收敛并减少过拟合。

🔹5. 模型训练核心循环

epochs = 100
loss_epoch = []for epoch in range(epochs):total_loss = 0.0train_sample = 0for train_x, train_y in data_loader:train_x, train_y = train_x.to(device), train_y.to(device)# 1️⃣ 前向传播y_pred = model(train_x)# 2️⃣ 计算损失loss = criterion(y_pred, train_y.reshape(-1, 1))# 3️⃣ 反向传播准备optimizer.zero_grad()# 4️⃣ 自动微分(计算梯度)loss.backward()# 5️⃣ 参数更新optimizer.step()# 记录损失total_loss += loss.item()train_sample += len(train_y)epoch_loss = total_loss / train_sampleloss_epoch.append(epoch_loss)

📘 每轮训练做的事情:

步骤说明对应代码
1前向传播y_pred = model(train_x)
2计算损失loss = criterion(...)
3梯度清零optimizer.zero_grad()
4反向传播loss.backward()
5更新参数optimizer.step()

🔹6. 可视化损失变化

plt.plot(range(epochs), loss_epoch)
plt.title('损失变化曲线')
plt.xlabel('训练轮数')
plt.ylabel('平均损失')
plt.grid()
plt.show()

📈 曲线逐渐下降表示:
模型参数在逐渐逼近真实的 ( w_{true}, b_{true} )。


🔹7. 可视化预测结果与真实函数对比

plt.scatter(x, y, label='原始数据', alpha=0.6)# 真实曲线
x_line = torch.linspace(x.min(), x.max(), 100)
y_true = x_line * coef + 1.5# 模型预测曲线
with torch.no_grad():y_pred = model(x_line.reshape(-1, 1))plt.plot(x_line, y_pred, label='模型拟合', color='red')
plt.plot(x_line, y_true, label='真实关系', color='green', linestyle='--')
plt.legend()
plt.title('线性回归拟合效果')
plt.show()

📊 结果说明:

  • 红线:模型学到的 ( y = wx + b )
  • 绿虚线:真实关系
  • 蓝点:原始数据(带噪声)

若两条线几乎重合 → 模型成功学会真实规律 ✅


三、完整可运行版本 ✅

import torch
from torch import nn, optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import make_regression
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef create_dataset():x, y, coef = make_regression(n_samples=100, n_features=1, noise=10, bias=1.5, coef=True)x = torch.tensor(x, dtype=torch.float32)y = torch.tensor(y, dtype=torch.float32)return x, y, coefx, y, coef = create_dataset()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = nn.Linear(1, 1).to(device)
criterion = nn.MSELoss().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.01)
data_loader = DataLoader(TensorDataset(x, y), batch_size=10, shuffle=True)epochs = 100
loss_epoch = []
for epoch in range(epochs):total_loss = 0.0total_sample = 0for x_batch, y_batch in data_loader:x_batch, y_batch = x_batch.to(device), y_batch.to(device)y_pred = model(x_batch)loss = criterion(y_pred, y_batch.view(-1, 1))optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()total_sample += len(y_batch)loss_epoch.append(total_loss / total_sample)plt.plot(range(epochs), loss_epoch)
plt.title('损失变化曲线')
plt.xlabel('epoch')
plt.ylabel('平均损失')
plt.show()plt.scatter(x, y, label='原始数据', alpha=0.6)
x_line = torch.linspace(x.min(), x.max(), 100)
y_true = x_line * coef + 1.5
with torch.no_grad():y_pred = model(x_line.unsqueeze(1))
plt.plot(x_line, y_pred, label='模型拟合', color='red')
plt.plot(x_line, y_true, label='真实关系', color='green', linestyle='--')
plt.legend()
plt.show()

四、训练结束后可查看模型参数

print("训练得到的权重:", model.weight.item())
print("训练得到的偏置:", model.bias.item())
print("真实权重:", coef)

一般结果示例:

训练得到的权重: 92.8
训练得到的偏置: 1.48
真实权重: 93.1

✅ 表示模型成功学到了真实线性关系。

请添加图片描述

http://www.dtcms.com/a/582829.html

相关文章:

  • 营销型网站设计公司企业网站模板下载服务哪家好
  • 对接物联网使用netty通信与MQTT之间的区别
  • 重塑城市公共安全管理的“智慧之眼”
  • 临海建设局官方网站plc编程入门基础知识
  • 有教做衣服的网站吗免费签名logo设计
  • 2.2.STM32-新建工程
  • 怎么做提卡密网站开发高端市场应该注意
  • 无锡网知名网站教做香肠的网站
  • 做酒招代理的网站江门网红打卡景点蓬江区
  • 双牌网站建设购物网站建设市场调查论文
  • 对象住哪里?——深入剖析 JVM 内存结构与对象分配机制
  • 站长工具高清有吗网推获客平台
  • 网站做流量的论坛贴吧广东广东网站建设工作
  • 中国机械加工网下载番禺seo
  • 如何让美颜SDK更智能?AI赋能下的个性化美颜功能设计详解
  • 软件开发模型——瀑布式模型:软件开发的经典范式及其现代实践
  • 网站集约化建设讲话上海知名的网站建设
  • WordPress建站要花钱七牛图片处理 wordpress
  • 认识linux -- 调试器 - gdb/cgdb的使用
  • 神经流形:大脑功能几何基础的革命性视角
  • 杭州做网站外包公司网站建设实训报告总结
  • 高新区建设局网站网站建设与开发试卷
  • 测试跟踪步骤描述用例交互优化,MeterSphere开源持续测试工具v2.10.26 LTS版本发布
  • CSMA(aloha)
  • 衡水做网站优化黄页网址大全免费
  • 苍穹外卖 —— Spring Cache和购物车功能开发
  • 建设网站毕业设计河南城乡建设厅网站证书查询
  • 留言网站模板沈阳百度seo代理
  • top域名的网站打不开平台软件
  • 新开传奇手游网站大全jn建站系统官网