Optimización y partición de datasets con PyTorch
Clase 18 de 24 • Curso de Redes Neuronales con PyTorch
Resumen
¿Cómo definir un optimizador y una función de pérdida?
Al trabajar con modelos de aprendizaje automático, es esencial definir tanto un optimizador como una función de pérdida, convencionalmente llamada "criterio". En este guía exploraremos cómo configurar estos componentes cruciales dentro de un entorno de trabajo en PyTorch.
¿Qué son los hiperparámetros y cómo afectan nuestro modelo?
Los hiperparámetros son valores definidos antes del proceso de entrenamiento que afectan cómo aprende un modelo. Algunos de los más relevantes son:
- Épocas: Número de veces que el algoritmo de aprendizaje pasará por completo sobre el conjunto de datos de entrenamiento. Elegimos 3 épocas debido a la limitación de nuestros recursos, pero pueden ajustarse dependiendo del tiempo y recursos disponibles.
- Tasa de aprendizaje: Este valor influye en la velocidad a la que el modelo aprende. Se puede experimentar con diferentes tasas, como 0.1 (tradicional) o 0.3 (más agresiva), observando cómo afecta la precisión y la pérdida.
- Tamaño del batch: Tamaño del conjunto de muestras que el modelo procesa antes de actualizar los parámetros internos. Un tamaño más grande (e.g., 64) requiere una GPU con mayor capacidad.
¿Cómo definir la función de pérdida y el optimizador?
En PyTorch, podemos elegir entre diversas funciones de pérdida y algoritmos de optimización. Para este ejemplo, hemos elegido:
-
Función de pérdida:
CrossEntropyLoss
, adecuada para tareas de clasificación. La documentación de PyTorch ofrece una amplia variedad de opciones para experimentar, como L1, L2, MSELoss, entre otras. -
Optimizador:
Stochastic Gradient Descent (SGD)
, uno de los más utilizados. Es fundamental ingresar los parámetros de nuestro modelo y la tasa de aprendizaje que deseamos usar.
import torch
import torch.nn as nn
import torch.optim as optim
# Definir el criterio y el optimizador
criterio = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.2)
¿Cómo dividir el dataset de manera efectiva?
Es fundamental dividir el conjunto de datos en partes para obtener una evaluación precisa del modelo: entrenamiento, validación y prueba.
¿Cuáles son los pasos para dividir el dataset?
- Importar funciones necesarias: Usamos
random_split
detorch.utils.data
para realizar la división aleatoria del dataset. - Crear datasets a partir de DBpedia: Utilizamos los datasets de entrenamiento y test proporcionados por DBpedia.
- Calcular proporciones de división: Asignamos el 95% de los datos al conjunto de entrenamiento. El otro 5% será para validación.
- Realizar la partición: Usamos
random_split
para dividir el conjunto de entrenamiento en dos partes: entrenamiento y validación. - Crear data loaders: Estos son fundamentales para cargar los datos y manejarlos en lotes de forma eficiente.
from torch.utils.data import random_split
# Dividir el dataset en entrenamiento y validación
numTrain = int(len(trainDataset) * 0.95)
splitTrain, splitValid = random_split(trainDataset, [numTrain, len(trainDataset) - numTrain])
Creación de data loaders
Con los datasets divididos, podemos configurar los data loaders, que son esenciales para manejar los datos durante el entrenamiento:
from torch.utils.data import DataLoader
batchTamaño = 64
# Data loader para entrenamiento
trainLoader = DataLoader(splitTrain, batch_size=batchTamaño, shuffle=True, collate_fn=collateBatch)
# Data loader para validación
validLoader = DataLoader(splitValid, batch_size=batchTamaño, shuffle=True, collate_fn=collateBatch)
# Data loader para test
testLoader = DataLoader(testDataset, batch_size=batchTamaño, shuffle=True, collate_fn=collateBatch)
Los data loaders facilitan el trabajo con datos al permitir el shuffling, definir el tamaño de los lotes y preparar los datos para ingerirlos en el modelo de PyTorch.
En resumen, la elección cuidadosa y la configuración de estos componentes pueden optimizar significativamente el rendimiento y la precisión de tu modelo de aprendizaje automático. ¡Continúa experimentando y ajustando estos elementos para encontrar la mejor configuración para tus necesidades específicas!