En este módulo, aprenderemos cómo cargar y preprocesar datos en PyTorch, una habilidad esencial para preparar nuestros datos antes de entrenar modelos de aprendizaje profundo. Este proceso incluye la lectura de datos desde diversas fuentes, su transformación y la creación de conjuntos de datos y cargadores de datos (DataLoaders) en PyTorch.

Contenido

Introducción a la Carga de Datos

PyTorch proporciona varias utilidades para cargar y preprocesar datos. La clase Dataset y el módulo DataLoader son fundamentales para manejar datos de manera eficiente.

Dataset

La clase Dataset es una abstracción que representa un conjunto de datos. PyTorch proporciona algunas implementaciones listas para usar, como torchvision.datasets para datos de imágenes.

DataLoader

El DataLoader es una clase que permite iterar sobre un Dataset de manera eficiente, manejando el batching, el shuffling y la carga en paralelo.

Transformaciones de Datos

Las transformaciones son operaciones que se aplican a los datos antes de ser utilizados en el entrenamiento. PyTorch proporciona el módulo torchvision.transforms para realizar transformaciones comunes en imágenes.

Ejemplo de Transformaciones

import torchvision.transforms as transforms

transform = transforms.Compose([
    transforms.Resize((128, 128)),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

En este ejemplo, las transformaciones incluyen:

  • Resize: Cambia el tamaño de la imagen a 128x128 píxeles.
  • ToTensor: Convierte la imagen a un tensor.
  • Normalize: Normaliza los valores de los píxeles.

Creación de Conjuntos de Datos Personalizados

A veces, necesitamos crear nuestros propios conjuntos de datos personalizados. Para ello, debemos heredar de la clase Dataset y sobrescribir los métodos __len__ y __getitem__.

Ejemplo de Dataset Personalizado

import torch
from torch.utils.data import Dataset
from PIL import Image
import os

class CustomDataset(Dataset):
    def __init__(self, image_dir, transform=None):
        self.image_dir = image_dir
        self.transform = transform
        self.image_names = os.listdir(image_dir)

    def __len__(self):
        return len(self.image_names)

    def __getitem__(self, idx):
        img_name = os.path.join(self.image_dir, self.image_names[idx])
        image = Image.open(img_name)
        if self.transform:
            image = self.transform(image)
        return image

En este ejemplo:

  • __init__: Inicializa el dataset con la ruta de las imágenes y las transformaciones.
  • __len__: Devuelve el número de imágenes en el dataset.
  • __getitem__: Carga y devuelve una imagen transformada.

Uso de DataLoaders

El DataLoader facilita la iteración sobre el dataset, manejando el batching y el shuffling.

Ejemplo de DataLoader

from torch.utils.data import DataLoader

dataset = CustomDataset(image_dir='path/to/images', transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

for batch in dataloader:
    # Procesar el batch
    pass

En este ejemplo:

  • batch_size: Número de muestras por batch.
  • shuffle: Si se deben mezclar los datos.
  • num_workers: Número de subprocesos para cargar los datos.

Ejercicio Práctico

Ejercicio

Crea un dataset personalizado para un conjunto de imágenes y utiliza un DataLoader para iterar sobre él. Aplica las siguientes transformaciones: redimensionar a 64x64 píxeles, convertir a tensor y normalizar.

Solución

import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from PIL import Image
import os

# Definir transformaciones
transform = transforms.Compose([
    transforms.Resize((64, 64)),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# Definir dataset personalizado
class CustomDataset(Dataset):
    def __init__(self, image_dir, transform=None):
        self.image_dir = image_dir
        self.transform = transform
        self.image_names = os.listdir(image_dir)

    def __len__(self):
        return len(self.image_names)

    def __getitem__(self, idx):
        img_name = os.path.join(self.image_dir, self.image_names[idx])
        image = Image.open(img_name)
        if self.transform:
            image = self.transform(image)
        return image

# Crear dataset y dataloader
dataset = CustomDataset(image_dir='path/to/images', transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

# Iterar sobre el dataloader
for batch in dataloader:
    print(batch.size())  # Imprimir el tamaño del batch

Conclusión

En esta sección, hemos aprendido cómo cargar y preprocesar datos en PyTorch utilizando Dataset y DataLoader. También hemos visto cómo aplicar transformaciones a los datos y crear conjuntos de datos personalizados. Estos conceptos son fundamentales para preparar los datos antes de entrenar modelos de aprendizaje profundo. En el próximo módulo, exploraremos el bucle de entrenamiento y cómo validar y probar nuestros modelos.

© Copyright 2024. Todos los derechos reservados