Pytorch学习笔记 DataLoader

部署运行你感兴趣的模型镜像

DataLoader 是 PyTorch 中用于批量加载数据的核心工具,它能够高效地处理大规模数据集,并支持多线程数据加载、数据打乱、批处理等功能。

一、基本概念与核心参数

DataLoader 通常与 Dataset 类配合使用:

  • Dataset:负责存储样本和获取单个数据样本(如图片、标签)。
  • DataLoader:负责将 Dataset 中的数据打包成批次,并进行并行加载

核心参数

from torch.utils.data import DataLoader

DataLoader(
    dataset,                # 必须是 torch.utils.data.Dataset 的子类
    batch_size=1,           # 每批次包含的样本数
    shuffle=False,          # 是否在每个 epoch 开始时打乱数据
    sampler=None,           # 自定义采样策略
    batch_sampler=None,     # 自定义批次采样策略
    num_workers=0,          # 并行加载数据的进程数
    collate_fn=None,        # 自定义如何将样本合并为批次
    pin_memory=False,       # 是否将数据加载到 CUDA 固定内存中(加速 GPU 数据传输)
    drop_last=False,        # 是否丢弃最后一个不完整的批次
    timeout=0,              # 数据加载超时时间
    worker_init_fn=None,    # 每个 worker 进程的初始化函数
)

二、使用示例

1. 使用内置 Dataset(如 MNIST)
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 定义数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),                # 转换为张量
    transforms.Normalize((0.1307,), (0.3081,))  # 归一化处理
])

# 加载训练集和测试集
train_dataset = datasets.MNIST(
    root='./data',        # 数据存储路径
    train=True,           # 是否为训练集
    download=True,        # 是否下载数据
    transform=transform   # 应用预处理
)

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

# 创建 DataLoader
train_loader = DataLoader(
    train_dataset,
    batch_size=64,        # 每批次 64 个样本
    shuffle=True,         # 训练集需要打乱数据
    num_workers=4         # 使用 4 个进程并行加载数据
)

test_loader = DataLoader(
    test_dataset,
    batch_size=128,
    shuffle=False,        # 测试集不需要打乱数据
    num_workers=2
)

# 遍历数据(典型的训练循环)
for epoch in range(10):
    for batch_idx, (data, target) in enumerate(train_loader):
        # data.shape: [64, 1, 28, 28](批次大小、通道数、高度、宽度)
        # target.shape: [64](标签)
        print(f"Epoch: {epoch}, Batch: {batch_idx}, Data shape: {data.shape}")
        # 模型训练代码...
2. 自定义 Dataset

当处理自己的数据集时,需要继承 torch.utils.data.Dataset 类并实现__len__ 和 __getitem__ 方法:

import torch
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self, data, labels, transform=None):
        self.data = data            # 数据
        self.labels = labels        # 标签
        self.transform = transform  # 预处理函数

    def __len__(self):
        return len(self.data)       # 返回数据集大小

    def __getitem__(self, idx):
        x = self.data[idx]
        y = self.labels[idx]
        
        if self.transform:
            x = self.transform(x)   # 应用预处理
            
        return x, y                 # 返回样本和标签

# 使用自定义 Dataset
data = torch.rand(1000, 3, 32, 32)  # 1000 个 3x32x32 的随机图像
labels = torch.randint(0, 10, (1000,))  # 1000 个 0-9 的随机标签

dataset = MyDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 验证数据加载
for batch in dataloader:
    x, y = batch
    print(f"Input shape: {x.shape}, Labels shape: {y.shape}")

三、高级用法

1. 自定义 collate_fn(处理变长数据)

当处理序列数据(如文本)时,样本长度可能不一致,需要自定义合并方式:

