Pytorch加载数据

1. Dataset:解决"数据从哪来"的问题

Dataset 是一个抽象类。当你自定义一个 Dataset 时,本质上是在重写一份"说明书",告诉 PyTorch 如何读取你的特定数据。

  • 核心任务:
    • 定位数据 :比如读取文件夹里所有的 .jpg 图片。
    • 索引数据 :实现 __getitem__ 方法,让程序能通过 dataset[i] 这种方式拿到第 i 个样本。
    • 统计数量 :实现 __len__ 方法,告诉程序总共有多少条数据。
    • 数据变换 :通常在这里集成 Transforms,进行图片缩放、标准化等预处理。

2. DataLoader:解决"数据怎么给"的问题

DataLoader 并不存储实际数据,它是一个迭代器 。它封装了 Dataset,负责管理数据的流转。

  • 核心功能:
    • Batch Size(批大小):深度学习通常不是一张张训练图,而是一次喂入一组数据(比如 32 张)。DataLoader 负责把样本拼成 Tensor。
    • Shuffle(打乱):在每个 Epoch 开始时打乱数据顺序,防止模型产生过拟合或记忆顺序。
    • Num_Workers(多进程):开启多个子进程并行读取数据。这是解决"显卡在等 CPU 读数据"这一瓶颈的关键。
    • Drop_Last:如果总数不能被 Batch Size 整除,是否丢弃最后那一小撮不够一个批次的数据。

3. 直观对比:超市购物类比

|----------|--------------------------|----------------------------------------------|
| 特性 | Dataset (物料/商品) | DataLoader (购物车/收银台) |
| 职责 | 负责单个数据的读取标签配对。 | 负责数据的打包排序分发。 |
| 关注点 | 每一张图长什么样?对应的 Label 是什么? | 一次送多少个样本?要不要打乱顺序? |
| 代码表现 | len(dataset) 得到总样本数。 | for data, target in dataloader 循环获取 Batch。 |


4. 简单的代码逻辑示例

Python

复制代码
# 1. Dataset 准备好每一条鱼
dataset = MyCustomDataset(root_dir='data/')

# 2. DataLoader 负责把鱼装箱、运送
dataloader = DataLoader(dataset, batch_size=4, shuffle=True)

# 3. 神经网络开始吃箱子里的鱼
for batch_imgs, batch_labels in dataloader:
    # 此时 batch_imgs 的形状通常是 [4, C, H, W]
    output = model(batch_imgs)

2.常用数据集两种形式

① 第一种:按文件夹分类 (Folder-based Classification)

这种形式通常被称为 ImageNet 格式Category-folder 格式 。它是图像分类任务的标准,绝大多数深度学习框架(如 PyTorch 的 ImageFolder)都原生支持这种结构。

  • 核心逻辑:文件夹的名字即是类别(Label),该文件夹下的所有图片都属于这个类别。

结构示例

  • Plaintext

    dataset/
    ├── train/
    │ ├── cat/ <-- 这里的 "cat" 就是 Label
    │ │ ├── 001.jpg
    │ │ └── 002.jpg
    │ └── dog/ <-- 这里的 "dog" 就是 Label
    │ ├── 001.jpg
    │ └── 002.jpg

  • 优点:直观,不需要额外的标注文件,移动或删除某一类数据非常方便。


② 第二种:独立文本标注 (Individual Text Labeling)

这种形式在 目标检测 (YOLO)文本识别 (OCR)图像描述 (Captioning) 中极为常见。

  • 核心逻辑 :每一张图片都对应一个同名的 .txt 文件。图片存放在一个文件夹,标注存放在另一个文件夹(或混在一起),通过文件名实现一一对应。
  • 结构示例

Plaintext

复制代码
dataset/
├── images/
│   ├── img_01.jpg
│   └── img_02.jpg
└── labels/
    ├── img_01.txt    <-- 内部内容可能是 "0 0.5 0.5 0.1 0.1" (YOLO格式)
    └── img_02.txt    <-- 或者是图片的文本描述
  • 优点
    • 信息量大:不仅可以存储类别,还可以存储坐标(如矩形框的 x, y, w, h)。
    • 灵活性高:适用于一张图片包含多个标签(多目标)的情况。

总结对比

|----------|---------------------|---------------------------|
| 特性 | 第一种 (文件夹分类) | 第二种 (同名文本) |
| 主要用途 | 基础图像分类 | 目标检测、分割、复杂分类 |
| 标签关系 | 一张图一个标签 | 一张图可对应多个标签/坐标 |
| 读取难度 | 极低(框架自带) | 中等(需编写读取逻辑) |
| 典型代表 | ImageNet, Kaggle分类赛 | YOLO, COCO (txt版), OCR数据集 |

