Creación y uso de Data Loaders en PyTorch

Clase 14 de 24Curso de Redes Neuronales con PyTorch

Resumen

¿Qué es un Data Loader y cuál es su función en PyTorch?

Los Data Loaders en PyTorch son herramientas esenciales para el procesamiento eficiente de grandes conjuntos de datos. Estos permiten dividir datasets extensos en pequeños lotes llamados "batches". Esta estrategia no solo optimiza el uso de la memoria, sino que también faciilta el paralelismo a través de múltiples GPUs, si es necesario. Al dividir el dataset, los Data Loaders permiten que el entrenamiento de modelos sea más manejable y escalable.

¿Cómo se define un Data Loader en PyTorch?

Para definir un Data Loader en PyTorch, se requieren importar ciertas librerías y planificar varios pasos. A continuación, se expone cómo proceder:

  1. Importación de la librería:

    from torch.utils.data import DataLoader
    

    Esto permite el acceso al objeto DataLoader para su uso posterior.

  2. Definición del dataset: Se utiliza un dataset de entrenamiento, en este caso un iterador llamado trainIter del dataset DBpedia, especificando su uso para el set de entrenamiento:

    trainIter = DBpedia(split='train')
    
  3. Creación del Data Loader: Aquí se establece el tamaño del lote, se elige si se quiere aleatorizar la secuencia de los datos (shuffling) y se selecciona una función collate:

    data_loader = DataLoader(dataset=trainIter, batch_size=8, shuffle=False, collate_fn=collateBatch)
    

¿Cómo definimos una función collate para recopilar los datos?

La función collate, denominada aquí collateBatch, es crucial para combinar los datos de los lotes. Esta función permite agrupar diferentes elementos del dataset en un único tensor manejable. A continuación se explica cómo implementarla:

  1. Configuración del dispositivo: Determina si se usará CPU o GPU (CUDA) según la disponibilidad.

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    
  2. Definición de collateBatch: Desarrollar una función collateBatch para procesar cada lote.

    def collateBatch(batch):
        label_list, text_list, offsets = [], [], [0]
        for (_label, _text) in batch:
            label_list.append(label_pipeline(_label))
            processed_text = torch.tensor(text_pipeline(_text), dtype=torch.int64)
            text_list.append(processed_text)
            offsets.append(processed_text.size(0) + offsets[-1])
        
        label_list = torch.tensor(label_list, dtype=torch.int64).to(device)
        text_list = torch.cat(text_list).to(device)
        offsets = torch.tensor(offsets[:-1]).to(device)
        return label_list, text_list, offsets
    
    • Listas vacías: Se declaran listas vacías label_list, text_list, y una lista offsets inicializada en 0.
    • Recorrido de batch: Se itera sobre cada texto, obteniendo y procesando etiquetas y textos para almacenarlos adecuadamente.
    • Transformación a tensores: Las listas se convierten a tensores adecuados para PyTorch y se llevan al dispositivo correspondiente (CPU o CUDA).

¿Cómo mejora la suma acumulativa cumsum el manejo de datos?

La función cumsum en PyTorch proporciona la suma acumulativa de los elementos a lo largo de una dimensión especificada. En este contexto, se utiliza para determinar los puntos de inicio de cada nuevo texto dentro del tensor de datos concatenados. Este método es vital para gestionar adecuadamente el flujo de datos en estructuras de texto:

  • Función cumsum:
    offsets = torch.tensor(offsets[:-1]).cumsum(dim=0).to(device)
    
    Al aplicar cumsum, se asegura que cada elemento en offsets indique el comienzo del siguiente texto en la fila de datos concatenados.

El uso de Data Loaders es una técnica poderosa que merece ser dominada para optimizar el rendimiento en proyectos de machine learning y deep learning. Aprender y practicar su implementación expandirá tus habilidades y te permitirá abordar proyectos más avanzados con confianza. ¡Sigue aprendiendo e investigando!