Tutorial: Construyendo un modelo de reconocimiento de dígitos manuscritos con TensorFlow

Tutorial: Construyendo un modelo de reconocimiento de dígitos manuscritos con TensorFlow

Raimundo Neto Barros. Redes Neuronales Convolucionales (CNNs), también conocidas como ConvNets o Convolutional Neural Networks, son un tipo de arquitectura de red neuronal diseñada especialmente para tareas de procesamiento de imágenes y reconocimiento de patrones. Las CNNs han sido una parte esencial del avance de la inteligencia artificial en campos como la visión computacional, el reconocimiento de imágenes y el procesamiento de video.

Este resumen detallado explorará los principales aspectos de las CNNs.

Arquitectura de Capas

Las CNNs están compuestas por capas interconectadas, con tres tipos principales de capas: Capas de Convolución, Capas de Pooling (Agrupamiento) y Capas Fully Connected (Totalmente Conectadas).

Capas de Convolución

  • Las capas de convolución son el componente fundamental de las CNNs. Consisten en filtros o kernels, que son matrices de pesos pequeños que recorren la imagen de entrada en pequeños pasos, realizando operaciones de convolución para detectar características relevantes. Estas características incluyen bordes, texturas, patrones y otra información importante.

Capas de Pooling

  • Las capas de pooling (o agrupamiento) se utilizan para reducir la dimensionalidad de los datos, conservando las características más importantes. El pooling generalmente implica una selección del valor máximo (Max Pooling) o promedio (Average Pooling) en una región local de la imagen convolucionada.

Capas Totalmente Conectadas

  • Las capas totalmente conectadas son similares a las capas tradicionales de redes neuronales artificiales. Son responsables de tomar las características extraídas por las capas anteriores y utilizarlas para realizar la clasificación o la regresión de salida.

Funciones de Activación

  • Las CNNs utilizan funciones de activación, como la función ReLU (Rectified Linear Unit), para introducir no linealidad en las capas convolucionales y mejorar la capacidad de aprendizaje de la red.

Capas de Normalización

  • Las capas de normalización, como la Normalización en lote, se utilizan para acelerar el entrenamiento y mejorar la estabilidad de la red.

Aprendizaje de Características Jerárquicas

Una de las principales ventajas de las CNNs es su capacidad para aprender características jerárquicamente complejas. Las capas iniciales detectan características simples, como bordes, mientras que las capas más profundas identifican características cada vez más abstractas, como objetos completos.

Entrenamiento con Retropropagación

  • Las CNNs se entrenan utilizando el algoritmo de retropropagación (backpropagation), ajustando los pesos de la red para minimizar una función de pérdida. El aprendizaje generalmente implica grandes conjuntos de datos etiquetados.

Transferencia de Aprendizaje

  • Las CNNs preentrenadas en grandes conjuntos de datos, como ImageNet, pueden adaptarse a tareas específicas con conjuntos de datos más pequeños mediante la técnica de transferencia de aprendizaje. Esto permite reutilizar los recursos aprendidos anteriormente.

Aplicaciones

  • Las CNNs tienen una amplia gama de aplicaciones, incluyendo reconocimiento de imágenes, clasificación de objetos, segmentación de imágenes, reconocimiento de texto en imágenes, detección de rostros, diagnóstico médico basado en imágenes, entre otros.

Las Redes Neuronales Convolucionales han revolucionado la visión computacional y son esenciales para una serie de aplicaciones prácticas, haciendo posible la automatización de tareas previamente complejas en áreas que involucran imágenes y visión por computadora. Siguen siendo un área de investigación activa, con avances constantes y adaptaciones para diversos campos.

El reconocimiento de dígitos escritos a mano es una tarea fundamental en el aprendizaje automático y la visión computacional. En este tutorial, aprenderás a crear un modelo de reconocimiento de dígitos manuscritos usando TensorFlow, una de las bibliotecas más populares para aprendizaje profundo y redes neuronales. Este tutorial está dirigido a desarrolladores y entusiastas que desean explorar el mundo del reconocimiento de patrones mediante redes neuronales.

TensorFlow

TensorFlow es una biblioteca de código abierto poderosa y popular para aprendizaje automático e inteligencia artificial. Desarrollada por Google Brain, es una herramienta extremadamente flexible que ofrece una amplia gama de funcionalidades para desarrollar y entrenar modelos complejos de aprendizaje profundo .

