Creando una Red Neuronal en Python, con tensorflow.

Saludos y bienvenidos una semana más a vuestro blog sobre programación en lenguaje Python. En el día de hoy vamos a hablar de las Redes Neuronales, las cuales, constituyen una de las herramientas más importantes del aprendizaje automático moderno. Estas se inspiran en el funcionamiento básico del cerebro humano y permiten a los programas aprender patrones a partir de datos, en lugar de seguir reglas programadas de forma explícita. Aunque a menudo se asocian con problemas complejos como reconocimiento de imágenes o lenguaje natural, es posible construir una red neuronal útil y comprensible para resolver problemas reales relativamente simples.

El funcionamiento de estas redes es relativamente simple: Una red neuronal está formada por unidades llamadas neuronas artificiales. Cada una de las cuales recibe valores de entrada, los combina mediante unos coeficientes llamados pesos añadiendo un término adicional conocido como sesgo. El resultado de esa operación se transforma mediante una función matemática que introduce no linealidad, permitiendo que la red aprenda relaciones complejas. A su vez, durante el entrenamiento, estos pesos y sesgos se ajustan automáticamente para reducir el error entre la predicción de la red y el valor real esperado.

A continuación, abordaremos la implementación de una (muy) sencilla Red neuronal en Python mediante la que intentaremos aproximar una función matemática no lineal de una sola variable. El objetivo no es sustituir el cálculo exacto, sino entender cómo una red neuronal aprende patrones, cómo se evalúa su precisión y cómo se comparan los resultados obtenidos con los valores correctos. La función es la siguiente:

Así, a partir de un conjunto limitado de ejemplos, nuestro modelo deberá aprender la forma general de la función y ser capaz de realizar predicciones razonables para valores intermedios que no ha visto durante el entrenamiento. Finalmente, compararemos los valores reales con los valores predichos para evaluar el error de dicho modelo. Pero antes de todo ello, lo primero será importar las librerías a utilizar tensorflow y numpy. Lo haremos todo en Google Collab, por lo que no necesitaremos realizar ninguna instalación adicional.

Una vez hechas las importaciones pertinentes, procederemos a definir el conjunto de datos de entrada:

Aquí x contendrá una sola característica por muestra: el valor de la variable x. Por su parte, el vector y contendrá el valor exacto de la función para cada entrada (cada valor de x). Nos aseguraremos de que ambos arrays tengan el mismo número de muestras, condición imprescindible para entrenar el modelo.

Tras ello, pasaremos a definir la estructura de nuestra red neuronal. La cual construiremos utilizando el modelo secuencial de Keras, que permite definir capas de forma ordenada:

En este caso, la red constará de una única capa densa con una sola neurona. Aquí hemos de decir que aunque esta arquitectura es extremadamente simple, resulta suficiente para ilustrar el proceso de aprendizaje. Su mecánica será también, bastante simple: La neurona recibirá un valor de entrada para producir una salida escalar, ajustando sus pesos durante el entrenamiento. Hecho esto, pasaremos a compilar el modelo para definir el modo en que nuestro modelo va a aprender:

Aquí, el optimizador Adam se encarga de ajustar los pesos del modelo durante el entrenamiento. En este ejemplo se utiliza una tasa de aprendizaje relativamente alta para acelerar la convergencia. La función de pérdida elegida es el error cuadrático medio, adecuada para problemas de regresión numérica. Hecho todo esto, podemos pasar al fin al entrenamiento del modelo:

Aquí, a través de los 1000 epochs (iteraciones del modelo), la red neuronal va ajustando sus parámetros internos para minimizar el error entre los valores predichos y los valores reales. Por su parte, el parámetro verbose=0 evita mostrar información detallada del proceso, manteniendo la salida limpia.

Y con ello, ya tendríamos nuestro modelo, listo para efectuar predicciones con nuevos datos. En este punto, vamos a comparar los valores predichos por la red neuronal con los valores reales de la función que intentamos aprender, para evaluar qué tan bien el modelo aproxima la relación matemática:

Para ello, calculamos primero los valores exactos con la función real_function() para un conjunto de entradas de prueba x_test que no se usaron en el entrenamiento. Luego, obtendremos las predicciones del modelo con model.predict y calcularemos el error como la diferencia entre ambos, mostrando todo en una tabla alineada para visualizar claramente la precisión de la red.

OUTPUT:

Como puede verse, los resultados muestran que la red neuronal consigue aproximar razonablemente la función dentro del rango de valores estudiados, aunque no reproduce exactamente la ecuación matemática. Esto es esperable, ya que el modelo no conoce la fórmula, sino que aprende únicamente a partir de ejemplos.

A su vez podemos mostrar la forma en la que nuestro modelo ha ido aprendiendo durante el entrenamiento usando una gráfica de perdida:

Se genera así un gráfico donde el eje horizontal representa los epochs del entrenamiento y el eje vertical muestra el valor de la función de pérdida (error cuadrático medio). La curva permite observar cómo disminuye el error a medida que la red ajusta sus pesos, error que disminuye de manera muy pronunciada durante las primeras 150 iteraciones, para luego quedar casi estancado.

CONCLUSION:

Este ejemplo demuestra de manera clara cómo una red neuronal sencilla puede aprender a aproximar una función matemática a partir de datos de entrenamiento. La comparación entre valores reales y predichos permite evaluar la precisión del modelo, mientras que la gráfica de pérdida muestra cómo el error disminuye a lo largo de los epochs, evidenciando el proceso de aprendizaje. Aunque la arquitectura es mínima, el ejercicio ilustra conceptos clave del aprendizaje automático: definición de datos, entrenamiento, predicción, evaluación y visualización del rendimiento, sentando una base sólida para trabajar con problemas más complejos y funciones desconocidas.

Saludos.