Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

PyTorch desde cero, Unidad 12 — Mini-proyecto con PyTorch, 12.1 — Proyecto guiado completo ·

Construcción del modelo

Construcción del modelo

Introducción

La construcción del modelo es un paso fundamental en cualquier proyecto de aprendizaje automático. Es aquí donde transformamos nuestras ideas y suposiciones sobre cómo los datos podrían ser procesados para aprender características relevantes e inferir resultados. Este proceso implica definir la arquitectura del modelo, seleccionar las capas adecuadas, ajustar hiperparámetros y configurar el flujo de datos. En este artículo, exploraremos cómo construir un modelo en PyTorch siguiendo una estructura paso a paso.

Explicación principal

Para ilustrar este proceso, consideremos un ejemplo simple donde queremos construir un clasificador para reconocer imágenes de gatos y perros. Vamos a seguir los siguientes pasos:

Definición del problema

Nuestro objetivo es entrenar una red neuronal que pueda distinguir entre imágenes de gatos y perros con alta precisión.

Preparación de datos

Primero, necesitamos un conjunto de datos etiquetado que contenga imágenes de gatos y perros. Usaremos torchvision.datasets para cargar los datos en PyTorch.

import torch
from torchvision import datasets, transforms

# Definir la transformación a aplicar sobre las imágenes
transform = transforms.Compose([
    transforms.Resize((256, 256)),   # Ajustar el tamaño de las imágenes
    transforms.ToTensor(),          # Convertir las imágenes a tensores
    transforms.Normalize(mean=[0.5], std=[0.5])     # Normalización de los datos
])

# Cargar los conjuntos de entrenamiento y prueba
train_dataset = datasets.ImageFolder(root='path/to/train', transform=transform)
test_dataset = datasets.ImageFolder(root='path/to/test', transform=transform)

# Crear DataLoaders para cargar los datos en mini-batches
batch_size = 32
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

Construcción del modelo

Ahora que tenemos nuestros datos listos para ser procesados por el modelo, podemos definir nuestra arquitectura. En este ejemplo, usaremos una red neuronal simple con dos capas ocultas.

import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(64 * 64 * 64, 128)   # Ajuste a las dimensiones de la salida
        self.fc2 = nn.Linear(128, 2)              # Salida binaria (gato/perro)

    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = torch.flatten(x, 1)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleCNN()

Configuración del entrenamiento

Definimos el optimizador y la función de pérdida. Usaremos Adam como optimizador debido a su eficiencia en la mayoría de los casos.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()  # Función de pérdida adecuada para clasificación multiclase
optimizer = optim.Adam(model.parameters(), lr=0.001)

Entrenamiento del modelo

Finalmente, podemos entrenar nuestro modelo utilizando un ciclo de entrenamiento personalizado.

def train_model(model, criterion, optimizer, dataloader, num_epochs=25):
    model.train()
    for epoch in range(num_epochs):
        running_loss = 0.0
        for inputs, labels in dataloader:
            optimizer.zero_grad()   # Cero los gradientes
            outputs = model(inputs) # Forward pass
            loss = criterion(outputs, labels)   # Calcular la pérdida
            loss.backward()              # Backward pass
            optimizer.step()             # Actualizar pesos

        print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(dataloader):.4f}")

train_model(model, criterion, optimizer, train_loader)

Errores típicos / trampas

  1. Overfitting: Asegúrate de validar tu modelo regularmente para evitar el overfitting.
  2. Dimensión incorrecta en las capas lineales: Verifica que los tamaños de entrada y salida de cada capa sean consistentes.
  3. Inicialización de pesos inadecuada: Usar inicializaciones como Xavier o He puede mejorar la convergencia del entrenamiento.

Checklist accionable

  • Asegúrate de normalizar tus datos antes de ingresarlos al modelo.
  • Verifica que los tamaños de las imágenes sean consistentes en ambos conjuntos de entrenamiento y prueba.
  • Define correctamente el flujo de datos para evitar errores durante la carga de los datos.
  • Configura adecuadamente la función de pérdida y el optimizador.
  • Realiza validaciones regulares durante el entrenamiento.

Siguientes pasos

  1. Optimización del modelo: Ajusta hiperparámetros como tamaño de mini-lote, learning rate o arquitectura del modelo para mejorar su rendimiento.
  2. Integración de regularización: Incluye técnicas como dropout para evitar el overfitting.
  3. Validación cruzada: Utiliza validaciones cruzadas para obtener una estimación más precisa del rendimiento del modelo en datos no vistos.

Siguiendo estos pasos, podrás construir modelos robustos y efectivos en PyTorch.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).