Exploraremos detalladamente las principales características y conceptos de TensorFlow:

Modelado con Grafos Computacionales: TensorFlow representa las operaciones matemáticas en forma de grafos dirigidos, donde los nodos representan operaciones y los bordes representan los datos (tensores) que fluyen entre estas operaciones. Esto permite una optimización y paralelización eficiente de las operaciones.

TensorFlow se centra en el concepto de tensores, que son estructuras de datos multidimensionales. Los tensores tienen varias dimensiones (de 0D a ND) y pueden ser la unidad básica para representar los datos de entrada, salida y las configuraciones de los modelos.

Flexibilidad en la Construcción de Modelos: TensorFlow ofrece dos estilos principales para la construcción de modelos: el modo imperativo (usando APIs como Keras) y el modo declarativo (usando una API de TensorFlow). Esto permite construir modelos de forma intuitiva y flexible. API Keras: Integrada a TensorFlow, la API Keras es una interfaz de alto nivel que facilita la creación, el entrenamiento y la evaluación de modelos. Keras es conocida por su simplicidad y eficiencia.

Entrenamiento Distribuido: TensorFlow soporta entrenamiento distribuido, permitiendo que los modelos se entrenen simultáneamente en varios dispositivos, como GPUs y TPUs, mejorando la escalabilidad y eficiencia del entrenamiento.

Finalidades y aplicaciones prácticas

Un Modelo de Reconocimiento de Dígitos Manuscritos con TensorFlow tiene como objetivo la confidencialidad y clasificación de dígitos escritos a mano en imágenes o documentos. Este tipo de modelo tiene varias aplicaciones prácticas, incluyendo:

Reconocimiento de Dígitos en Cheques y Documentos Financieros: las instituciones financieras utilizan modelos de reconocimiento de dígitos para procesar cheques y documentos que contienen números escritos a mano, agilizando el proceso de verificación y reduciendo errores.

Automatización de Procesos Empresariales: las empresas pueden utilizar modelos de reconocimiento de dígitos para automatizar la lectura de formularios, facturas, cheques y otros documentos, ahorrando tiempo y reduciendo errores de interpretación humana.

Sistemas de Pago Automático: en sistemas financieros, el reconocimiento de dígitos se usa para automatizar la lectura de cheques, códigos de barras en boletos y otras formas de pago, acelerando el procesamiento.

Sistemas de Reconocimiento de Escritura Manual: puede usarse como componente en sistemas de reconocimiento de escritura manual más complejos, donde el reconocimiento de dígitos es la primera etapa para la identificación de palabras o frases escritas a mano.

Aplicaciones Móviles: las aplicaciones móviles pueden integrar modelos de reconocimiento de dígitos para facilitar la entrada de datos, como el reconocimiento de números de teléfono o códigos de autenticación.

Desarrollo de Aplicaciones Educativas: utilizar un Modelo de Reconocimiento de Dígitos Manuscritos con TensorFlow puede ser una forma eficaz de ayudar a los estudiantes a aprender a escribir y reconocer números de forma interactiva y atractiva.

Requisitos Previos

Antes de comenzar, necesitarás cumplir con los siguientes requisitos para ejecutar los códigos:

Conocimientos en Python: Este tutorial asume que tienes conocimientos básicos en el lenguaje Python, incluyendo la manipulación de arreglos de la biblioteca NumPy.

Instalación de TensorFlow: Asegúrate de que TensorFlow esté instalado en tu entorno de Python. Puedes instalarlo usando el comando pip:


pip install tensorflow

Ahora, vamos a crear un modelo de reconocimiento de dígitos con los siguientes pasos.

Paso 1: Conjunto de Datos MNIST

El conjunto de datos MNIST es un conjunto clásico para tareas de reconocimiento de dígitos manuscritos. Consiste en 60,000 imágenes de entrenamiento y 10,000 imágenes de prueba, cada una representando un solo dígito del 0 al 9. Comenzaremos cargando este conjunto de datos utilizando el siguiente código.


import tensorflow as tf

from tensorflow.keras.datasets import mnist


# Carregando o conjunto de dados MNIST

(x_train, y_train), (x_test, y_test) = mnist.load_data()





Paso 2: Preprocesamiento de los Datos

