Dataset 与 DataLoader
Dataset 定义单样本,DataLoader 负责抽样、组批、打乱和并行读取。
学习目标
- 五条样本如何组为三批
- 变长序列为什么默认 collate 会失败?
- 说明:DataLoader 只组织数据,不会自动保证分割独立、标签正确或预处理无泄漏。
为什么需要这个概念
Dataset 定义可索引样本的读取契约;DataLoader 根据采样器、批大小和 collate_fn 将多个样本组织成批,并可通过工作进程并行读取。
学习前需要掌握
背景与问题
模型期望一批规整张量,而原始数据可能分散在文件或记录中。Dataset 负责单样本读取,DataLoader 负责采样和组批,分清两者有助于定位数据错误与性能瓶颈。
概念定义
Dataset 定义可索引样本的读取契约;DataLoader 根据采样器、批大小和 collate_fn 将多个样本组织成批,并可通过工作进程并行读取。
直观理解
Dataset 像按编号取货的仓库,DataLoader 像决定取哪些货、每箱装多少以及怎样打包的装箱员。
核心原理
常见 map-style Dataset 实现 len 和 getitem,每次返回特征与目标。默认 collate 会把同形状 Tensor 堆叠并添加 batch 维,因此单样本输出 shape 决定批量接口。
shuffle 改变采样顺序,不应改变标签对应关系。训练常打乱,验证通常固定顺序;变长序列需要自定义 collate_fn 做 padding 并返回长度或 mask,而不是期待默认堆叠自动处理。
num_workers 决定数据读取进程数,不直接控制模型计算并行。Windows 多进程脚本需要 main 保护,初步调试可先用 0,让读取异常在主进程清楚暴露。读取加速也不能掩盖训练验证泄漏。
数学表达
核心公式
Dataset 定义可索引样本的读取契约;DataLoader 根据采样器、批大小和 collate_fn 将多个样本组织成批,并可通过工作进程并行读取。
变量含义
N样本数Bbatch size
计算步骤
- 1默认 collate 把前两条堆成 (2,2) 与 (2,)。
- 2第二批同样大小,尾批为 (1,2) 与 (1,)。
代码对应位置
示例 1五条样本如何组为三批的最小验证:使用完整构造输入核对五条样本如何组为三批,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | 样本数 |
B | batch size |
完整数值示例
五条样本如何组为三批
已知条件
- 每条样本有两个特征和一个类别索引
- 数据共 5 条,batch_size=2,不丢尾批
计算步骤
- 默认 collate 把前两条堆成 (2,2) 与 (2,)。
- 第二批同样大小,尾批为 (1,2) 与 (1,)。
计算结果
三批样本数为 2、2、1,尾批仍保留 batch 轴。
处理前后对比
- DataLoader 只组织数据,不会自动保证分割独立、标签正确或预处理无泄漏。
五条样本如何组为三批
即使最后只有一条,特征 shape 仍是 (1,2),不是 (2,)。这使模型能用相同批量接口处理尾批,也说明无参数 squeeze 可能破坏契约。
示例使用顺序采样以便核对,不代表训练必须禁用 shuffle。真实项目还应检查样本 ID,确保增强、读取和标签始终配对。
计算与实现步骤
- 默认 collate 把前两条堆成 (2,2) 与 (2,)。
- 第二批同样大小,尾批为 (1,2) 与 (1,)。
代码实现
示例 1
五条样本如何组为三批的最小验证
example_01.py用途:使用完整构造输入核对五条样本如何组为三批,输出只表示本例计算。
import torch
from torch.utils.data import TensorDataset, DataLoader
x = torch.arange(10, dtype=torch.float32).reshape(5, 2)
y = torch.tensor([0, 1, 0, 1, 0])
loader = DataLoader(TensorDataset(x, y), batch_size=2, shuffle=False, num_workers=0)
for i, (xb, yb) in enumerate(loader, 1):
print(f"batch={i} x={tuple(xb.shape)} y={tuple(yb.shape)} labels={yb.tolist()}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对五条样本如何组为三批,输出只表示本例计算。
y- 目标标签或连续目标值。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
from torch.utils.data import TensorDataset, DataLoader
x = torch.arange(10, dtype=torch.float32).reshape(5, 2)
y = torch.tensor([0, 1, 0, 1, 0])
loader = DataLoader(TensorDataset(x, y), batch_size=2, shuffle=False, num_workers=0)
for i, (xb, yb) in enumerate(loader, 1):
print(f"batch={i} x={tuple(xb.shape)} y={tuple(yb.shape)} labels={yb.tolist()}")预期输出或运行结果
batch=1 x=(2, 2) y=(2,) labels=[0, 1] batch=2 x=(2, 2) y=(2,) labels=[0, 1] batch=3 x=(1, 2) y=(1,) labels=[0]
常见错误 · 5 条
- 全数据拟合统计
- 验证随机增强
- 变长默认组批
- getitem 搬 GPU
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 图像和表格的批量读取
- 自定义序列 padding 与采样
常见错误
- 全数据拟合统计
- 验证随机增强
- 变长默认组批
- getitem 搬 GPU
常见问题
变长序列为什么默认 collate 会失败?
默认堆叠要求同一批对应张量形状一致。应通过 collate_fn 补齐长度并返回 mask,或采用其他明确的变长处理。
这个示例能说明什么边界?
DataLoader 只组织数据,不会自动保证分割独立、标签正确或预处理无泄漏。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。