En este tema, aprenderemos cómo guardar y cargar modelos en PyTorch. Esta es una habilidad crucial para cualquier proyecto de aprendizaje profundo, ya que permite guardar el estado de un modelo entrenado y reutilizarlo más tarde sin tener que volver a entrenarlo desde cero.
Conceptos Clave
- Estado del Modelo (
state_dict
): En PyTorch, el estado del modelo se guarda en un diccionario llamadostate_dict
. Este diccionario contiene todos los parámetros del modelo (pesos y sesgos). - Guardar el Modelo: Utilizamos la función
torch.save
para guardar elstate_dict
del modelo en un archivo. - Cargar el Modelo: Utilizamos la función
torch.load
para cargar elstate_dict
desde un archivo y la funciónload_state_dict
para actualizar el modelo con los parámetros cargados.
Guardar el Modelo
Para guardar un modelo en PyTorch, seguimos estos pasos:
- Entrenar el Modelo: Entrena tu modelo como lo harías normalmente.
- Guardar el
state_dict
: Utilizatorch.save
para guardar elstate_dict
del modelo.
Ejemplo Práctico
import torch import torch.nn as nn import torch.optim as optim # Definimos una red neuronal simple class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(10, 50) self.fc2 = nn.Linear(50, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # Inicializamos el modelo, el optimizador y la función de pérdida model = SimpleNN() optimizer = optim.SGD(model.parameters(), lr=0.01) criterion = nn.MSELoss() # Simulamos un entrenamiento for epoch in range(100): # Aquí iría el código de entrenamiento pass # Guardamos el estado del modelo torch.save(model.state_dict(), 'model.pth') print("Modelo guardado en 'model.pth'")
Cargar el Modelo
Para cargar un modelo en PyTorch, seguimos estos pasos:
- Crear una Instancia del Modelo: Crea una instancia del modelo que tenga la misma arquitectura que el modelo guardado.
- Cargar el
state_dict
: Utilizatorch.load
para cargar elstate_dict
desde el archivo yload_state_dict
para actualizar el modelo.
Ejemplo Práctico
# Creamos una nueva instancia del modelo model = SimpleNN() # Cargamos el estado del modelo model.load_state_dict(torch.load('model.pth')) print("Modelo cargado desde 'model.pth'") # Ahora el modelo está listo para ser usado model.eval() # Ponemos el modelo en modo de evaluación
Ejercicio Práctico
Ejercicio 1: Guardar y Cargar un Modelo
- Entrena un modelo simple: Usa cualquier conjunto de datos pequeño para entrenar un modelo simple.
- Guarda el modelo: Guarda el
state_dict
del modelo en un archivo. - Cargar el modelo: Carga el
state_dict
desde el archivo y verifica que el modelo cargado produce las mismas predicciones que el modelo original.
Solución
import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # Generamos datos de ejemplo X, y = make_regression(n_samples=1000, n_features=10, noise=0.1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Normalizamos los datos scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # Convertimos los datos a tensores X_train = torch.tensor(X_train, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1) X_test = torch.tensor(X_test, dtype=torch.float32) y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1) # Definimos una red neuronal simple class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(10, 50) self.fc2 = nn.Linear(50, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # Inicializamos el modelo, el optimizador y la función de pérdida model = SimpleNN() optimizer = optim.SGD(model.parameters(), lr=0.01) criterion = nn.MSELoss() # Entrenamos el modelo for epoch in range(100): model.train() optimizer.zero_grad() outputs = model(X_train) loss = criterion(outputs, y_train) loss.backward() optimizer.step() # Guardamos el estado del modelo torch.save(model.state_dict(), 'model.pth') # Creamos una nueva instancia del modelo model_loaded = SimpleNN() # Cargamos el estado del modelo model_loaded.load_state_dict(torch.load('model.pth')) # Verificamos que el modelo cargado produce las mismas predicciones model_loaded.eval() with torch.no_grad(): original_outputs = model(X_test) loaded_outputs = model_loaded(X_test) print("Diferencia entre las predicciones del modelo original y el cargado:", torch.sum(original_outputs - loaded_outputs).item())
Conclusión
En esta sección, hemos aprendido cómo guardar y cargar modelos en PyTorch utilizando el state_dict
. Esta habilidad es esencial para cualquier proyecto de aprendizaje profundo, ya que permite guardar el progreso del entrenamiento y reutilizar modelos entrenados sin tener que volver a entrenarlos desde cero. En el siguiente módulo, profundizaremos en las Redes Neuronales Convolucionales (CNNs), una arquitectura clave para el procesamiento de imágenes.
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