从零实现线性回归:深度学习入门必学的完整训练流水线
🔥从零实现线性回归:深度学习入门必学的完整训练流水线
在深度学习的世界里,线性回归是打开模型训练大门的第一把钥匙。它不仅是最简单的模型,更是一套通用、可复用的训练范式——从数据集构建到模型迭代,从损失计算到参数优化,每一步都藏着深度学习的核心逻辑。今天,我们就用最清晰的思路,手把手搭建一套完整的线性回归训练代码,吃透底层逻辑,轻松迁移到 CNN、RNN 等复杂网络。
✨ 一、深度学习训练:五大固定基石
无论模型多么复杂,深度学习训练都遵循五步固定流程,这是必须刻在脑子里的核心框架:
流程图说明:线性回归的完整训练链路,从数据准备到参数优化,环环相扣,是所有深度学习模型的通用骨架。
这五步就像盖房子的地基,线性回归用它,图像分类、文本生成也用它,换模型不换流程,这就是深度学习的“万能公式”。
📦 二、数据准备:数据集 → 数据加载器
数据是模型的“食粮”,第一步要把原始数据封装成数据集对象,再通过数据加载器实现分批训练。
1. 核心概念
-
Dataset:将特征
x和标签y封装成标准数据集,方便统一调用。 -
DataLoader:把数据集拆分成小批次(Batch),支持随机打乱,提升模型泛化能力。
2. 关键代码
import torch
from torch.utils.data import TensorDataset, DataLoader
# 1. 构造模拟数据(100条样本,1维特征)
x = torch.linspace(0, 10, 100).reshape(-1, 1).float() # 形状:[100, 1]
y = 2 * x + 3 + torch.randn(100, 1).float() # 真实分布:y = 2x + 3 + 噪声
# 2. 封装为数据集对象
dataset = TensorDataset(x, y)
# 3. 构建数据加载器:批次大小16,训练集打乱数据
data_loader = DataLoader(
dataset,
batch_size=16, # 每批16条数据
shuffle=True # 训练集必须打乱,测试集不打乱
)
3. 批次计算逻辑
总样本数:100条
批次大小:16条/批
总批次数:6×16 + 4 = 100 → 共7批
训练100轮 → 总批次数:100×7 = 700批
🧠 三、模型、损失、优化器:三大核心组件
数据准备完毕,接下来搭建模型、定义损失、配置优化器,这三步是模型学习的核心。
1. 线性回归模型
线性回归本质是y = w·x + b,用nn.Linear快速实现:
import torch.nn as nn
# 定义线性模型:输入1维特征,输出1维标签
model = nn.Linear(in_features=1, out_features=1)
-
in_features:输入特征维度(本例为1) -
out_features:输出标签维度(本例为1)
2. 损失函数:MSE(均方误差)
回归任务首选均方误差损失,衡量预测值与真实值的差距:
# 定义损失函数:均方误差
criterion = nn.MSELoss()
3. 优化器:SGD(随机梯度下降)
优化器负责更新模型参数w和b,缩小损失:
import torch.optim as optim
# 定义优化器:SGD,学习率lr=0.01
optimizer = optim.SGD(
model.parameters(), # 待优化的参数w、b
lr=1e-2 # 学习率:0.01(科学计数法)
)
💡 拓展:后续可替换为Adam、RMSprop、Adagrad等优化器,效果更优!
🔁 四、训练循环:轮次 → 批次 → 参数更新
训练是多轮迭代的过程,每轮都要遍历所有批次,完成预测→损失→反向传播→参数更新。
1. 训练核心变量
-
epochs:训练轮数(本例设为100) -
loss_list:记录每轮平均损失,用于绘制曲线 -
total_loss:累加每批总损失 -
total_samples:累加每批样本数
2. 完整训练代码
# 训练配置
epochs = 100
loss_list = []
total_loss = 0.0
total_samples = 0
# 开始多轮训练
for epoch in range(epochs):
# 每轮初始化损失和样本数
total_loss = 0.0
total_samples = 0
# 遍历每一批数据
for batch_x, batch_y in data_loader:
# 1. 模型预测
y_pred = model(batch_x)
# 2. 维度对齐:batchy转为[n, 1]
batch_y = batch_y.reshape(-1, 1)
# 3. 计算损失
loss = criterion(y_pred, batch_y)
# 4. 累加损失与样本数
total_loss += loss.item()
total_samples += 1
# 5. 梯度清零 + 反向传播 + 参数更新
optimizer.zero_grad() # 梯度清零(关键!避免累积)
loss.backward() # 反向传播算梯度
optimizer.step() # 更新w和b
# 计算本轮平均损失
avg_loss = total_loss / total_samples
loss_list.append(avg_loss)
# 打印训练日志
print(f"第{epoch+1}轮 | 平均损失:{avg_loss:.4f}")
# 打印最终模型参数
print("="*50)
print(f"训练完成!\n权重w:{model.weight.item():.4f}\n偏置b:{model.bias.item():.4f}")
print("="*50)
3. 训练关键细节
-
下划线
_的用法:循环中无需使用的变量,用_占位,代码更简洁。 -
梯度清零:每批训练前必须清零,否则梯度会累积,导致参数更新错误。
-
item()作用:从张量中提取标量数值,用于损失计算与打印。 -
维度对齐:
y必须转为[n, 1],与预测值y_pred形状匹配。
📉 五、损失曲线可视化:看模型如何“越学越准”
损失曲线是模型训练的“体检报告”,能直观看到模型收敛效果。
图表说明:损失曲线呈快速下降→缓慢收敛趋势,前20轮损失骤降,后续逐渐平稳,说明模型参数不断逼近真实值w=2、b=3。
🎯 六、训练结果与核心总结
1. 最终效果
-
初始参数:随机初始化
w、b -
训练100轮后:
w≈2.0,b≈3.0,与真实分布几乎一致 -
损失值:从900+降至10以内,模型收敛完美
2. 核心知识点复盘
| 模块 | 核心作用 | 关键要点 |
|---|---|---|
| DataLoader | 分批加载数据 | 训练集打乱,测试集不打乱 |
| nn.Linear | 线性变换 | 输入/输出维度匹配 |
| MSELoss | 损失计算 | 回归任务标配 |
| SGD | 参数优化 | 学习率决定更新步长 |
| 训练循环 | 模型迭代 | 清零梯度→反向传播→更新参数 |
🌟 写在最后
线性回归看似简单,却浓缩了深度学习的全部核心逻辑。今天我们实现的这套代码,是所有深度学习模型的基础模板——只需替换模型、调整损失函数,就能快速上手图像分类、目标检测、自然语言处理等任务。
吃透这一套流水线,你就真正踏入了深度学习的大门,接下来的进阶之路,会越走越顺!🚀

要不要我帮你生成可直接运行的完整Python文件,附带注释和绘图代码?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)