Panama Hitek Logo
Panama Hitek Logo

PyTorch y MNIST: Cómo entrenar una red neuronal para clasificación de imágenes

El Deep Learning es una rama de la Inteligencia Artificial que se ha vuelto cada vez más popular en los últimos años debido a sus impresionantes capacidades para resolver problemas complejos de manera eficiente.

Uno de los problemas más comunes en el Deep Learning es la clasificación de imágenes, que implica asignar una etiqueta o categoría a una imagen dada. En este tutorial, aprenderás cómo utilizar PyTorch, una de las bibliotecas de Deep Learning más populares y de más rápido crecimiento, para entrenar una red neuronal completamente conectada (fully connected neural network) para la clasificación de imágenes utilizando el conjunto de datos MNIST.

El conjunto de datos MNIST es un conjunto de datos ampliamente utilizado que contiene imágenes de dígitos escritos a mano del 0 al 9. Sobre este dataset ya hemos escrito bastante aquí en Panama Hitek.

En este post aprenderás cómo cargar los datos, construir la red neuronal, entrenarla y evaluar su rendimiento. Al final de este tutorial, tendrás una comprensión sólida de cómo construir y entrenar una red neuronal simple para la clasificación de imágenes utilizando PyTorch y MNIST.

Sin más que decir, comencemos.

Redes Neuronales en Pytorch

PyTorch es una de las bibliotecas de Deep Learning más populares y de más rápido crecimiento. Fue desarrollada por Facebook AI Research y se basa en Torch, que es una biblioteca de Deep Learning de código abierto. PyTorch proporciona herramientas para construir y entrenar redes neuronales de manera eficiente y se ha convertido en una de las herramientas preferidas por los investigadores y desarrolladores de Deep Learning.

En PyTorch, las redes neuronales se definen utilizando la clase nn.Module. Cada red neuronal se define como una subclase de nn.Module, y se pueden agregar capas y otros módulos de PyTorch como atributos de la clase. Una vez que se define la arquitectura de la red neuronal, se puede entrenar utilizando las funciones de pérdida y optimización proporcionadas por PyTorch.

PyTorch también proporciona herramientas para trabajar con datos de manera eficiente, como la clase DataLoader, que se utiliza para cargar datos de entrenamiento y prueba en lotes. Además, PyTorch es compatible con la GPU, lo que permite acelerar significativamente el proceso de entrenamiento y evaluación de la red neuronal.

La red neuronal que vamos a utilizar en este post es una red neuronal completamente conectada (fully connected neural network) con una arquitectura simple. La red neuronal consta de dos capas completamente conectadas (fully connected layers), donde la primera capa tiene 784 entradas (ya que las imágenes de MNIST son de 28×28 píxeles) y 128 salidas, y la segunda capa tiene 128 entradas y 10 salidas (una para cada dígito del 0 al 9). La función de activación utilizada es ReLU (Rectified Linear Unit), que es una de las funciones de activación más utilizadas en las redes neuronales.

La siguiente imagen muestra una representación visual de la red neuronal que utilizaremos en este post:

pytorch y mnist
Representación gráfica de la red neuronal completamente conectada que utilizaremos para este post. Cabe destacar que en el espacio aquí disponible no podemos representar los 784 nodos de entrada ni los 128 nodos de la capa oculta, por lo que esta imagen no es más que una representación abreviada de la red neuronal.

Las imágenes del MNIST dataset tienen una dimensión de 28×28 pixeles. El resultado de esa multiplicación es 784. La red neuronal aquí presentada utiliza esos 784 pixeles como datos de entrada. Internamente tiene 128 nodos en la capa oculta, los cuales unen la entrada y la salida de la red neuronal.

Por cada imagen, la red tratará de interpretar los pixeles de cada muestra y «aprenderá» a asignarle una probabilidad en la capa de salida. De esta manera, el nodo de salida (azul) con la probabilidad más alta será el que nos indique cual de los 10 números estamos procesando en un momento dado. Este es un concepto básico sobre redes neuronales, así que no ahondaré mucho en este tema.

El siguiente código presenta una implementación en Python utilizando Pytorch para crear una red neuronal de 784 entradas, 128 nodos en la capa oculta y 10 nodos en la capa de salida. El código se encuentra disponible en nuestro repositorio de Github:

