Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

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

Entrenamiento y evaluación

Entrenamiento y evaluación

Introducción

En la construcción de modelos de Deep Learning, el entrenamiento y la evaluación son etapas cruciales que permiten asegurar que nuestro modelo esté funcionando correctamente. Durante el entrenamiento, ajustamos los parámetros del modelo para minimizar una función de pérdida, mientras que durante la evaluación, comprobamos cómo se comporta el modelo en datos no vistos y ajustamos nuestros hiperparámetros según sea necesario. Este artículo te guiará a través de estos procesos, proporcionando consejos prácticos y algunos errores comunes para evitar.

Explicación principal con ejemplos

Definición del problema

Para comenzar, debes definir claramente el problema que estás tratando de resolver. En este ejemplo, asumiremos que estamos construyendo un modelo de clasificación binaria para identificar imágenes de gatos y perros.

import torch
from torchvision import datasets, transforms

# Definición del conjunto de datos
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
train_dataset = datasets.ImageFolder(root='./data/train', transform=transform)
test_dataset = datasets.ImageFolder(root='./data/test', transform=transform)

# Crear los dataloaders
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32)

Construcción del modelo

Usaremos una arquitectura simple para este ejemplo.

import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc = nn.Linear(16 * 56 * 56, 2)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(-1, 16 * 56 * 56)
        return self.fc(x)

model = SimpleCNN()

Entrenamiento del modelo

Durante el entrenamiento, debes ajustar los parámetros del modelo para minimizar la función de pérdida.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

num_epochs = 25

for epoch in range(num_epochs):
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss / len(train_loader)}")

Evaluación del modelo

Una vez que hayas entrenado el modelo, es crucial evaluar su rendimiento en datos no vistos.

def evaluate(model, dataloader):
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for inputs, labels in dataloader:
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print(f"Accuracy: {100 * correct / total}%")

evaluate(model, test_loader)

Errores típicos / trampas

  1. Overfitting: Asegúrate de que el modelo no esté memorizando los datos de entrenamiento. Esto puede ocurrir si tu conjunto de datos es pequeño.
  2. Balanceo de clases: Si tus clases están desequilibradas, asegúrate de ajustar la función de pérdida adecuadamente para evitar sesgos en el modelo.
  3. Entrenamiento insuficiente / exceso de entrenamiento: Asegúrate de entrenar por un número suficiente de épocas y no sobreentrenar.

Checklist accionable

  1. Definir claramente el problema que estás tratando de resolver.
  2. Preparar adecuadamente los datos, incluyendo la normalización y el reescalamiento.
  3. Elegir una arquitectura adecuada basada en el tipo de tarea y el tamaño del conjunto de datos.
  4. Configurar la función de pérdida apropiadamente para tu problema, especialmente si las clases están desequilibradas.
  5. Usar un optimizador efectivo, como Adam o SGD con momentum.
  6. Implementar validación cruzada para evaluar el rendimiento en datos no vistos durante el entrenamiento.
  7. Monitorear los resultados y ajustar hiperparámetros según sea necesario.
  8. Evitar overfitting usando técnicas como dropout o regularización L2.
  9. Guardar y cargar modelos para continuar el entrenamiento en caso de interrupciones.

Cierre

En resumen, el entrenamiento y la evaluación son etapas fundamentales en el proceso de desarrollo de modelos de Deep Learning. Es importante definir claramente los problemas a resolver, preparar adecuadamente los datos, elegir arquitecturas y hiperparámetros apropiados, y monitorizar constantemente los resultados para asegurar un rendimiento óptimo.

Siguientes pasos

  • Explorar técnicas avanzadas como transfer learning o fine-tuning para mejorar el rendimiento.
  • Aprender sobre arquitecturas especializadas, como CNNs en imágenes o modelos LSTM en NLP.
  • Profundizar en la regularización y la optimización de los modelos.

¡Sigue avanzando en tu viaje hacia la inteligencia artificial!

Contacto

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