01 - Dataset和DataLoader
从前有两个类
在PyTorch中,Dataset和DataLoader是两个关键的类,用于处理数据加载和预处理,特别是在训练神经网络时。
Dataset类
Dataset是一个抽象类,用于表示数据集。它提供了一个接口,让用户可以自定义数据集的加载和预处理逻辑。用户需要继承Dataset类,并实现__len__和__getitem__方法来定义数据集的大小和如何获取单个样本。Dataset的目的是为了统一数据加载的接口,使得不同类型的数据可以以相同的方式被加载和使用。
它提供了一种方式去获取数据及其label。
DataLoader类
DataLoader用于将Dataset对象封装成可迭代的数据加载器。它提供了批量加载数据、数据打乱、并行加载等功能。DataLoader使得用户可以更方便地迭代训练数据集,并且支持多线程和多进程的数据加载,提高了数据加载的效率。
它为神经网络提供不同的数据形式。
Dataset
理论
常见的数据组成形式:
- label以文件夹命名区分。
- label和data分开,label记录在文本中,文本与数据文件名对应。
- 以文件名作为label。
- 这是一个表示数据集的抽象类,用于表示从键到数据样本的映射。所有表示从键到数据样本的数据集都应该是它的子类。
- 所有子类都应该重写
__getitem__
方法,以支持根据给定键获取数据样本。此外,子类还可以选择重写__len__
方法,该方法期望返回数据集的大小,许多torch.utils.data.Sampler
实现和torch.utils.data.DataLoader
的默认选项都会使用这个方法。子类还可以选择实现__getitems__
方法,用于加速批量样本加载。这个方法接受样本批次的索引列表,并返回样本列表。 - 对于
torch.utils.data.DataLoader
默认情况下会构建一个索引采样器,该采样器生成整数索引。如果要将其用于具有非整数索引/键的映射样式数据集,则必须提供自定义采样器。 - 类
Dataset
是typing.Generic
的子类,这意味着它是一个泛型类。它具有一个类型参数T_co
,表示协变的类型。 - 该类定义了
__add__
和__getitem__
方法。__add__
方法用于连接两个数据集。__getitem__
方法用于根据索引获取数据集中的样本。 - 该类还具有一些数据描述符,如
__dict__
和__weakref__
,以及一些类属性,如__orig_bases__
和__parameters__
。 - 还有一些从
typing.Generic
继承的类方法和静态方法,如__class_getitem__
和__init_subclass__
。
实战
from torch.utils.data import Dataset
from PIL import Image
<