在深度学习的世界里,线性回归是打开模型训练大门的第一把钥匙。它不仅是最简单的模型,更是一套通用、可复用的训练范式——从数据集构建到模型迭代,从损失计算到参数优化,每一步都藏着深度学习的核心逻辑。今天,我们就用最清晰的思路,手把手搭建一套完整的线性回归训练代码,吃透底层逻辑,轻松迁移到 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(随机梯度下降)

优化器负责更新模型参数wb,缩小损失:

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形状匹配。


📉 五、损失曲线可视化:看模型如何“越学越准”

损失曲线是模型训练的“体检报告”,能直观看到模型收敛效果。

线性回归训练损失曲线 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 轮数 900 800 700 600 500 400 300 200 100 平均损失

图表说明:损失曲线呈快速下降→缓慢收敛趋势,前20轮损失骤降,后续逐渐平稳,说明模型参数不断逼近真实值w=2、b=3


🎯 六、训练结果与核心总结

1. 最终效果

  • 初始参数:随机初始化wb

  • 训练100轮后:w≈2.0b≈3.0,与真实分布几乎一致

  • 损失值:从900+降至10以内,模型收敛完美

2. 核心知识点复盘

模块 核心作用 关键要点
DataLoader 分批加载数据 训练集打乱,测试集不打乱
nn.Linear 线性变换 输入/输出维度匹配
MSELoss 损失计算 回归任务标配
SGD 参数优化 学习率决定更新步长
训练循环 模型迭代 清零梯度→反向传播→更新参数

🌟 写在最后

线性回归看似简单,却浓缩了深度学习的全部核心逻辑。今天我们实现的这套代码,是所有深度学习模型的基础模板——只需替换模型、调整损失函数,就能快速上手图像分类、目标检测、自然语言处理等任务。

吃透这一套流水线,你就真正踏入了深度学习的大门,接下来的进阶之路,会越走越顺!🚀

🔥从零实现线性回归:深度学习入门必学的完整训练流水线

要不要我帮你生成可直接运行的完整Python文件,附带注释和绘图代码?

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