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.

ENTRENANDO MODELOS PARA CLASIFICACIÓN DE IMAGENES CON PYTHON Y ‘TensorFlow’.

Destacado

En el mundo de la inteligencia artificial y el aprendizaje automático, la clasificación de imágenes es una tarea fundamental. Clasificar imágenes puede implicar identificar objetos, reconocer patrones o incluso diagnosticar enfermedades basadas en imágenes médicas. En este artículo, exploraremos cómo utilizar Python junto con ‘TensorFlow‘, una de las bibliotecas de aprendizaje automático más populares, para entrenar modelos de clasificación de imágenes de manera efectiva. La explicación la dividiremos en cinco sencillos pasos:

INSTALACIÓN DE TENSOR FLOW:

Aunque para nuestro ejemplo vamos a utilizar la plataforma de ‘Google Colab‘ (en donde no es necesaria esta acción) conviene saber como podemos instalar la librería localmente en nuestro sistema. Para ello podremos utilizar el comando ‘pip‘ al que estamos acostumbrados:

PREPARACIÓN DE LOS DATOS:

El primer paso en el entrenamiento de un modelo de clasificación de imágenes es preparar los datos. Para este ejemplo, utilizaremos el conjunto de datos ‘MNIST‘, consistente en una colección de imágenes de dígitos escritos a mano. ‘TensorFlow‘ proporciona, aquí, funciones para cargar y pre-procesar dicho conjunto de datos:

Así, empezaremos a elaborar nuestro modelo, importando la librería ‘TensorFlow‘. Tras ello, cargamos los datos de imágenes MNIST utilizando la función ‘load_data()‘ para después normalizar estos dividiendo los valores de píxeles de las imágenes por 255 y así escalarlos en el rango [0, 1]:

CONSTRUCCIÓN DEL MODELO:

Una vez que los datos están preparados, podemos construir nuestro modelo de clasificación de imágenes. Para este ejemplo, utilizaremos una red neuronal convolucional (CNN), la cual constituye una arquitectura comúnmente utilizada para tareas de visión por computadora como la que pretendemos realizar:

En la construcción del modelo, primero definimos un modelo secuencial utilizando ‘tf.keras.models.Sequential([])‘, permitiéndonos agregar capas secuenciales una tras otra. Luego, agregamos capas de convolución 2D seguidas de capas de agrupación máxima para extraer características de las imágenes y reducir la dimensionalidad. Después de varias iteraciones, aplanamos las características en un vector unidimensional y las alimentamos a capas densas para la clasificación final.

Una vez que el modelo está construido, lo compilamos con ‘model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])‘. Aquí, especificamos el optimizador ‘adam‘, una función de pérdida adecuada para problemas de clasificación de múltiples clases, y las métricas que deseamos monitorear durante el entrenamiento, como la precisión. Este proceso de construcción y compilación establece los parámetros esenciales del modelo, preparándolo para el proceso de entrenamiento.

ENTRENAMIENTO DEL MODELO:

Una vez construido y compilado nuestro modelo, podemos entrenarlo utilizando los datos de entrenamiento que definimos con anterioridad:

El código para entrenar el modelo utiliza el método ‘fit()‘, donde proporcionamos los datos de entrenamiento (‘x_train‘) y sus correspondientes etiquetas de clase (‘y_train‘). A su vez, especificaremos el número de épocas (variable ‘epochs‘) de entrenamiento, que determina cuántas veces el modelo verá todo el conjunto de datos de entrenamiento. Además, utilizamos un conjunto de datos de validación (‘x_test‘ y ‘y_test‘) para evaluar el rendimiento del modelo después de cada época. Durante el entrenamiento, el modelo ajusta sus pesos para minimizar la función de pérdida, y al final de cada época, evalúa su desempeño en el conjunto de validación. Este proceso se repite durante el número especificado de épocas, preparando así el modelo para su evaluación final.

Proceso de entrenamiento del modelo.

EVALUACIÓN DEL MODELO:

Finalmente procederemos a la evaluación de nuestro modelo, obteniendo el valor de perdida en el conjunto de datos de prueba (‘test_loss‘) y la precisión (‘test_acc‘). Para ello utilizaremos el método ‘evaluate()‘ del TensorFlow:

CONCLUSIÓN:

En este artículo, hemos explorado cómo utilizar Python junto con TensorFlow para entrenar un modelo de clasificación de imágenes. Desde la preparación de los datos hasta la construcción, entrenamiento y evaluación del modelo, TensorFlow proporciona herramientas poderosas y fáciles de usar para trabajar con imágenes y realizar tareas de aprendizaje automático. Con este conocimiento, estás listo para comenzar a desarrollar tus propios modelos de clasificación de imágenes y explorar el emocionante campo de la visión por computadora.

Saludos.