El preprocesamiento de los datos es una etapa sumamente importante en el entrenamiento de redes neuronales, ya que influye directamente en los resultados de los algoritmos. Primero, normalizamos las imágenes para que los valores de los píxeles estén en el rango de 0 a 1.

# Normalização dos valores dos pixels para o intervalo [0, 1] x_train, x_test = x_train / 255.0, x_test / 255.0


Paso 3: Construcción del Modelo

Ahora, construiremos el modelo de red neuronal. En este ejemplo, utilizaremos una red neuronal convolucional (CNN) simple, conocida por su rendimiento en tareas de visión computacional.

model = tf.keras.models.Sequential([

    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),

    tf.keras.layers.MaxPooling2D((2, 2)),

    tf.keras.layers.Flatten(),

    tf.keras.layers.Dense(128, activation='relu'),

    tf.keras.layers.Dropout(0.2),

    tf.keras.layers.Dense(10)

])


Paso 4: Compilación del Modelo

Después de construir el modelo, es hora de compilarlo. Definiremos la función de pérdida, el optimizador y las métricas para monitorear durante el entrenamiento del algoritmo.

# Compilando o modelo

model.compile(optimizer='adam',

              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),

              metrics=['accuracy'])




Paso 5: Entrenamiento del Modelo

A continuación, entrenaremos el modelo utilizando los datos de entrenamiento de la base MNIST.

# Treinando o modelo

model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))





Paso 6: Evaluación del Modelo

Después del entrenamiento, evaluaremos el rendimiento del modelo utilizando los datos de prueba. Cabe destacar que los datos de prueba son diferentes de los datos de entrenamiento.

# Avaliando o modelo nos dados de teste

test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=2)

print(f'Acurácia nos dados de teste: {test_accuracy*100:.2f}%')



Resultados

Después de seguir los pasos anteriores para ejecutar la red neuronal, deberías obtener buenos resultados en cuanto al desempeño del algoritmo en la clasificación de las imágenes. Si deseas ver mejor la clasificación de los datos, puedes graficar el resultado utilizando la biblioteca de Python llamada Matplotlib. Para graficar los resultados, sigue estos pasos.

Paso 1: Importa la biblioteca

# Importando a biblioteca

import matplotlib.pyplot as plt

Paso 2: Elige una de las imágenes aleatoriamente

# Escolhendo um exemplo aleatório do conjunto de teste

index = np.random.randint(0, len(x_test))

imagem_teste = x_test[index]

classe_real = y_test[index]


Paso 3: Realiza la predicción del modelo

# Fazendo uma previsão usando o modelo

previsao = model.predict(np.expand_dims(imagem_teste, axis=0))[0]


Paso 4: Obtén la clase de predicción

# Obtendo a classe prevista (a classe com maior probabilidade)

classe_prevista = np.argmax(previsao)


Paso 5: Graficando los Resultados

Después de graficar el resultado, se mostrará una imagen aleatoria de la base, con una leyenda en la imagen: Clase Real y Clase Prevista, en la que podrás verificar la precisión del algoritmo.

# Plotando a imagem de teste

plt.figure(figsize=(4, 4))

plt.imshow(imagem_teste, cmap='gray')

plt.title(f'Classe Real: {classe_real}\nClasse Prevista: {classe_prevista}')

plt.axis('off')

plt.show()


Conclusión

En este tutorial, aprendiste a crear un modelo de reconocimiento de dígitos manuscritos usando TensorFlow. Comenzamos cargando el conjunto de datos MNIST, realizamos el preprocesamiento de las imágenes, construimos un modelo de red neuronal convolucional (CNN), lo compilamos, entrenamos y evaluamos su rendimiento, y graficamos un resultado aleatorio de la clasificación de los datos. El modelo alcanzó una alta precisión en la clasificación de dígitos manuscritos.

Ahora tienes las habilidades necesarias para comenzar a explorar tareas más complejas de aprendizaje profundo y visión computacional. Recuerda que el aprendizaje automático es una disciplina vasta y en constante evolución, con aplicaciones emocionantes en diversas áreas.

Bibliografía

JURASZEK, Guilherme Defreitas et al. Reconocimiento de productos por imagen utilizando palabras visuales y redes neuronales convolucionales. 2014.

TensorFlow. https://www.tensorflow.org/

Conjunto de Datos MNIST. http://yann.lecun.com/exdb/mnist/

TensorFlow Tutorials. https://www.tensorflow.org/tutorials

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.