Datasets y DataLoaders
Los Dataset y DataLoader de PyTorch alimentan los bucles de entrenamiento con datos agrupados, mezclados y opcionalmente aumentados. Las pipelines de entrada eficientes mantienen la GPU ocupada y el entrenamiento rápido.
Busca en todas las páginas de la documentación
Los Dataset y DataLoader de PyTorch alimentan los bucles de entrenamiento con datos agrupados, mezclados y opcionalmente aumentados. Las pipelines de entrada eficientes mantienen la GPU ocupada y el entrenamiento rápido.
Tarjeta de referencia rápida - lista para copiar y pegar.
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)Cuándo usar esto:
collate_fn personalizada.pin_memory y non_blocking."""datasets_dataloaders.py - Dataset y DataLoader personalizados para datos 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,)
passLo que esto demuestra:
Dataset personalizado con __len__ y __getitem__.random_split para la partición de entrenamiento/validación.DataLoader maneja la agrupación y la mezcla.pin_memory=True acelera la transferencia de CPU a GPU cuando CUDA está disponible.Dataset.__getitem__(i) devuelve una muestra; DataLoader recopila batch_size muestras.shuffle=True aleatoriza el orden cada época.num_workers inicia subprocesos para la carga paralela de datos.collate_fn personaliza cómo se fusionan las muestras en un lote (relleno para secuencias).IterableDataset transmite datos para fuentes muy grandes o en línea.| Parámetro | Efecto | Valor Típico |
|---|---|---|
batch_size | Muestras por lote | 32-256 (dependiente de la memoria de la GPU) |
shuffle | Aleatorizar orden | True para entrenamiento |
num_workers | Cargadores paralelos | 4-8 en multinúcleo |
pin_memory | Memoria de host bloqueada por página | True con CUDA |
drop_last | Descartar el último lote incompleto | True para entrenamiento de BatchNorm |
from torchvision import datasets, transforms
# Conjunto de datos de imágenes incorporado con transformaciones
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 en notebooks; usar scripts para carga paralela.pin_memory=True y non_blocking=True en .to(device).__getitem__, archivos con mapeo de memoria o IterableDataset.__getitem__.shuffle=False para los cargadores de validación/prueba.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
DataLoader | Entrenamiento por lotes estándar | Transmisión de datos infinitos (usar IterableDataset) |
torchvision.datasets | Benchmarks de imágenes comunes | Formatos de datos personalizados |
HuggingFace datasets | Datasets de NLP/texto | Clasificación de imágenes simple |
| WebDataset | Entrenamiento a gran escala en la web | Datasets locales pequeños |
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 hasta que la CPU esté saturada.pin_memory=True con CUDA.DataLoader(ds, num_workers=4, persistent_workers=True)__getitem__ o precargar en __init__ para datos pequeños.__getitem__.__getitem__).shuffle - implementar la mezcla en el iterador o búfer.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 no tiene efecto en MPS; use device="mps".num_workers=0 vs 4 para aislar E/S frente a cómputo.__getitem__ realiza un trabajo pesado (decodificación de imágenes sobre la marcha).Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 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+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026