Datasets & DataLoaders
PyTorch Dataset e DataLoader alimentam loops de treinamento com dados agrupados, embaralhados e opcionalmente aumentados. Pipelines de entrada eficientes mantêm a GPU ocupada e o treinamento rápido.
Busque em todas as páginas da documentação
PyTorch Dataset e DataLoader alimentam loops de treinamento com dados agrupados, embaralhados e opcionalmente aumentados. Pipelines de entrada eficientes mantêm a GPU ocupada e o treinamento rápido.
Cartão de referência rápida - pronto para copiar e colar.
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
loader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=4, pin_memory=True)
for batch_x, batch_y in loader:
batch_x = batch_x.to(device, non_blocking=True)Quando usar isso:
collate_fn personalizado.pin_memory e non_blocking."""datasets_dataloaders.py - Dataset e DataLoader personalizados para dados CSV."""
from __future__ import annotations
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader, random_split
class TabularDataset(Dataset):
def __init__(self, df: pd.DataFrame, feature_cols: list[str], target_col: str):
self.X = torch.tensor(df[feature_cols].values, dtype=torch.float32)
self.y = torch.tensor(df[target_col].values, dtype=torch.long)
def __len__(self) -> int:
return len(self.y)
def __getitem__(self, idx: int) -> tuple[torch.Tensor, torch.Tensor]:
return self.X[idx], self.y[idx]
df = pd.read_csv("train.csv")
dataset = TabularDataset(df, feature_cols=["f1", "f2", "f3"], target_col="label")
train_size = int(0.8 * len(dataset))
train_ds, val_ds = random_split(dataset, [train_size, len(dataset) - train_size])
train_loader = DataLoader(train_ds, batch_size=128, shuffle=True, num_workers=2, pin_memory=True)
val_loader = DataLoader(val_ds, batch_size=256, shuffle=False, num_workers=2)
for epoch in range(3):
for x_batch, y_batch in train_loader:
# x_batch: (128, 3), y_batch: (128,)
passO que isso demonstra:
Dataset personalizado com __len__ e __getitem__.random_split para partição de treino/validação.DataLoader lida com agrupamento e embaralhamento.pin_memory=True acelera a transferência CPU-GPU quando CUDA está disponível.Dataset.__getitem__(i) retorna uma amostra; DataLoader coleta batch_size amostras.shuffle=True randomiza a ordem a cada época.num_workers inicia subprocessos para carregamento paralelo de dados.collate_fn personaliza como as amostras são mescladas em um lote (preenchimento para sequências).IterableDataset transmite dados para fontes muito grandes ou online.| Parâmetro | Efeito | Valor Típico |
|---|---|---|
batch_size | Amostras por lote | 32-256 (dependente da memória da GPU) |
shuffle | Randomizar ordem | True para treinamento |
num_workers | Carregadores paralelos | 4-8 em multi-core |
pin_memory | Memória host travada (page-locked) | True com CUDA |
drop_last | Descartar o último lote incompleto | True para treinamento BatchNorm |
from torchvision import datasets, transforms
# Dataset de imagem integrado com transforms
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
train_set = datasets.CIFAR10(root="./data", train=True, download=True, transform=transform)num_workers=0 em notebooks; usar scripts para carregamento paralelo.pin_memory=True e non_blocking=True em .to(device).__getitem__, arquivos com mapeamento de memória ou IterableDataset.__getitem__.shuffle=False para loaders de validação/teste.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
DataLoader | Treinamento em lote padrão | Transmitir dados infinitos (usar IterableDataset) |
torchvision.datasets | Benchmarks comuns de imagem | Formatos de dados personalizados |
HuggingFace datasets | Datasets de NLP/texto | Classificação de imagem simples |
| WebDataset | Treinamento em larga escala na web | Pequenos datasets locais |
def pad_collate(batch):
xs, ys = zip(*batch)
lengths = [len(x) for x in xs]
padded = torch.nn.utils.rnn.pad_sequence(xs, batch_first=True)
return padded, torch.tensor(ys), torch.tensor(lengths)
loader = DataLoader(ds, collate_fn=pad_collate)num_workers até que a CPU esteja saturada.pin_memory=True com CUDA.DataLoader(ds, num_workers=4, persistent_workers=True)__getitem__ ou pré-carregue em __init__ para dados pequenos.__getitem__.__getitem__).shuffle - implemente o embaralhamento no iterador ou buffer.generator = torch.Generator().manual_seed(42)
loader = DataLoader(ds, shuffle=True, generator=generator)from torch.utils.data import WeightedRandomSampler
sampler = WeightedRandomSampler(weights, num_samples=len(weights))
loader = DataLoader(ds, sampler=sampler)pin_memory não tem efeito no MPS - use device="mps".num_workers=0 vs 4 para isolar I/O vs computação.__getitem__ realiza trabalho pesado (decodificação de imagens em tempo real).Versões da Stack: Esta página foi escrita para Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026