DataLoader 详解:批量读取、打乱、并行加载有什么用

DataLoader 负责把数据按批次送进模型,并处理 shuffle、batch size 和多进程加载等训练细节。

学习路线:AI 入门与 PyTorch 基础(1~20) · 第 17 课
第 17 课多张数据卡片被整理成批次,旁边屏幕显示抽象的数据加载队列。
Learning Path

AI 入门与 PyTorch 基础(1~20)

从 AI 基本概念、机器学习任务、深度学习直觉、PyTorch 入门到中文文本分类项目全貌。

学完本阶段你能做到:能说清 AI、机器学习、深度学习、PyTorch 训练流程和一个中文文本分类项目的大致链路。

推荐读法:零基础建议顺序阅读;已有基础的读者可以把它当作路线地图和查漏补缺清单。

查看完整阶段 · 20 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「DataLoader 详解:批量读取、打乱、并行加载有什么用」解决的核心问题
  • 知道它在「AI 入门与 PyTorch 基础(1~20)」中的位置
  • 把 DataLoader、Linear 层、Tensor 这些关键词联系起来

前置知识

  • 建议先读完上一篇:PyTorch 的 Linear 层详解:全连接层到底做了什么
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【DataLoader】DataLoader 负责把数据一批一批喂给模型,训练循环才不会手忙脚乱。 前面或后面会反复用到它。
  • 【Linear 层】Linear 层做的是矩阵乘法加偏置,是很多神经网络模块的基础零件。 前面或后面会反复用到它。
  • 【Tensor】可以先把 Tensor 理解成支持 GPU、梯度和批量计算的多维数组。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要只看 API 名字,要同时关注输入输出 shape 和训练流程。

课后练习

  • 用 3 句话向一个零基础朋友解释「DataLoader 详解:批量读取、打乱、并行加载有什么用」。
  • 打开概念库里的「DataLoader」,补一遍它和本文的关系。
  • 读下一课「一个 PyTorch 模型训练的完整流程」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 如果一段 PyTorch 代码报 device 不一致,第一步应该检查什么?

先检查模型参数、输入 Tensor、标签 Tensor 是否在同一个设备上。常见修正是把它们统一 `.to(device)`。

2. 为什么学习 PyTorch 时不能只看 API 名字?

因为训练是否正确经常取决于 shape、dtype、device 和梯度流,API 名字只能告诉你工具,不会保证数据契约正确。

3. 读完本文后,至少应该能画出哪条训练主线?

`输入数据 → forward → loss → backward → optimizer.step()`,并知道本文主题位于这条链路的哪一环。

下一步建议读「一个 PyTorch 模型训练的完整流程」。

训练模型时,我们通常不会一次把全部数据都塞进模型。

更常见的做法是:每次拿一小批数据训练一次。

在 PyTorch 里,负责这件事的就是 DataLoader

第 17 课视频 · DataLoader 详解(约 1 分 37 秒)

DataLoader 是什么

DataLoader 可以理解成数据搬运工。

它会从 Dataset 里取数据,然后按批次打包好,送给训练循环。

最常见的写法是:

from torch.utils.data import DataLoader

loader = DataLoader(
    dataset,
    batch_size=32,
    shuffle=True,
)

训练时就可以这样用:

for x, y in loader:
    pred = model(x)

batch_size 是什么

batch_size 表示每次送进模型多少个样本。

如果 batch size 是 32,就表示模型每次看 32 条数据,然后计算一次 loss,再更新参数。

batch size 太小,训练会更抖;batch size 太大,占用显存更多,也可能影响泛化。

入门阶段可以先从 32 或 64 这类常见值开始。

shuffle 有什么用

shuffle=True 表示每个 epoch 开始时打乱数据顺序。

这样做是为了避免模型记住数据的固定顺序。

比如数据前半部分全是类别 A,后半部分全是类别 B,如果不打乱,训练过程就可能很不稳定。

所以训练集一般会开启 shuffle。

但验证集和测试集通常不需要打乱,因为我们只是评估模型效果。

num_workers 是什么

num_workers 表示用几个子进程加载数据。

如果数据读取、图片预处理比较慢,可以适当增加它,让 CPU 提前准备数据,减少 GPU 等数据的时间。

不过在 Windows 或小项目里,刚开始可以先用默认值。

等训练真的被数据加载拖慢,再考虑调整。

DataLoader 和 Dataset 的关系

Dataset 负责定义“单条数据怎么取”。

DataLoader 负责定义“怎么批量取、要不要打乱、怎么并行加载”。

可以这样记:

Dataset 管单个样本
DataLoader 管一批样本

这两个配合起来,训练循环才会干净。

小结

DataLoader 不直接训练模型,但它决定数据怎样进入模型。

理解 batch_sizeshufflenum_workers,基本就能读懂大多数 PyTorch 入门训练代码。

Discussion

留言讨论