La red neuronal implementada en este código utiliza un algoritmo de aprendizaje supervisado conocido como backpropagation para actualizar los pesos de la red neuronal en cada iteración durante el entrenamiento.

En cada iteración, se alimenta la red neuronal con un lote de imágenes y se calcula la pérdida entre las etiquetas esperadas y las predicciones realizadas por la red. Luego, el algoritmo de backpropagation propaga el error hacia atrás en la red y ajusta los pesos de las neuronas para reducir la pérdida.

Este proceso se repite varias veces hasta que la red neuronal ha alcanzado una precisión aceptable en la clasificación de las imágenes. Una vez entrenada, la red se utiliza para predecir las etiquetas de las imágenes de prueba y se calcula su precisión de clasificación.

El resultado de ejecutar este código es el siguiente:

pytorch

Como vemos, hemos logrado un 97.81% de eficiencia en la clasificación de imágenes. Esto quiere decir que de las 10,000 imágenes que intentamos clasificar, hemos logrado estimar el número representado en la imagen en 9781 imágenes.

Este resultado es muy bueno. Aquí en Panama Hitek hemos probado múltiples algoritmos de clasificación en MNIST y este resultado es la tercera eficiencia más alta, justo por debajo de una red neuronal similar a esta en Tensorflow y el Support Vector Machine:

Como vemos, el algoritmo aquí presentado es ligeramente menos eficiente que otros, pero también requiere de un menor tiempo de entrenamiento y menor tiempo de pruebas. Y eso sin contar que en este post solamente estoy usando CPU.

Si se quiere utilizar GPU, hace falta modificar estas líneas del código:

Esas dos líneas deben remplazarse por:

De esta forma el algoritmo utilizará GPU, en caso de que la computadora que se esté utilizando cuente con el hardware para esto. Sobre este tema escribiré un post más adelante en el que espero comparar el performance de CPU vs GPU en algoritmos de Machine Learning.

Probando el algoritmo con mi escritura

Los que siguen mis publicaciones en este blog saben que cada vez que pruebo un algoritmo de Machine Learning con MNIST me gusta hacerlo también con mi números manuscritos. Hace unos meses escribí un post sobre este tema.

Mi dataset de imágenes luce así:

Vamos a ver como le va a la red neuronal en Pytorch con estos números. Hasta ahora no he encontrado ningún algoritmo que logre clasificar todos estos números de manera correcta.

El script utilizado para probar la red neuronal con mis números se encuentra disponible en nuestro repositorio de Github y produce el siguiente resultado:

pytorch

Como vemos aún no logramos clasificar correctamente los números de mi escritura. Supongo que tendré que analizar este problema de manera más profunda en otro post.

Conclusiones

En conclusión, hemos presentado una implementación básica de un algoritmo en Pytorch de aprendizaje automático supervisado utilizando el método de regresión logística. A través de este ejercicio, hemos demostrado cómo se puede entrenar un modelo para predecir una variable binaria a partir de un conjunto de datos de entrenamiento. Además, hemos explorado algunos conceptos clave en el aprendizaje automático, como la función de coste y la regularización, y cómo estos afectan el rendimiento del modelo.

Es importante destacar que, si bien el modelo obtenido tuvo una precisión aceptable, se podría mejorar su rendimiento a través de la optimización de hiperparámetros. Es decir, ajustando los diferentes parámetros del modelo, como el valor de lambda en la regularización o el número de iteraciones en el algoritmo de optimización, podríamos obtener un modelo más preciso y robusto.

En futuros posts, abordaremos estos temas en mayor detalle y exploraremos otras técnicas de aprendizaje automático para problemas de clasificación y regresión. También exploraremos cómo lidiar con conjuntos de datos desbalanceados y cómo evaluar el rendimiento del modelo de manera adecuada.

Finalmente, quiero agradecer al lector por tomarse el tiempo de leer este post y espero que haya encontrado útil esta introducción al aprendizaje automático y a la regresión logística. Si tiene alguna pregunta o comentario, no dude en dejarlos abajo. Estaré encantado de responder y discutir cualquier inquietud que pueda tener.

Antony García González
Antony García González
Ingeniero Electromecánico, egresado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.

Posts relacionados

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Post relacionados