# 定义collate_fn函数,用于在DataLoader中对一个batch的数据进行处理
def my_collate_fn(examples):
    # 函数功能:将本批次的所有样本转换成张量并进行填充
    # 输入:
    # example,样本列表,每个样本不一定等长
    # 输出:
    # inputs:输入到模型的tensor([num_ex,max_len])(已经填充好的)
    # lengths:批次每个样本长度->tensor([num_ex])
    # targets:样本标签->tensor([num_ex])一维张量
    #-----------------examples:是一个列表(列表可以嵌套,但最终只有一维属性长度,没有像张量那样的多维度大小)
    #                 在这个任务中examp列表格式:[[[样本1],标签],[[样本2],标签],……,[[样本],标签]]
    #                 len(examples)->列表的长度(样本数)
    #                 example[0]->第一个样本及其标签,如[[2,45,6,21,7],0]         
    # 获取每个样本的长度,并将其转换为张量
    lengths = torch.tensor([len(ex[0]) for ex in examples]) # 最终lengths->保存每个样本的长度,并且是一个一维张量
    # 将每个样本的输入部分转换为张量
    inputs = [torch.tensor(ex[0]) for ex in examples]
    # 将每个样本的目标部分转换为长整型张量
    targets = torch.tensor([ex[1] for ex in examples], dtype=torch.long)
    # 对batch内的样本进行padding,使其具有相同长度
    inputs = pad_sequence(inputs, batch_first=True)
    # 返回处理后的输入、长度和目标
    return inputs, lengths, targets

# 在 DataLoader 中使用自定义 collate_fn
dataloader = DataLoader(dataset, batch_size=32, collate_fn=my_collate_fn)
2. 自定义采样策略

当需要非均匀采样(如类别平衡)时,可以使用自定义 Sampler:

from torch.utils.data import WeightedRandomSampler

# 假设样本权重(处理类别不平衡)
weights = torch.tensor([3.0, 1.0, 3.0, 1.0])  # 为每个样本分配权重
sampler = WeightedRandomSampler(weights, num_samples=4, replacement=True)

dataloader = DataLoader(dataset, batch_size=2, sampler=sampler)

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### PyTorch 学习笔记概述 李毅编写的《PyTorch学习笔记》是一份详尽的学习指南,旨在帮助读者掌握深度学习框架PyTorch的核心概念和技术。这份笔记不仅涵盖了基础理论知识,还提供了大量实践案例和代码实现。 #### 主要内容结构 1. **环境搭建** 安装配置PyTorch运行所需的软件环境,包括Python版本的选择、CUDA支持以及Anaconda的使用方法[^2]。 2. **张量操作** 解释了如何创建、转换和处理多维数组(即张量),这是构建神经网络模型的基础构件之一[^3]. 3. **自动求导机制** 描述了Autograd模块的工作原理及其在反向传播算法中的应用,使用户能够轻松定义复杂的计算图并高效训练模型[^4]. 4. **优化器与损失函数** 探讨了几种常用的梯度下降变体(SGD, Adam等)及相应的损失衡量标准(MSE Loss, CrossEntropyLoss等),这些组件对于调整权重参数至关重要[^5]. 5. **数据加载与预处理** 展示了Dataset类和DataLoader类的功能特性,它们可以简化大规模图像分类任务的数据读取流程;同时也介绍了常见的图片增强技术来扩充样本集规模[^6]. 6. **卷积神经网络(CNN)** 结合具体实例深入剖析CNN架构设计思路,如LeNet,VGG,resnet系列,并给出完整的项目源码供参考学习[^7]. 7. **循环神经网络(RNN/LSTM/GRU)** 阐述时间序列预测场景下RNN家族成员的特点优势,通过手写字符识别实验验证其有效性[^8]. 8. **迁移学习实战演练** 利用预训练好的大型模型作为特征提取器,在新领域内快速建立高性能的应用程序,减少重复劳动成本的同时提高了泛化能力[^9]. 9. **分布式训练入门指导** 当面对超大数据集时,单机难以满足需求,此时可借助于torch.distributed包来进行集群式的协同工作模式探索[^10]. ```python import torch from torchvision import datasets, transforms transform = transforms.Compose([transforms.ToTensor()]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) for images, labels in train_loader: print(images.shape) break ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值