系列导读:本系列共 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 |
| 六 | 实战案例 | 线性回归完整流程 |
六、进阶学习路线
- 深度学习基础:反向传播、激活函数、正则化
- 卷积神经网络(CNN):图像分类、目标检测
- 循环神经网络(RNN/LSTM):序列建模、文本生成
- Transformer:注意力机制、BERT、GPT
- 生成模型:GAN、VAE、Diffusion
- 模型部署:ONNX、TensorRT、移动端适配
附录:推荐阅读
如果这篇系列文章对你有帮助,欢迎点赞、收藏、关注!你的支持是我持续创作的动力。
全套 6 篇 PyTorch 笔记已完结,感谢陪伴!🎉
PyTorch 实战——线性回归预测房价完整案例&spm=1001.2101.3001.5002&articleId=163449124&d=1&t=3&u=cddfd9cc5e9d4f6db27727da88289bea)
8718

被折叠的 条评论
为什么被折叠?