PyTorch 数据处理的流水线中,"路径加载"通常是指基础的文件操作测试 ,而 "Dataset 加载"则是工业级的标准化封装

根据你提供的文件内容,我们可以从以下几个维度拆解它们的区别:


1. 用法上的区别 (How)

路径直接加载 (基础操作)

这是一种"手动"模式,通常用于在编写正式模型前,测试某条路径是否正确、图片是否损坏。

  • 代码特征 :直接使用 PIL.Image.open()cv2.imread()
  • 局限性:一次只能处理一张图;如果想处理下一张,必须手动修改字符串路径;无法直接喂给神经网络进行批量训练。
Dataset 加载 (类封装)

这是一种"自动化"模式。通过继承 torch.utils.data.Dataset 类,将路径逻辑封装进 __getitem__ 方法中。

  • 代码特征
    1. 初始化 ( init****):一次性获取所有图片的路径列表。
    2. 索引取值 ( getitem****):输入一个数字(索引),自动返回对应的"图片 + 标签"。
    3. 获取长度 ( len****):告诉程序数据集的总数。

2. 用途上的区别 (Why)

|----------|--------------------------------|----------------------------------|
| 维度 | 路径直接加载 (Step 3) | Dataset 加载 (Step 4) |
| 主要用途 | 调试与验证:检查单张图片能否打开,查看图片长什么样。 | 模型训练:为神经网络提供成千上万的数据流。 |
| 数据规模 | 单个或极少量文件。 | 整个数据集(成百上千甚至百万级图片)。 |
| 功能扩展 | 无。 | 支持数据增强(Transform)、数据集拼接(+ 运算)。 |
| 内存管理 | 随开随关,管理麻烦。 | 按需加载:只有训练到这一步才读图,节省内存。 |


3. 加载数据为什么必须从"路径"进化到"Dataset"?

在你的代码中,有一个非常直观的例子:

如果你有蚂蚁(ants)和蜜蜂(bees)两个类别的文件夹,使用路径加载 你需要写两次读取逻辑;但使用 Dataset,你可以像下面这样操作:

  1. 统一逻辑 :定义一个 MyData 类,不管是蚂蚁还是蜜蜂,只要给它路径,它就能吐出数据。
  2. 灵活合并 :通过 train_dataset = ants_dataset + bees_dataset,你可以瞬间得到一个混合了多种类别的训练集。
  3. 对接 DataLoader :Dataset 加载后的对象可以直接丢进 DataLoader,实现自动洗牌(Shuffle)和批量打包(Batch),这是路径直接加载无法做到的。

总结

  • 路径加载是"点",是用来确认每一个零部件(图片)没问题的。
  • Dataset 加载是"线",是将所有零部件组装成一条自动化流水线,供模型(工厂)消耗。
相关推荐
0xBADCODE5 分钟前
动态DEX加载+反射+DES硬编码密钥:安卓三层逆向实战
android·java·python·安全·网络安全·逆向·ctf
岁月宁静17 分钟前
一、《从零手撸 Agent》 我用 10 行代码跑通了第一次大模型调用(顺便踩了 4 个坑)
前端·python·agent
大连好光景17 分钟前
【AI Agent案例开发项目01解读】
chrome·python·langchain
青 春 记 忆20 分钟前
零基础入门python43:Django接口测试与库存边界
python·django·后端开发
Patrick在香港26 分钟前
Python 拉取 C&SD 官方 API:香港 2022 年已跨过“超老龄线“,而抚养比正在爬回 1961
android·c语言·python·数据分析·时序数据库·数据可视化·香港
2601_9623824328 分钟前
Python零基础入门,看完直接上手写代码
python·机器学习·编程语言·数据科学·入门教程
信誓旦旦的程序猿29 分钟前
【零依赖量化数据实战 #25】北交所技术指标与基本面
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
2601_9669496531 分钟前
Python 量化开发为什么适合使用金融数据 SDK?从数据获取到策略研究的工程化实践
开发语言·python·数据分析·量化交易·股票数据·quantdash
科技小E31 分钟前
训完怎么带走?AI模型私有化部署平台DLTM模型导出ONNX/PyTorch与离线部署跑遍产线边缘
人工智能·pytorch·python
晓窗科技32 分钟前
专业的AI基座公司
人工智能·python