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

📅 2026/7/3 11:36:18
DataLoader 详解:批量读取、打乱、并行加载有什么用
训练模型时我们通常不会一次把全部数据都塞进模型。更常见的做法是每次拿一小批数据训练一次。在 PyTorch 里负责这件事的就是DataLoader。DataLoader 是什么DataLoader可以理解成数据搬运工。它会从 Dataset 里取数据然后按批次打包好送给训练循环。最常见的写法是from torch.utils.data import DataLoader ​ loader DataLoader( dataset, batch_size32, shuffleTrue, )训练时就可以这样用for x, y in loader: pred model(x)batch_size 是什么batch_size表示每次送进模型多少个样本。如果 batch size 是 32就表示模型每次看 32 条数据然后计算一次 loss再更新参数。batch size 太小训练会更抖batch size 太大占用显存更多也可能影响泛化。入门阶段可以先从 32 或 64 这类常见值开始。shuffle 有什么用shuffleTrue表示每个 epoch 开始时打乱数据顺序。这样做是为了避免模型记住数据的固定顺序。比如数据前半部分全是类别 A后半部分全是类别 B如果不打乱训练过程就可能很不稳定。所以训练集一般会开启 shuffle。但验证集和测试集通常不需要打乱因为我们只是评估模型效果。num_workers 是什么num_workers表示用几个子进程加载数据。如果数据读取、图片预处理比较慢可以适当增加它让 CPU 提前准备数据减少 GPU 等数据的时间。不过在 Windows 或小项目里刚开始可以先用默认值。等训练真的被数据加载拖慢再考虑调整。DataLoader 和 Dataset 的关系Dataset 负责定义“单条数据怎么取”。DataLoader 负责定义“怎么批量取、要不要打乱、怎么并行加载”。可以这样记Dataset 管单个样本 DataLoader 管一批样本这两个配合起来训练循环才会干净。小结DataLoader 不直接训练模型但它决定数据怎样进入模型。理解batch_size、shuffle和num_workers基本就能读懂大多数 PyTorch 入门训练代码。技术图把关键链路画清楚可运行实验观察 DataLoader 如何组成批次DataLoader 不改变样本内容它负责打乱索引、组成 batch并在需要时并行加载。固定随机种子后可以复现实验。import torch from torch.utils.data import DataLoader, TensorDataset ​ x torch.arange(10).float().unsqueeze(1) y x.squeeze(1) * 2 generator torch.Generator().manual_seed(7) loader DataLoader(TensorDataset(x, y), batch_size4, shuffleTrue, generatorgenerator) for index, (bx, by) in enumerate(loader): print(fbatch {index}: x{bx.squeeze(1).tolist()} y{by.tolist()})运行结果batch 0: x[1.0, 3.0, 5.0, 7.0] y[2.0, 6.0, 10.0, 14.0] batch 1: x[9.0, 4.0, 6.0, 2.0] y[18.0, 8.0, 12.0, 4.0] batch 2: x[8.0, 0.0] y[16.0, 0.0]10 个样本按 batch size 4 组成 3 批最后一批只有 2 个样本。shuffleTrue只应在训练集使用。常见误区Batch 越大训练一定越好。它会影响显存、梯度噪声和泛化。num_workers越大越快。过多进程可能增加通信开销Windows 环境还要注意主入口保护。动手练习分别设置drop_lastTrue和shuffleFalse观察批次数量与顺序变化。本文首发于「去你想去的地方」 DataLoader 详解批量读取、打乱、并行加载有什么用 | 去你想去的地方完整学习路线、视频版和后续更新请访问原文。