自定义数据集与 DataLoaders
torch.utils.data.Dataset、__len__/__getitem__、DataLoader、变换和数据增强。
自定义数据集与 DataLoaders 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
向模型提供数据
训练需要一种高效读取、变换和批处理数据的方式。PyTorch 提供了两种抽象:数据集(知道如何获取一个样本)和 DataLoader(将样本组成批次并打乱顺序)。
from torch.utils.data import Dataset, DataLoader数据集接口
自定义的 Dataset 子类必须实现两个方法:__len__(样本数量)和 __getitem__(返回指定索引处的样本)。PyTorch 会调用它们来提取数据。
实现 __len__
__len__ 会告诉 PyTorch 数据集的大小,使其知道有多少个索引以及一个训练周期包含多少个批次。
class ImageDataset(Dataset):
def __init__(self, paths, labels):
self.paths = paths
self.labels = labels
def __len__(self):
return len(self.paths)实现 __getitem__
__getitem__ 根据给定索引加载并返回一个样本及其标签。您会在这里打开图像文件,并将其转换为 tensor。
from PIL import Image
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
label = self.labels[idx]
return img, label为什么需要变换?
原始图像的尺寸和像素范围各不相同。变换可以将它们标准化:调整到固定尺寸、转换为 tensor,并归一化像素值,使模型能够稳定训练。
from torchvision import transformstransforms.Compose
transforms.Compose 会将多个变换按顺序串联成一个处理流程。典型的链式处理流程是先执行 Resize,再执行 ToTensor,最后执行 Normalize。
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])理解变换
Resize 会固定空间尺寸;ToTensor 会将 PIL 图像转换为 tensor,并将像素缩放到 [0,1];Normalize 会对每个通道进行平移和缩放,使其具有零均值和单位方差,从而加快收敛。
在数据集中应用变换
将变换传入数据集,并在 __getitem__ 中应用它,这样每个样本在获取时都能经过一致的预处理。
class ImageDataset(Dataset):
def __init__(self, paths, labels, transform):
self.paths, self.labels, self.transform = paths, labels, transform
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
return self.transform(img), self.labels[idx]封装到 DataLoader 中
DataLoader 会将数据集转换为由批次组成的可迭代对象。设置 batch_size 可以控制每个 step 的样本数,设置 shuffle=True 可以在每个训练周期随机打乱顺序(这对训练很重要)。
dataset = ImageDataset(paths, labels, tf)
loader = DataLoader(dataset, batch_size=32, shuffle=True)使用 num_workers 提速
num_workers 会启动并行子进程,在 GPU 训练的同时加载并变换数据,从而隐藏输入输出延迟。设置为 4 之类的值通常可以让 GPU 持续获得数据,而不是停下来等待。
loader = DataLoader(
dataset,
batch_size=32,
shuffle=True,
num_workers=4
)遍历批次
遍历 DataLoader 以获取批量 tensor。每次迭代都会生成 (images, labels),其中 images 的形状为 [batch_size, channels, H, W],可以直接输入模型。
for images, labels in loader:
print(images.shape) # torch.Size([32, 3, 224, 224])
break快速检查
检验您对数据处理流程的理解。
回顾:数据集与 DataLoaders
您使用 __len__ 和 __getitem__ 构建了自定义 Dataset,使用 transforms.Compose(Resize、ToTensor、Normalize)预处理图像,并将其封装到带有 batch_size、shuffle 和 num_workers 的 DataLoader 中,从而高效地向模型提供批次。
常见问题解答
「自定义数据集与 DataLoaders」课时是免费的吗?
是的 — 「自定义数据集与 DataLoaders」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「自定义数据集与 DataLoaders」这节课中我会学到什么?
torch.utils.data.Dataset、__len__/__getitem__、DataLoader、变换和数据增强。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「自定义数据集与 DataLoaders」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- PyTorch 张量与 Autograd
- 自定义数据集与 DataLoaders
- 在 PyTorch 中构建并训练 CNN
- 使用 YOLOv8 进行目标检测