¿Cómo realizar inferencia con un modelo de machine learning?
Realizar inferencia es el proceso esencial para evaluar cómo nuestro modelo de machine learning, una vez entrenado, puede manejar datos no vistos o nuevos. En esta fase, aprovechamos el modelo para generar predicciones y compararlas con datos reales. Aprender a implementar este proceso garantiza que el modelo generalice correctamente fuera del conjunto de datos de entrenamiento.
¿Cuáles son los pasos para usar nuestro modelo en modo evaluación?
Implementar un modelo entrenado para inferencia implica una serie de pasos que aseguran que las predicciones sean precisas y que el modelo esté adecuadamente preparado.
Activar el modo "EVAL": Antes de hacer predicciones, colocamos nuestro modelo en modo "EVAL" (evaluación). Esto es crucial ya que desactiva funciones como el dropout, que no son necesarias al evaluar el modelo, asegurando que las predicciones sean consistentes y realistas.
Configurar el administrador de contexto del modo "Inferencia": Si ya estás familiarizado con ambientes como PyTorch, sabrás que es esencial usar un administrador de contexto para asumir el modo sin gradientes, optimizando así el uso de memoria y acelerando las predicciones.
Asegurar consistencia en el dispositivo: Todo, desde el modelo hasta los datos de prueba, debe residir en el mismo dispositivo, ya sea CPU o GPU. Aunque en este ejemplo operamos con CPU, es bueno utilizar funciones como to(device), especialmente si trabajamos en entornos con GPU, para maximizar el rendimiento.
# Mover el modelo y el tensor de prueba al dispositivo# modelo.to(device)# x_prop.to(device)
¿Cómo obtenemos las predicciones y evaluamos el rendimiento del modelo?
Una vez que el modelo está en modo evaluación y todos los elementos están en el dispositivo correcto, podemos proceder a obtener las predicciones.
Generar predicciones: Ejecutamos el modelo usando los datos de prueba para obtener un tensor con nuestras nuevas predicciones.
Visualizar resultados: Usamos funciones gráficas predefinidas, como PlotPredictions, para observar visualmente cómo las predicciones se comparan contra los valores reales.
Al visualizarlo gráficamente, podemos identificar mejoras en la cercanía de las predicciones a los datos objetivos.
¿Cómo optimizar un modelo de machine learning entrenado?
Después de observar las predicciones, aún es posible mejorar el rendimiento del modelo. Aquí algunas recomendaciones para optimización efectiva:
Aumentar el número de épocas: Más épocas pueden llevar a un mejor ajuste, aunque cuidado con el sobreajuste.
Ajustar el Learning Rate: Modificar este parámetro impacta en la velocidad de aprendizaje y puede mejorar la convergencia.
Probar diferentes optimizadores y funciones de pérdida: Variar estos componentes puede resultar en un mejor desempeño del modelo.
Estas acciones ayudarán a refinar el modelo y verán cómo los resultados se acercan más a los valores reales, diferenciándose cada vez menos.
Interacción y reflexión
¡Enhorabuena! Llegaste al final de este módulo, en el que no solo aprendiste cómo inicializar, entrenar y evaluar un modelo, sino también a reflejar el progreso visualmente. Te animamos a reflexionar sobre cómo estas técnicas profundizaron tus conocimientos en Deep Learning comparados con tecnologías previas que manejabas, como Keras. ¡Esperamos tus comentarios!
En el próximo módulo, decidiremos entrenar una red neuronal con PyTorch. Te invitamos a seguir explorando y profundizando en el conocimiento sobre estas fascinantes técnicas.
Realicé la prueba aumentando las épocas, y la mejor fue 300, de ahí en adelante no se vio mejoría en las predicciones
Yo también lo hice de esa manera, se me hizo más facil que tantear el learning rate :)
Increíble!
como el reto suponía ajustar el modelo, lo que hice fue agrandar los steps y he aquí mi resultado:
Si reducimos el lr a 0.002, y aumentamos las épocas a 1330, se aprecia una mejora razonable del aprendizaje, pero también cómo es necesario aumentar las épocas al reducir el lr en este ejemplo sencillo.
Con 160 épocas obtuve este resultado
Con 250 épocas
Hola Chicos.
Este fue mi resultado con epochs = 200.
Yo le di un momentum al SGD de 0.01, eso ayudo tambien al entrenamiento.
Una vez que has entrenado un modelo en PyTorch, puedes utilizarlo para realizar predicciones sobre nuevos datos o sobre datos de prueba. Para ello, es fundamental cambiar el modelo a modo de evaluación utilizando model.eval() y asegurarte de que no se están calculando los gradientes con torch.no\_grad(), ya que durante la predicción no es necesario el retropropagación.
Aquí te muestro cómo hacer predicciones con un modelo de PyTorch ya entrenado:
### Ejemplo de código para hacer predicciones
import torch
\# Pon el modelo en modo de evaluación
model\_1.eval()\# Datos de entrada para la predicción (puede ser cualquier tensor nuevo o de prueba)
\# Asegúrate de que X\_nuevos\_datos tiene la misma estructura que los datos de entrenamiento
X\_nuevos\_datos = torch.tensor(\[\[0.5,0.8], \[0.3,0.9]])# Ejemplo de nuevos datos (cambia según tu caso)
\# Realizar la predicción sin calcular gradientes
with torch.no\_grad():  \# Pase hacia adelante para hacer predicciones  predicciones = model\_1(X\_nuevos\_datos)\# Si las predicciones son logits (para clasificación), puedes convertirlas a probabilidades
\# Por ejemplo, si la última capa de tu modelo no tiene una función softmax, puedes aplicar una:probs = torch.softmax(predicciones, dim=1)\# O si usas una regresión, puedes imprimir directamente los valores predichos
print("Predicciones:")print(predicciones)\# Si es un problema de clasificación, puedes obtener la clase predicha
clases\_predichas = torch.argmax(probs, dim=1)print("Clases predichas:", clases\_predichas)
### Explicación del código:
1. **model.eval()**: Cambiamos el modelo al modo de evaluación. Esto asegura que ciertas capas como Dropout o BatchNorm se comporten de manera adecuada durante la predicción.
2. **Datos de entrada**: Usamos X\_nuevos\_datos, que debe tener el mismo formato y dimensiones que los datos de entrenamiento. Si usas normalización o preprocesamiento durante el entrenamiento, asegúrate de aplicarlo también a los datos de predicción.
3. **torch.no\_grad()**: Esto desactiva el cálculo de gradientes, lo que hace que la predicción sea más rápida y eficiente en términos de memoria.
4. **Predicción**: Usamos el modelo para hacer una predicción (model\_1(X\_nuevos\_datos)). Si es un modelo de clasificación, los resultados pueden estar en forma de **logits**, por lo que podemos aplicar torch.softmax() para convertirlos en probabilidades.
5. **Clases predichas** (si es clasificación): Si el modelo es de clasificación, torch.argmax() puede ayudarte a obtener la clase predicha para cada muestra.
### Consideraciones adicionales:
- **Clasificación**: En un problema de clasificación, el modelo típicamente devuelve logits (valores sin procesar antes de la función de activación final), y se pueden convertir a probabilidades con softmax. Luego, las clases predichas se obtienen usando torch.argmax().
- **Regresión**: En problemas de regresión, la salida será el valor predicho directamente, por lo que no necesitas aplicar softmax.
- **Preprocesamiento**: Asegúrate de aplicar el mismo preprocesamiento a los datos de entrada de predicción que aplicaste durante el entrenamiento (como la normalización de características).
Añadí un poco de sesgo a los datos y aumenté el número de steps