当前位置: 首页 > backend >正文

Day38 训练

Day38 训练

    • 一、数据预处理与MNIST数据集
    • 二、Dataset类:定义数据的内容和格式
    • 三、DataLoader类:定义数据的加载方式和批量处理逻辑
    • 四、Dataset与DataLoader的职责分工
    • 五、总结


下面是一篇关于PyTorch中Dataset和DataLoader的博客文章,基于你提供的内容:


在深度学习项目中,高效地处理和加载大规模数据集是至关重要的。今天,让我们一起深入探索PyTorch中两个核心的数据处理工具:DatasetDataLoader

一、数据预处理与MNIST数据集

首先,我们需要对数据进行预处理。对于经典的MNIST手写数字数据集(包含60000张训练图片和10000张测试图片,每张图片大小为28×28像素,共10个类别),我们使用transforms.Compose创建了一个预处理管道:

transform = transforms.Compose([transforms.ToTensor(),  # 转换为张量并归一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # 使用MNIST数据集的均值和标准差进行标准化
])

然后,我们使用torchvision.datasets.MNIST加载数据集:

train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)

二、Dataset类:定义数据的内容和格式

Dataset类是PyTorch中所有数据集的基类。它定义了数据的内容和格式,主要包括:

  1. 数据存储路径/来源:如文件路径、数据库查询等
  2. 原始数据的读取方式:如图像解码为PIL对象、文本读取为字符串等
  3. 样本的预处理逻辑:如裁剪、翻转、归一化等,通常通过transform参数实现
  4. 返回值格式:如(image_tensor, label)

Dataset要求实现两个核心方法:

  • __len__():返回数据集的样本总数
  • __getitem__(idx):根据索引返回对应样本的数据和标签
class MNIST(Dataset):def __init__(self, root, train=True, transform=None):self.data, self.targets = fetch_mnist_data(root, train)self.transform = transformdef __len__(self): return len(self.data)def __getitem__(self, idx):img, target = self.data[idx], self.targets[idx]if self.transform is not None:img = self.transform(img)return img, target

我们可以通过索引直接访问数据集中的样本:

sample_idx = torch.randint(0, len(train_dataset), size=(1,)).item()
image, label = train_dataset[sample_idx]

三、DataLoader类:定义数据的加载方式和批量处理逻辑

DataLoader类负责将数据集切分为多个批次(batch),并支持多线程加载数据。它的主要功能包括:

  1. 批量大小(batch_size):每个批次包含的样本数量,通常选择2的幂次方以提高GPU计算效率
  2. 是否打乱数据顺序(shuffle):训练时通常设置为True,测试时设置为False
  3. 多进程加载(num_workers):利用多个子进程同时加载数据,提高数据加载速度
train_loader = DataLoader(train_dataset,batch_size=64,shuffle=True
)test_loader = DataLoader(test_dataset,batch_size=1000
)

四、Dataset与DataLoader的职责分工

维度DatasetDataLoader
核心职责定义"数据是什么"和"如何获取单个样本"定义"如何批量加载数据"和"加载策略"
核心方法__getitem__()__len__()无自定义方法,通过参数控制加载逻辑
预处理位置__getitem__中通过transform执行预处理无预处理逻辑,依赖Dataset返回的预处理后数据
并行处理无(仅单样本处理)支持多进程加载(num_workers>0
典型参数root(数据路径)、transform(预处理)batch_sizeshufflenum_workers

五、总结

通过Dataset和DataLoader的配合使用,我们可以高效地处理和加载大规模数据集。Dataset负责定义数据的内容和格式,而DataLoader负责批量加载和优化数据传输。

这种设计模式不仅提高了代码的可读性和可维护性,还充分利用了现代计算资源,使深度学习模型的训练过程更加高效。

希望这篇博客能帮助你更好地理解和使用PyTorch中的Dataset和DataLoader!


浙大疏锦行

http://www.xdnf.cn/news/10798.html

相关文章:

  • 服务端定时器的学习(一)
  • C#面试问题61-80
  • AgenticSeek:您的本地AI智能大脑,免费且私密
  • 线程相关面试题
  • 【leetcode】20. 有效的括号
  • ​链表题解——回文链表【LeetCode】
  • Go 为何天生适合云原生?
  • 前端下载文件,文件打不开的问题记录
  • 【数据分析】第四章 pandas简介(2)
  • AI与区块链:数据确权与模型共享的未来
  • recipes中声明 DEPENDS += “virtual/kernel“ 的效果
  • 『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)
  • Qt开发:QThreadPool的介绍和使用
  • 如何合理设计缓存 Key的命名规范,以避免在共享 Redis 或跨服务场景下的冲突?
  • 【QT】在Qt6的`QTextEdit`中,同一行更新内容
  • 浅谈边缘计算
  • K8s基础一
  • QUIC——UDP实现可靠性传输
  • 数据结构:递归的种类(Types of Recursion)
  • 云计算 Linux Rocky day03
  • 电子电路:什么是晶振?
  • Java项目OOM排查
  • 云原生架构下的现代化应用治理:理念、挑战与实践路径
  • CSS 表单设计与实现技巧
  • Apache Iceberg 如何实现分布式 ACID 事务:深度解析大数据时代的可靠数据管理
  • Spring @Value注解的依赖注入实现原理
  • Unity——QFramework工具 AciontKit时序动作执行系统
  • React 第五十一节 Router中useOutletContext的使用详解及注意事项
  • Lua和JS的垃圾回收机制
  • Fuse.js:打造极致模糊搜索体验