Introdução ao DataLoader
A classe torch.utils.data.DataLoader é o núcleo do utilitário de carregamento de dados no PyTorch. Representa um iterador Python sobre conjuntos de dados com suporte para:
- Conjuntos de estilo mapeável e iterável
- Ordenação personalizada de carregamento
- Agrupametno automático
- Carregamento monoprossesso e multiprocesso
- Fixagem de memória
DataLoader(conjunto, tamanho_lote=1, embaralhar=False, amostrador=None,
amostrador_lote=None, num_trabalhadores=0, funcao_colacao=None,
fixar_memoria=False, descartar_ultimo=False, tempo_limite=0,
funcao_inic_trab=None)
Tipos de Conjuntos de Dados
Cojnuntos estilo mapeável: Implementam __getitem__() e __len__(), permitindo acesso direto via índices.
Conjuntos estilo iterável: Implementam __iter__(), ideais para fluxos contínuos de dados como streams de banco de dados.
Ordenação de Carregamento e Amostradores
Para conjuntos iteráveis, a ordem é definida pelo usuário. Para conjuntos mapeáveis, a classe Sampler controla a ordem dos índices.
Carregamento em Lotes
Agrupamento automático: Ativado quando tamanho_lote é definido. Exemplo de funcionamento:
for indices in amostrador_lote:
yield funcao_colacao([conjunto[i] for i in indices])
Sem agrupamento: Quando tamanho_lote e amostrador_lote são None:
for indice in amostrador:
yield funcao_colacao(conjunto[indice])
Carregamento Multiprocesso
Ativado com num_trabalhadores > 0. Cada processo worker possui cópia independente do conjunto:
# Configuração manual por worker
def configurar_worker(id_trab):
info = torch.utils.data.get_worker_info()
# Configurar subconjunto de dados
Fixagem de Memória
Ativada com fixar_memoria=True, acelera transferência para GPUs CUDA:
class LoteCustomizado:
def fixar_memoria(self):
self.entrada = self.entrada.pin_memory()
self.alvo = self.alvo.pin_memory()
return self
Classe DataLoader
class DataLoader:
def __init__(self, conjunto, tamanho_lote=1, embaralhar=False,
amostrador=None, amostrador_lote=None, num_trabalhadores=0,
funcao_colacao=None, fixar_memoria=False, descartar_ultimo=False,
tempo_limite=0, funcao_inic_trab=None):
Classe Dataset
Classe abstrata para conjuntos mapeáveis. Exemplo de implementação:
class ConjuntoImagens(Dataset):
def __getitem__(self, indice):
return imagem, rotulo
def __len__(self):
return num_amostras
Classe IterableDataset
Para conjuntos de dados iteráveis. Exemplo com divisão entre workers:
class ConjuntoIteravel(IterableDataset):
def __iter__(self):
info = get_worker_info()
if info:
# Dividir carga de trabalho
return iter(faixa_local)
Utilitários Adicionais
TensorDataset
dados = TensorDataset(tensor1, tensor2)
ConcatDataset
conjunto_combinado = ConcatDataset([conjunto1, conjunto2])
random_split
subconjunto1, subconjunto2 = random_split(conjunto, [tam1, tam2])
Amostradores
seq_sampler = SequentialSampler(conjunto)
rand_sampler = RandomSampler(conjunto, reposicao=True)
amostrador_peso = WeightedRandomSampler(pesos, num_amostras)