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

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

一、整体结构

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

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

二、代码逐步讲解


🔹1. 导入依赖与配置

python 复制代码
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: 画图可视化
python 复制代码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 支持中文
plt.rcParams['axes.unicode_minus'] = False    # 显示负号

🔹2. 数据准备

python 复制代码
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. 构建模型、损失函数、优化器

python 复制代码
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∑(ypred−ytrue)2
  • optimizer.step() 用梯度下降法更新参数。

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

python 复制代码
data_loader = DataLoader(
    dataset=TensorDataset(x, y),
    batch_size=10,
    shuffle=True
)

📘 功能:

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

🔹5. 模型训练核心循环

python 复制代码
epochs = 100
loss_epoch = []

for epoch in range(epochs):
    total_loss = 0.0
    train_sample = 0
    for 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_sample
    loss_epoch.append(epoch_loss)

📘 每轮训练做的事情:

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

🔹6. 可视化损失变化

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

📈 曲线逐渐下降表示:

模型参数在逐渐逼近真实的 ( w_{true}, b_{true} )。


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

python 复制代码
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 )
  • 绿虚线:真实关系
  • 蓝点:原始数据(带噪声)

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


三、完整可运行版本 ✅

python 复制代码
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

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, bias=1.5, coef=True)
    x = torch.tensor(x, dtype=torch.float32)
    y = torch.tensor(y, dtype=torch.float32)
    return x, y, coef

x, 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.0
    total_sample = 0
    for 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()

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

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

一般结果示例:

复制代码
训练得到的权重: 92.8
训练得到的偏置: 1.48
真实权重: 93.1

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

相关推荐
circuitsosk6 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
9000AI6 小时前
9000AI如何工业化生产流量?高质量规模生产与矩阵化饱和覆盖
人工智能
字节数据平台7 小时前
iDA:从 ChatBI 到专业数据分析助手的演进之路
大数据·人工智能·机器学习·数据分析
warpdrivelabs7 小时前
Codex 开源 harness 全面了解
开发语言·人工智能
mit6.8247 小时前
微软如何交付企业级Agent
人工智能
Mininglamp_27187 小时前
明略科技携手海康机器人亮相世界机器人大会,以“Agent+具身“联合进入商业机器人场景
人工智能·科技·机器人·开源·agent·ai agent
2401_894915538 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
MobotStone9 小时前
从“听得懂”到“干得了”:工业大模型落地工厂的三层进化路线
人工智能
wangruofeng10 小时前
GLM-5.3-Flash 发布:追平 Opus 4.8 的智力,1/40 的价格,跑在国产芯片上
人工智能·aigc·chatglm (智谱)
皮皮虾❀12 小时前
钉钉AI服务商×教育行业:AI现代产业学院共建一体化实战——从“高校AI教学缺平台”到“校企共建AI产业学院培养数字化人才
人工智能·钉钉