Entrenamiento y Visualización de Modelos de Regresión Lineal en PyTorch
Resumen
¿Cómo inicializar el entrenamiento de un modelo de regresión lineal?
Iniciar el entrenamiento de un modelo de regresión lineal es un paso crítico en la creación de un modelo eficiente y preciso. Este proceso no solo facilita ajustar el modelo a nuestros datos sino también monitorizar y ajustar el rendimiento sobre la marcha. En este contexto, utilizaremos Inference Mode de PyTorch para asegurar un manejo eficiente de los recursos, y Colab para ejecutar nuestro código.
Aquí te guiaré sobre cómo llevar a cabo este proceso de forma efectiva, controlando el proceso de pérdida y visualizando la evolución del entrenamiento.
¿Cómo manejar errores comunes al definir el modo de inferencia?
Para minimizar el uso de recursos durante el entrenamiento, es esencial implementar adecuadamente el Modo de Inferencia de PyTorch. Esto se logra al encapsular el código bajo el contexto de torch.inference_mode() lo cual desactiva cualquier cálculo de gradiente, optimizando así los recursos computacionales.
Python
with torch.inference_mode():# Código del entrenamiento
¿Cómo visualizar el progreso del entrenamiento?
Un paso esencial es monitorear el progreso del entrenamiento. Esto se puede lograr registrando las pérdidas de entrenamiento y validación en listas y posteriormente graficando estos datos.
# Inicializamos las listas para guardar la pérdidaentrenamiento_loss =[]test_loss =[]# Código para guardar las pérdidasentrenamiento_loss.append(loss_train.detach().numpy())test_loss.append(loss_test.detach().numpy())
¿Cómo imprimir información durante el entrenamiento?
Al configurar la información de diagnóstico durante el entrenamiento, puedes decidir cuántas veces deseas recibir actualizaciones. Un enfoque común es imprimir los resultados cada cierta cantidad de épocas, por ejemplo:
if epoch %10==0:print(f"Época {epoch} | Pérdida de entrenamiento: {loss_train:.4f} | Pérdida de prueba: {loss_test:.4f}")
¿Cómo graficar la reducción de la pérdida a lo largo del entrenamiento?
Para observar cómo disminuyen las pérdidas a lo largo del tiempo, se recomienda utilizar la librería matplotlib. Al graficar, puedes ver claramente el rendimiento del modelo y decidir si necesitas ajustar el número de épocas.
import matplotlib.pyplot as plt
plt.plot(entrenamiento_loss, label='Pérdida de Entrenamiento')plt.plot(test_loss, label='Pérdida de Prueba')plt.ylabel('Pérdida')plt.xlabel('Época')plt.legend()plt.show()
¿Cuántas épocas se necesitan?
El número de épocas es crucial para mejorar el modelo. Aunque en algunas configuraciones iniciales puede ser suficiente entrenar con 100 épocas, con frecuencia se observa que un número mayor puede continuar mejorando la precisión del modelo. Se recomienda experimentar para encontrar el número óptimo.
# Incrementar las épocas:for epoch inrange(200):# Incrementa el rango para un mejor ajuste# Código de entrenamiento
Al seguir estos pasos, no solo estarás capacitado para entrenar de manera efectiva un modelo de regresión lineal, sino que también tendrás una comprensión más profunda y visual del proceso de optimización. Sigue experimentando y ajusta los parámetros para lograr un modelo más robusto y preciso. ¡No te detengas en tu proceso de aprendizaje!
Chicos los valores que se muestran a partir del minuto 4:22 son valores mal calculados. Con esos valores no obtendrán la forma de la gráfica mostrada en el video debido a que las diferencias entre las perdidas no son tan marcadas, la forma será más parecida a una linea recta en vez de la linea curva como nos muestra el profesor. Este problema surge debido a un error de indentación en la celda, revisen el notebook de ejemplo en la sección de recursos para tener una guía de donde debe ir cada línea de código. Espero les sirva!
Gracias Juan!
si me dio rectas y tiene sentido al inspecionar los valores
Asi me sale con 300 épocas:
Las perdidas llegan a su punto minimo y a la vez se cortan aproximadamente en el # epoca : 260, despues de ello deja de tener sentido seguir aumentando el # epocas.
1000 epochs, lr=0.01
Con 250 épocas
En mi caso después de la época 150 ya deja de mejorar tanto.
use el MSE como loos functio pues al ser una tarea de regression creo que los errores deben ser mas fuertemente penalizados, me gustaria saber su opinion chicos. estan de acuerdo?
el learnning rate obviamente cambia la velocidad de convergencia y si queremos que esto converja mas rapito en menos epocs tambien podemos usar adam en vez de SGD .
pero creo que la eleccion the la loss function es muy importante tener claro el porque elegimos la que elegimos, y ahi me siento debil.
El proceso de entrenamiento de un modelo y la visualización de la pérdida son esenciales para verificar si el modelo está aprendiendo correctamente. A continuación te muestro cómo puedes entrenar el modelo y luego visualizar la pérdida de entrenamiento y prueba con una gráfica, usando matplotlib.
### Entrenamiento del modelo
El proceso de entrenamiento ya lo hemos ajustado en el ejemplo anterior, pero ahora vamos a mejorar el código para que podamos visualizar las pérdidas en forma de gráfica.
### Código para entrenamiento con visualización de la pérdida
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
\# Asegura la reproducibilidad
torch.manual\_seed(42)
\# Establezca cuántas veces el modelo pasará por los datos de entrenamiento
epocas =100
\# Listas para realizar un seguimiento de la pérdida durante el entrenamiento y la prueba
entrenamiento\_loss = \[]test\_loss = \[]for epoca inrange(epocas):  \### Entrenamiento  \# Pon el modelo en modo entrenamiento  model\_1.train()  \# 1. Pase hacia adelante los datos usando el método forward()  y\_predc = model\_1(X\_prueba)  \# 2. Calcula la pérdida (Cuán diferentes son las predicciones de nuestros modelos)  perdida = fn\_perd(y\_predc, y\_entrada)  \# 3. Gradiente cero del optimizador  optimizador.zero\_grad()  \# 4. Pérdida al revés (backward)  perdida.backward()  \# 5. Progreso del optimizador  optimizador.step()  \# Agregar la pérdida de entrenamiento a la lista  entrenamiento\_loss.append(perdida.item())  \### Evaluación (sin cálculo de gradientes)  model\_1.eval()  with torch.no\_grad():  \# 1. Reenviar datos de prueba  prueba\_predc = model\_1(X\_prueba)  \# 2. Calcular la pérdida en datos de prueba  prueba\_perdida = fn\_perd(prueba\_predc, y\_prueba.type(torch.float))  \# Agregar la pérdida de prueba a la lista  test\_loss.append(prueba\_perdida.item())  \# Imprimir cada 10 épocas para monitorear el progreso  if (epoca+1) % 10 == 0:  print(f'Epoca \[{epoca+1}/{epocas}], Pérdida entrenamiento: {perdida.item():.4f}, Pérdida prueba: {prueba\_perdida.item():.4f}')\### Visualización de la pérdidaplt.plot(entrenamiento\_loss, label="Pérdida entrenamiento")plt.plot(test\_loss, label="Pérdida prueba")plt.title("Pérdida durante el entrenamiento y la prueba")plt.xlabel("Épocas")plt.ylabel("Pérdida")plt.legend()plt.show()
### Explicación:
1. **Entrenamiento:** Cada época realiza un pase hacia adelante con los datos de entrenamiento, calcula la pérdida, retropropaga los gradientes y actualiza los parámetros del modelo.
2. **Evaluación:** En el modo de evaluación, calculamos la pérdida en el conjunto de prueba, pero sin retropropagación ni actualización de gradientes (esto ahorra memoria y tiempo).
3. **Almacenamiento de pérdidas:** Al final de cada época, almacenamos la pérdida tanto del entrenamiento como de la prueba en sus respectivas listas: entrenamiento\_loss y test\_loss.
4. **Visualización:** Utilizamos matplotlib para visualizar cómo las pérdidas disminuyen durante las épocas, lo que te permitirá ver si el modelo está aprendiendo correctamente o si está ocurriendo algún problema como **overfitting** (cuando la pérdida de entrenamiento es baja, pero la de prueba no mejora).
### Interpretación de la gráfica:
- Si ambas curvas (entrenamiento y prueba) descienden a lo largo del tiempo, el modelo está aprendiendo correctamente.
- Si la curva de entrenamiento disminuye, pero la de prueba comienza a estancarse o aumentar, esto podría ser señal de **overfitting**.
Con esta estructura puedes visualizar fácilmente el rendimiento de tu modelo durante el entrenamiento. ¿Te gustaría ajustar algún aspecto del entrenamiento o la visualización?
Me llama la atencion, el comportamiento de las funcion de perdida en training y test. Hay un espacio entre ellas. Personalmente, diria que hay presencia de underfiting. Para mejorar el modelo, necesitamos extender los epochs para que en algun momento detectar si hay convergencia del training loss y testing loss