数据集和数据加载器
处理数据样本的代码可能会变得复杂且难以维护。通常,我们希望数据集代码与模型训练代码解耦,以便更好地提升代码的可读性和模块化。
PyTorch 提供了两个数据处理的基本组件——torch.utils.data.DataLoader 和 torch.utils.data.Dataset,可用于加载预设的数据集或自定义的数据。
Dataset 用于存储样本及其对应的标签,而 DataLoader 则为 Dataset 包装了一个迭代器,方便访问样本。
PyTorch 的领域库提供了许多示例预加载数据集(例如 FashionMNIST),这些数据集继承了 torch.utils.data.Dataset 并实现了特定数据的功能。以下是用于模型原型设计和基准测试的样本类型:
- 图像数据集
- 文本数据集
- 音频数据集
加载数据集
我们将从 TorchVision 中加载 Fashion-MNIST 数据集。Fashion-MNIST 是 Zalando 服装图像的数据集,包括 60,000 个训练样本和 10,000 个测试样本。每个样本包含一个 28×28 的灰度图像及其所属的 10 个类别之一的标签。
- 每张图片的高度为 28 像素,宽度为 28 像素,共计 784 个像素。
- 10 个类别描述了图像的类型,例如:T 恤/上衣、裤子、套头衫、连衣裙、包、踝靴等。
- 灰度像素值在 0 到 255 之间,表示黑白图像的强度。强度值从白到黑增加,例如:白色为 0,而黑色为 255。
我们使用以下参数加载 FashionMNIST 数据集:
- root 是存储训练/测试数据的位置。
- train 指定是训练数据还是测试数据。
- download=True 表示若数据未在
root目录下,则从互联网下载。 - transform 和
target_transform指定特征和标签的转换。
## 遍历和可视化数据集
我们可以像列表一样手动索引 Datasets:training_data[index]。
使用 matplotlib 来可视化训练数据中的一些样本。

png
## 使用数据加载器准备训练数据
Dataset 一次检索一个样本的特征和标签。在模型训练时,我们通常希望将样本按小批量传递,每个 epoch 对数据重新洗牌,以减少模型的过拟合,并使用 Python 的多进程加速数据检索。
在机器学习中,数据集中需指定特征和标签。特征是输入,标签是输出。训练时使用特征数据,进而训练模型预测标签。
- 特征是图像像素中的模式。
- 标签是 10 个类别类型:T 恤、凉鞋、连衣裙等。
DataLoader 是一个可迭代对象,简化了这些复杂操作。使用 DataLoader 时需要设置以下参数:
- data:用于训练模型的训练数据和评估模型的测试数据。
- batch size:每个批次处理的记录数量。
- shuffle:按索引随机采样数据。
from torch.utils.data import DataLoader
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)
遍历数据加载器
我们已将数据集加载到 Dataloader 中,现在可以根据需要遍历数据集。
以下每次迭代返回一批 train_features 和 train_labels(分别包含 batch_size=64 的特征和标签)。由于我们指定了 shuffle=True,因此在遍历完所有批次后,数据会被打乱,以便对数据加载顺序进行更细粒度的控制。

png
归一化
归一化是一种常见的数据预处理技术,用于缩放或转换数据,以确保每个特征都有相等的学习贡献。例如,灰度图像中的每个像素值在 0 到 255 之间,这些都是特征。如果一个像素的值是 17,而另一个像素的值是 197,那么像素的重要性分布就会不均匀,因为较高的像素值会影响学习过程。归一化在不扭曲特征之间区别的情况下,改变了数据的范围。进行这种预处理是为了避免:
- 减少预测准确性。
- 模型学习的困难。
- 特征数据范围的不利分布。
转换
数据并不总是以训练机器学习算法所需的最终处理形式出现。我们使用 转换(transforms) 来操作数据,使其适合训练。
所有 TorchVision 数据集都有两个参数(transform 用于修改特征,target_transform 用于修改标签),这些参数接受包含转换逻辑的可调用对象。torchvision.transforms 模块提供了几种常用的转换,可以直接使用。
FashionMNIST 的特征以 PIL 图像格式存储,标签为整数。为了进行训练,我们需要将特征转换为归一化的张量,将标签转换为独热编码(one-hot encoded)张量。为实现这些转换,我们将使用 ToTensor 和 Lambda。
ToTensor()
ToTensor 将 PIL 图像或 NumPy ndarray 转换为 FloatTensor,并将图像的像素强度值缩放到 [0., 1.] 的范围内。
Lambda 转换
Lambda 转换可以应用任何用户自定义的 lambda 函数。在这里,我们定义一个函数将整数转换为独热编码(one-hot encoded)张量。它首先创建一个大小为 10 的零张量(我们数据集中标签的数量),然后调用 scatter 函数,在由标签 y 指定的索引上赋值为 1。你也可以使用 torch.nn.functional.one_hot 作为另一种选择来实现这一功能。