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 加载是"线",是将所有零部件组装成一条自动化流水线,供模型(工厂)消耗。
相关推荐
qq_452396231 小时前
【Python × AI】多智能体协作:从 AutoGPT 到 CrewAI 的组织进化论
大数据·人工智能·python·ai
guhy fighting2 小时前
pycharm 切换版本和窗口cmd看到的版本不一致问题解决
ide·python·pycharm
今儿敲了吗2 小时前
python基础学习笔记第六章——函数进阶
笔记·python·学习
码码哈哈0.02 小时前
LangChain 快速入门(从0到可用)
开发语言·python·langchain
2301_776508723 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
熊文豪3 小时前
Java 入门指南
开发语言·python
带娃的IT创业者3 小时前
WeClaw 日志分析实战:如何从海量日志中快速定位根因?
运维·python·websocket·jenkins·fastapi·架构设计·实时通信
wh_xia_jun4 小时前
MODNet 本地抠图项目指南
python
老歌老听老掉牙4 小时前
Python星号参数深度解析
python·参数·星号