Carregamento de Dados com torch.utils.data

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)

Tags: Pytorch DataLoader DataSet IterableDataset Sampler

Publicado em 7-13 13:47