En este tema, aprenderemos a construir una red neuronal simple utilizando PyTorch. Este es un paso fundamental para cualquier persona que desee trabajar con redes neuronales, ya que proporciona una base sólida sobre la cual se pueden construir modelos más complejos.
Objetivos
- Entender la estructura básica de una red neuronal.
- Aprender a definir una red neuronal en PyTorch.
- Implementar una red neuronal simple y entrenarla con datos de ejemplo.
- Estructura Básica de una Red Neuronal
Una red neuronal típica consta de:
- Capas de entrada: Reciben los datos de entrada.
- Capas ocultas: Procesan los datos mediante operaciones matemáticas.
- Capas de salida: Producen la salida final del modelo.
- Definiendo una Red Neuronal en PyTorch
En PyTorch, las redes neuronales se definen utilizando la clase torch.nn.Module
. A continuación, se muestra cómo definir una red neuronal simple con una capa oculta.
Paso 1: Importar las Bibliotecas Necesarias
Paso 2: Definir la Red Neuronal
class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(784, 128) # Capa oculta con 128 neuronas self.fc2 = nn.Linear(128, 10) # Capa de salida con 10 neuronas (para 10 clases) def forward(self, x): x = F.relu(self.fc1(x)) # Función de activación ReLU x = self.fc2(x) return x
Explicación del Código
nn.Linear(784, 128)
: Define una capa totalmente conectada con 784 entradas y 128 salidas.F.relu
: Aplica la función de activación ReLU.nn.Linear(128, 10)
: Define una capa totalmente conectada con 128 entradas y 10 salidas.
- Entrenando la Red Neuronal
Paso 1: Preparar los Datos
Para este ejemplo, utilizaremos el conjunto de datos MNIST, que contiene imágenes de dígitos escritos a mano.
from torchvision import datasets, transforms transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
Paso 2: Definir la Función de Pérdida y el Optimizador
model = SimpleNN() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01)
Paso 3: Entrenar el Modelo
epochs = 5 for epoch in range(epochs): running_loss = 0 for images, labels in trainloader: images = images.view(images.shape[0], -1) # Aplanar las imágenes optimizer.zero_grad() # Limpiar los gradientes output = model(images) # Forward pass loss = criterion(output, labels) # Calcular la pérdida loss.backward() # Backward pass optimizer.step() # Actualizar los pesos running_loss += loss.item() print(f"Epoch {epoch+1} - Loss: {running_loss/len(trainloader)}")
Explicación del Código
images.view(images.shape[0], -1)
: Aplana las imágenes de 28x28 a un vector de 784 elementos.optimizer.zero_grad()
: Limpia los gradientes acumulados.model(images)
: Realiza el forward pass.criterion(output, labels)
: Calcula la pérdida.loss.backward()
: Realiza el backward pass.optimizer.step()
: Actualiza los pesos del modelo.
Ejercicio Práctico
Ejercicio
Modifica la red neuronal para que tenga dos capas ocultas en lugar de una. La primera capa oculta debe tener 256 neuronas y la segunda 128 neuronas.
Solución
class ModifiedNN(nn.Module): def __init__(self): super(ModifiedNN, self).__init__() self.fc1 = nn.Linear(784, 256) # Primera capa oculta con 256 neuronas self.fc2 = nn.Linear(256, 128) # Segunda capa oculta con 128 neuronas self.fc3 = nn.Linear(128, 10) # Capa de salida con 10 neuronas def forward(self, x): x = F.relu(self.fc1(x)) # Función de activación ReLU x = F.relu(self.fc2(x)) # Función de activación ReLU x = self.fc3(x) return x
Conclusión
En esta sección, hemos aprendido a definir y entrenar una red neuronal simple utilizando PyTorch. Hemos cubierto los conceptos básicos de las redes neuronales y cómo implementarlas en código. En el próximo módulo, profundizaremos en las funciones de activación y cómo afectan el rendimiento de nuestras redes neuronales.
PyTorch: De Principiante a Avanzado
Módulo 1: Introducción a PyTorch
- ¿Qué es PyTorch?
- Configuración del Entorno
- Operaciones Básicas con Tensores
- Autograd: Diferenciación Automática
Módulo 2: Construcción de Redes Neuronales
- Introducción a las Redes Neuronales
- Creación de una Red Neuronal Simple
- Funciones de Activación
- Funciones de Pérdida y Optimización
Módulo 3: Entrenamiento de Redes Neuronales
- Carga y Preprocesamiento de Datos
- Bucle de Entrenamiento
- Validación y Pruebas
- Guardar y Cargar Modelos
Módulo 4: Redes Neuronales Convolucionales (CNNs)
- Introducción a las CNNs
- Construcción de una CNN desde Cero
- Aprendizaje por Transferencia con Modelos Preentrenados
- Ajuste Fino de CNNs
Módulo 5: Redes Neuronales Recurrentes (RNNs)
- Introducción a las RNNs
- Construcción de una RNN desde Cero
- Redes de Memoria a Largo Plazo (LSTM)
- Unidades Recurrentes con Puerta (GRUs)
Módulo 6: Temas Avanzados
- Redes Generativas Antagónicas (GANs)
- Aprendizaje por Refuerzo con PyTorch
- Despliegue de Modelos PyTorch
- Optimización del Rendimiento