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.savepara guardar elstate_dictdel modelo en un archivo. - Cargar el Modelo: Utilizamos la función
torch.loadpara cargar elstate_dictdesde un archivo y la funciónload_state_dictpara 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.savepara guardar elstate_dictdel 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.loadpara cargar elstate_dictdesde el archivo yload_state_dictpara 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ónEjercicio 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_dictdel modelo en un archivo. - Cargar el modelo: Carga el
state_dictdesde 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
