PyTorch 深度学习笔记(六)PyTorch 实战——线性回归预测房价完整案例

系列导读:本系列共 6 篇,从 PyTorch 框架入门到实战案例,带你系统掌握深度学习开发。上一篇:张量拼接与自动微分——构建神经网络基础

一、项目概述

1.1 项目目标

通过带噪声的真实数据,让模型学习到**"面积与房价"之间的线性关系**,最终实现对新房屋面积的价格预测,并通过可视化直观展示模型的拟合效果。

1.2 核心 API

API作用替代对象
nn.Linear定义线性模型手动实现的假设函数
nn.MSELoss()均方误差损失函数手动计算的平方损失
optim.SGD随机梯度下降优化器手动实现的梯度更新
torch.Tensor存储数据Python 列表/NumPy
matplotlib数据可视化其他绘图工具

1.3 项目流程

准备数据 → 构建模型 → 定义损失+优化器 → 训练循环 → 可视化 → 预测

二、完整代码实现

2.1 导入库

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

2.2 准备带噪声的训练数据

# 生成 100 个数据点:面积范围 50-150 平米
x = torch.linspace(50, 150, 100).view(-1, 1)

# 真实关系:房价 = 3 * 面积 + 50,加入随机噪声
y = 3 * x + 50 + torch.randn(x.shape) * 15

# 查看数据
print(f"数据量: {len(x)}")
print(f"面积范围: {x.min():.1f} ~ {x.max():.1f}")
print(f"房价范围: {y.min():.1f} ~ {y.max():.1f}")

数据说明

  • torch.linspace(50, 150, 100):生成 50~150 之间的 100 个等差数列
  • .view(-1, 1):reshape 为 (100, 1),适合模型输入
  • torch.randn(x.shape) * 15:加入标准差为 15 的高斯噪声,模拟真实数据

2.3 构建线性回归模型

class LinearModel(nn.Module):
    def __init__(self):
        super().__init__()
        # 输入维度 1(面积),输出维度 1(房价)
        self.linear = nn.Linear(1, 1)
    
    def forward(self, x):
        return self.linear(x)

# 实例化模型
model = LinearModel()

# 查看模型参数
for name, param in model.named_parameters():
    print(f"{name}: {param.data}")
# weight: 随机初始化
# bias: 随机初始化

nn.Linear 原理

output = weight * input + bias
即:房价 = w * 面积 + b

2.4 定义损失函数和优化器

# 均方误差损失(Mean Squared Error)
criterion = nn.MSELoss()

# 随机梯度下降优化器
# lr=0.00005 是一个很小的学习率,保证稳定收敛
optimizer = torch.optim.SGD(model.parameters(), lr=0.00005)

为什么学习率这么小?

  • 数据范围大(50~150),梯度可能很大
  • 小学习率避免震荡,保证稳定收敛
  • 训练次数足够多(8000 轮),小学习率也能收敛

2.5 训练循环

# 训练 8000 轮
for epoch in range(8000):
    # 1. 前向传播:预测房价
    y_pred = model(x)
    
    # 2. 计算损失
    loss = criterion(y_pred, y)
    
    # 3. 反向传播
    optimizer.zero_grad()  # 清零旧梯度
    loss.backward()        # 计算新梯度
    optimizer.step()       # 更新参数
    
    # 每 1000 轮打印一次
    if (epoch + 1) % 1000 == 0:
        print(f'Epoch [{epoch+1}/8000], Loss: {loss.item():.4f}')

训练过程输出示例

Epoch [1000/8000], Loss: 234.5678
Epoch [2000/8000], Loss: 189.2341
Epoch [3000/8000], Loss: 156.7890
...
Epoch [8000/8000], Loss: 120.3456

2.6 可视化结果

在这里插入图片描述

# 绘制散点图和拟合直线
plt.figure(figsize=(10, 6))

# 真实数据(散点)
plt.scatter(x.numpy(), y.numpy(), s=15, label="真实数据(带噪声)", alpha=0.6)

# 模型预测(红色直线)
plt.plot(x.numpy(), model(x).detach().numpy(), "r-", linewidth=3, label="拟合直线")

plt.xlabel("面积(㎡)", fontsize=12)
plt.ylabel("价格(万元)", fontsize=12)
plt.title("PyTorch 线性回归:面积与房价关系", fontsize=14)
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

2.7 查看训练后的模型参数

