news 2026/4/3 7:00:00

DAY44 Dataset和Dataloader类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY44 Dataset和Dataloader类

目录

1. Dataset 类:定义“数据是什么”

2. DataLoader 类:定义“怎么拿数据”

3. MNIST 手写数字数据集

附例:


1. Dataset 类:定义“数据是什么”

Dataset类是 PyTorch 数据读取的基类,它的核心作用是定义数据的来源、索引方式和预处理逻辑

它要求用户重写两个Python 的特殊方法(Magic Methods),这使得自定义的数据集对象可以像 Python 原生列表(List)一样被操作:

  • __len__(self)

    • 作用:定义数据集的总样本数量。

    • Python 本质:当你对数据集对象调用len(dataset)时,Python 解释器会自动调用这个方法。

    • 重要性DataLoader需要通过它来计算一个 Epoch 需要遍历多少个 Batch。

  • __getitem__(self, index)

    • 作用:定义如何获取第index个样本

    • Python 本质:当你使用索引操作dataset[3]时,Python 解释器会自动调用这个方法,传入index=3

    • 内部逻辑:通常包含三个步骤:

      1. 定位:根据index找到对应的文件路径或数据行。

      2. 加载:读取图片(如PIL.Image.open)或读取文本/数值。

      3. 变换 (Transform):进行预处理(如归一化、裁剪、转 Tensor)。

    • 返回值:通常返回一个元组,例如(image_tensor, label)


2. DataLoader 类:定义“怎么拿数据”

如果说Dataset是仓库管理员(知道东西在哪),那么DataLoader就是物流配送员(负责打包和运输)。

DataLoader本身不需要你重写复杂的方法,它通过参数配置来控制加载行为。它的核心职责是将Dataset中获取的单个样本组合成批次(Batch)

  • 核心功能

    • Batching(批处理):将__getitem__返回的多个样本堆叠(Stack)成一个大 Tensor。例如,将 64 张[1, 28, 28]的图片堆叠成[64, 1, 28, 28]

    • Shuffling(打乱):在每个 Epoch 开始前打乱数据顺序,防止模型记忆样本顺序(通过shuffle=True开启)。

    • Parallelism(多进程):使用多进程同时读取数据,加速训练(通过num_workers参数控制)。

  • Dataset 与 DataLoader 的关系:

    DataLoader 是一个迭代器(Iterator),我们在训练循环 for inputs, labels in dataloader: 中使用的是 DataLoader,而 DataLoader 内部会不断调用 Dataset 的 __getitem__ 方法来凑齐数据。


3. MNIST 手写数字数据集

这是深度学习领域的 "Hello World" 级别的数据集。

  • 数据内容

    • 包含0~9的手写数字图片。

    • 训练集:60,000 张。

    • 测试集:10,000 张。

  • 图像特征

    • 尺寸:28 × 28 像素。

    • 通道:单通道(灰度图,Gray Scale)。

    • 数据格式:通常在 PyTorch 中会被处理为[1, 28, 28]的 Tensor。

  • 适用性

    • 由于维度较小(28*28=784特征),它既适合作为结构化数据用 MLP(多层感知机)训练,也适合作为图像数据用 CNN(卷积神经网络)训练。

  • 可视化

    • 原始数据通常是归一化过的(如均值0.1307,方差0.3081),可视化时需要进行反归一化操作才能看到清晰的黑底白字图像。

总结图解:

[硬盘上的文件] ↓ Dataset (__getitem__) --> 负责:找文件 -> 读文件 -> 预处理 -> 返回单条数据 (img, label) ↓ DataLoader (batch_size=64) --> 负责:调用64次Dataset -> 打包成一捆 -> 乱序 -> 多进程加速 ↓ [模型训练循环] (for x, y in loader) --> 获得形状为 [64, 1, 28, 28] 的 Tensor

附例:

cifar 数据集尝试获取其中一张图片

import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np # 1. 定义预处理 # 这里我们暂时只转为 Tensor,不进行标准化 (Normalization), # 这样显示时就不需要反标准化计算,方便直观查看原始图片。 transform = transforms.Compose([ transforms.ToTensor() ]) # 2. 下载并加载 CIFAR-10 数据集 # root: 数据存放路径 # train: True 表示训练集 # download: True 表示如果本地没有就下载 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) # CIFAR-10 的 10 个类别名称 classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') # 3. 获取一张图片 (调用 Dataset 的 __getitem__ 方法) # 我们取第 100 张图片试试 index = 100 image_tensor, label_index = trainset[index] # 打印一下数据的形状 print(f"数据索引: {index}") print(f"Tensor 形状: {image_tensor.shape}") # 预期: torch.Size([3, 32, 32]) print(f"标签索引: {label_index} ({classes[label_index]})") # 4. 可视化函数 def imshow(img_tensor): # img_tensor 目前是 [3, 32, 32] (Channel, Height, Width) # Matplotlib 画图需要 [32, 32, 3] (Height, Width, Channel) # 使用 .permute() 交换维度: 0->1, 1->2, 2->0 # 或者用 numpy.transpose(1, 2, 0) img_np = img_tensor.permute(1, 2, 0).numpy() plt.imshow(img_np) plt.axis('off') # 不显示坐标轴 plt.show() print("\n显示图片:") imshow(image_tensor)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 17:09:27

WSABuilds 终极解决方案:5大核心问题诊断与修复完整指南

WSABuilds 终极解决方案:5大核心问题诊断与修复完整指南 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU (root s…

作者头像 李华
网站建设 2026/3/21 9:49:19

css核心技术第二篇(笔记)

CSS 文本样式分类CSS 文本样式用于控制文字外观,分为两大类:字体样式:控制字体本身(颜色、字体、大小、粗细等)文本布局:控制文字排版(对齐、行高、间距等)字体样式的核心属性1. 字体…

作者头像 李华
网站建设 2026/4/2 21:35:36

虚拟手柄革命:用vJoy打造你的专属游戏控制中心

还在为键盘操作手感生硬而烦恼?或是苦于没有合适的游戏手柄?vJoy虚拟手柄技术正在重新定义你的游戏控制体验。这款开源虚拟手柄驱动能将任何输入设备转化为专业级游戏控制器,为模拟器玩家、游戏主播和开发者提供无限可能。 【免费下载链接】v…

作者头像 李华
网站建设 2026/4/2 4:45:47

ZLUDA终极指南:在Intel GPU上运行CUDA程序的完整教程

还在为Intel集成显卡无法运行CUDA应用而苦恼吗?ZLUDA作为一款创新的兼容层工具,让Intel GPU用户也能享受CUDA生态的便利。本文将带你全面了解ZLUDA的工作原理、配置方法和性能优化技巧,让你的Intel显卡轻松运行PyTorch等CUDA应用。 【免费下载…

作者头像 李华
网站建设 2026/3/31 9:29:25

APA第7版参考文献格式工具:让学术写作告别格式烦恼

还在为论文参考文献格式而头疼吗?想象一下这样的场景:凌晨三点,论文提交截止前几小时,你终于完成了所有内容写作,却发现参考文献格式一塌糊涂。作者姓名顺序混乱、出版年份位置错误、标点符号使用不当……这些问题不仅…

作者头像 李华
网站建设 2026/3/31 21:56:07

QMC音频解码工具完全指南:快速解锁加密音乐文件

QMC音频解码工具完全指南:快速解锁加密音乐文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为无法播放的加密音频文件而困扰吗?qmc-decoder…

作者头像 李华