Normalización de Datos para Redes Neuronales con TensorFlow

Clase 16 de 21Curso de TensorFlow.js

Contenido del curso

Resumen

Preparar los datos correctamente es tan importante como diseñar la arquitectura de una red neuronal. Sin una normalización adecuada, el modelo no podrá aprender de forma eficiente, y sin entender el proceso inverso, los resultados serán imposibles de interpretar. Aquí se explica paso a paso cómo transformar datos crudos en tensores normalizados y cómo ejecutar el entrenamiento de un modelo de regresión lineal con TensorFlow.js.

¿Cómo se normalizan los datos para una red neuronal?

TensorFlow prefiere que los datos estén normalizados, es decir, que sus valores se encuentren entre cero y uno. La función de conversión de datos realiza un proceso de limpieza que incluye varios pasos [0:18]:

  • Mezcla aleatoria con shuffle: los datos se reordenan de forma aleatoria para evitar sesgos durante el entrenamiento.
  • Mapeo de variables: se separan las entradas (número de cuartos) y las etiquetas (precio) para asignarlas correctamente.
  • Transformación a tensor 2D: los datos se convierten en un arreglo de dos dimensiones compatible con el modelo.

La normalización se realiza con una operación matemática sencilla [1:37]: al dato de entrada se le resta el valor mínimo y el resultado se divide entre la diferencia del máximo y el mínimo. En TensorFlow.js, esto se traduce usando operaciones de tensores como la substracción (sub) y la división (div) entre tensores.

¿Por qué es necesario conservar los valores máximos y mínimos?

El proceso de desnormalización o desregularización es fundamental [1:07]. Si normalizamos los datos para entrenar, necesitamos poder revertir esa transformación para que las predicciones tengan sentido en la escala original. Por eso se guardan cuatro valores clave: entradas máximas, entradas mínimas, etiquetas máximas y etiquetas mínimas. Sin ellos, el modelo estaría perfectamente entrenado pero sería incapaz de traducir sus resultados a datos comprensibles.

¿Qué hace la función tidy en TensorFlow.js?

La función tidy [2:28] se encarga de la gestión de memoria. Cuando se crean tensores durante las operaciones, algunos resultan intermedios y ya no se necesitan. Tidy permite que TensorFlow decida automáticamente qué tensores conservar porque se usarán en otra parte del sistema y cuáles liberar de memoria. Esto es especialmente importante en aplicaciones que corren en el navegador, donde los recursos son limitados.

¿Cómo se entrena el modelo de regresión lineal?

Una vez que los datos están convertidos en tensores normalizados, el siguiente paso es el entrenamiento. La función de entrenamiento es asíncrona porque el proceso puede tardar un tiempo considerable [3:52]. Recibe tres elementos: el modelo creado, los inputs y las etiquetas.

Para compilar el modelo se definen tres componentes esenciales [4:13]:

  • Optimizador Adam: un algoritmo predefinido en la librería de entrenamiento de TensorFlow, muy parecido al descenso de gradiente pero con mejoras automáticas en la tasa de aprendizaje.
  • Función de pérdida mean squared error (MSE): mide la distancia entre los puntos reales y los que predice el modelo sin entrenar, guiando la optimización.
  • Métrica MSE: permite monitorear el rendimiento del modelo durante todo el proceso.

¿Qué son los hiperparámetros en el entrenamiento?

Los hiperparámetros [5:08] son configuraciones que controlan cómo aprende el modelo. En este caso se definen:

  • Tamaño del batch: el número de registros que se procesan en cada iteración.
  • Número de epochs: cuántas vueltas completas dará el modelo sobre todos los datos. Aquí se configuraron 50 epochs.
  • Shuffle: mezcla adicional de los datos en cada epoch.

El objeto history [5:32] almacena las métricas a lo largo del entrenamiento para poder graficarlas. El método fit ejecuta el entrenamiento de forma asíncrona con await, y envía de manera interactiva la evolución de la pérdida y el error estándar a un dashboard visual.

¿Cómo interpretar los resultados del entrenamiento?

Al ejecutar el modelo, el dashboard muestra cómo el error se va reduciendo con cada epoch [7:08]. Un detalle importante que se observa es que al epoch número seis el error ya había disminuido de forma significativa y después se estacionó. Esto sugiere que no siempre es necesario completar las 50 vueltas configuradas; el entrenamiento podría detenerse antes si el error deja de mejorar.

Durante la ejecución también pueden aparecer errores comunes de código, como escribir incorrectamente el nombre de una variable. En este caso, la variable metric debía llamarse metricas [6:48], algo que se resolvió rápidamente revisando el código.

Si te interesa profundizar en cómo usar el modelo entrenado para hacer predicciones o cómo guardarlo para reutilizarlo sin repetir el entrenamiento, comparte tus dudas o experiencias en los comentarios.