# 训练完成后,参数应该接近真实值:weight≈3, bias≈50
for name, param in model.named_parameters():
    print(f"{name}: {param.data}")
# 输出示例:
# weight: tensor([[2.95]])
# bias: tensor([52.3])

2.8 预测新数据

print("\n✅ 预测结果:")
test_areas = [75.0, 100.0, 120.0, 150.0]

for area in test_areas:
    # 预测
    pred = model(torch.tensor([[area]]))
    
    # 真实值(无噪声)
    true_price = 3 * area + 50
    
    print(f"{area:6.1f}㎡ → 预测价格:{pred.item():7.2f} 万元 | 真实价格:{true_price:.2f} 万元")

预测输出示例

✅ 预测结果:
  75.0㎡ → 预测价格: 275.50 万元 | 真实价格:275.00 万元
 100.0㎡ → 预测价格: 350.20 万元 | 真实价格:350.00 万元
 120.0㎡ → 预测价格: 410.80 万元 | 真实价格:410.00 万元
 150.0㎡ → 预测价格: 497.30 万元 | 真实价格:500.00 万元

三、完整代码(可直接运行)

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# ======================
# 0. 配置
# ======================
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# ======================
# 1. 数据(带噪声)
# ======================
x = torch.linspace(50, 150, 100).view(-1, 1)
y = 3 * x + 50 + torch.randn(x.shape) * 15

# ======================
# 2. 模型
# ======================
class LinearModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(1, 1)
    
    def forward(self, x):
        return self.linear(x)

model = LinearModel()

# ======================
# 3. 损失 + 优化器
# ======================
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.00005)

# ======================
# 4. 训练
# ======================
for epoch in range(8000):
    y_pred = model(x)
    loss = criterion(y_pred, y)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if (epoch + 1) % 1000 == 0:
        print(f'Epoch [{epoch+1}/8000], Loss: {loss.item():.4f}')

# ======================
# 5. 可视化
# ======================
plt.figure(figsize=(10, 6))
plt.scatter(x.numpy(), y.numpy(), s=15, label="真实数据(带噪声)", alpha=0.6)
plt.plot(x.numpy(), model(x).detach().numpy(), "r-", linewidth=3, label="拟合直线")
plt.xlabel("面积(㎡)", fontsize=12)
plt.ylabel("价格(万元)", fontsize=12)
plt.title("PyTorch 线性回归:面积与房价关系", fontsize=14)
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

# ======================
# 6. 查看参数 + 预测
# ======================
print("\n📊 训练后模型参数:")
for name, param in model.named_parameters():
    print(f"{name}: {param.data}")

print("\n✅ 预测结果:")
for area in [75.0, 100.0, 120.0, 150.0]:
    pred = model(torch.tensor([[area]]))
    true = 3 * area + 50
    print(f"{area:6.1f}㎡ → 预测:{pred.item():7.2f}万元 | 真实:{true:.2f}万元")

四、训练过程原理图解

在这里插入图片描述

数据输入 x → [nn.Linear] → 预测 ŷ → [MSELoss] → 计算损失
                                    ↑
                                对比真实 y
                                    ↓
                              [loss.backward()] → 计算梯度
                                    ↓
                              [optimizer.step()] → 更新参数
                                    ↓
                              循环 8000 次 → 损失下降 → 拟合更好

五、系列总结

通过 6 篇笔记,我们从零开始系统学习了 PyTorch:

篇目主题核心内容
PyTorch 入门框架选择、安装、发展历史
PyTorch 优势动态图、GPU加速、自动微分、生态
张量基础创建方式、数据类型、NumPy互转
运算与变形矩阵运算、索引、reshape、transpose
拼接与微分cat/stack、autograd、backward
实战案例线性回归完整流程

六、进阶学习路线

  1. 深度学习基础:反向传播、激活函数、正则化
  2. 卷积神经网络(CNN):图像分类、目标检测
  3. 循环神经网络(RNN/LSTM):序列建模、文本生成
  4. Transformer:注意力机制、BERT、GPT
  5. 生成模型:GAN、VAE、Diffusion
  6. 模型部署:ONNX、TensorRT、移动端适配

附录:推荐阅读


如果这篇系列文章对你有帮助,欢迎点赞、收藏、关注!你的支持是我持续创作的动力。

全套 6 篇 PyTorch 笔记已完结,感谢陪伴!🎉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值