
Redes Neuronales Artificiales
Las redes neuronales artificiales son el elemento básico del funcionamiento de los sistemas de aprendizaje profundo.
David Baños Abril – 26 de marzo de 2022
Nuestra primera red neuronal será un perceptrón: una sencillísima red de tres capas densamente conectadas, es decir, todas las neuronas de una capa establecen conexión con todas las neuronas de la capa precedente.
El primer paso que ha de realizarse será cargar las imágenes con las que entrenar nuestra red neuronal. El banco de imágenes MNIST recoge miles de imágenes de dígitos manuscritos, todas a una misma resolución. Nuestro algoritmo deberá cargar esas imágenes desde Keras.
Como se ve MNIST contiene imágenes de entrenamiento e imágenes de prueba una vez que la red ha sido entrenada. Así mismo, también contiene las etiquetas (labels) con la que se asocia cada imagen.
entren_imagenes.shape
» (60000, 28, 28)
test_imagenes.shape
» (10000, 28, 28)
Las estructuras de datos o matrices n-dimensionales se conocen como tensores. Como vemos, se trata de tensores tridimensionales. Las imágenes de entrenamiento se cuentan por 60.000, con una resolución de 28×28. Las de testeo tienen un mismo tamaño, pero son tan solo 10.000.
entren_etiquetas.shape
» (60000, )
Cada una de esas imágenes está etiquetada como un dígito, que toma un valor de cero a nueve. Es por ello que la estructura de datos nos muestra que existen unas 60.000 etiquetas (una por imagen). El segundo valor vacío indica que estas etiquetas son valores escalares, es decir, adimensionales.
entren_imagenes.dtype
» uint8
» 8
Los datos de la matriz toman valores entre 0 (blanco) y 255 (negro máximo). Se recomienda en lo posible evitar valores excesivamente altos para evitar que la red se desestabilice. Por lo tanto es una práctica muy generalizada normalizar los datos, de manera que tomen valores entre 0 y 1 (simplemente dividiendo cada valor por 255). Naturalmente, esto implica primero que el tipo de dato deje de ser entero para transformarse en un decimal float32 haciendo uso de la función astype.
'
float32'
)'
float32'
)Comencemos a dar forma a nuestra red neuronal. Haciendo uso de Keras, esto es cuestión de unas pocas líneas de código. Nuestra red tendrá una capa de entrada, una de salida, y una capa oculta entre ambas.
'
relu'
, input_shape=(784,)))
perceptron.add(layers.Dense(256, activation='
relu'
))
perceptron.add(layers.Dense(10, activation='
softmax'
))
Estos parámetros incluyen tanto a los pesos sinápticos como los sesgos. Cada conexión conlleva un sesgo que determina la «sensibilidad» de la neurona independientemente de los pesos sinápticos. Contando con este sesgo, el número de parámetros totales es
'
sgd'
, loss='
categorical_crossentropy'
, metrics=['
accuracy'
]) perceptron.fit(entrm_imagenes, entrm_etiquetas, epochs=5)
Epoch 1/5
1875/1875 [==============================] – 7s 3ms/step – loss: 0.5607 – accuracy: 0.8573
Epoch 2/5
1875/1875 [==============================] – 6s 3ms/step – loss: 0.2704 – accuracy: 0.9232
Epoch 3/5
1875/1875 [==============================] – 6s 3ms/step – loss: 0.2185 – accuracy: 0.9384
Epoch 4/5
1875/1875 [==============================] – 6s 3ms/step – loss: 0.1842 – accuracy: 0.9478
Epoch 5/5
1875/1875 [==============================] – 6s 3ms/step – loss: 0.1593 – accuracy: 0.9550
Al final de cada época se produce la actualización de los parámetros entrenables. Podemos comprobar como la función de pérdida va progresivamente reduciéndose a en cada época, al mismo tiempo que aumenta la precisión. Tras terminar el entrenamiento podemos ver que la red acierta el 95.5% de las ocasiones.
Como vemos, la red responde con igual precisión a datos diferentes a los vistos durante el entrenamiento. En otras palabras, hemos evitado el problema del sobreajuste.
Podemos tomar una imagen concreta de nuestra base de datos de test y comprobar sí realiza una precisión certera. Por ejemplo, la imagen número 2022.
plt.imshow(test_imagenes[2022], cmap=plt.cm.binary)
[1.9566587e-04 3.6882045e-04 2.6386415e-03 1.0740548e-02 9.2218322e-01 7.3609320e-03 1.3715045e-03 8.1605352e-03 1.3376622e-02 3.3603624e-02]
Los resultados nos aparecen en base diez, pero podemos comprobar que el quinto puesto (que corresponde al dígito 4) es el que más valor tiene: 0.9221. El resto de resultados tienen un valor extremadamente pequeño (recordemos que entre todos deben sumar 1).
Con este tutorial hemos ofrecido la posibilidad de construir una red neuronal desde cero con Keras. Recomendamos encarecidamente al lector que con estos conocimientos en mano realice sus propios experimentos, probando a añadir capas, aumentar o reducir el número de neuronas en cada una de ellas, cambiando la función de activación, etc…
– Torres, J. (2020). Python Deep Learning. Introducción práctica con Keras y TensorFlow 2.
– Chollet, F. (20178). Deep Learning with Python.
La Máquina Oráculo » Deep Learning » Nuestra primera red neuronal
Las redes neuronales artificiales son el elemento básico del funcionamiento de los sistemas de aprendizaje profundo.
Los bancos de imágenes se han convertido en una herramienta indispensable en Deep Learning, necesarios para el entrenamiento de redes de IA.
El aprendizaje de redes neuronales es la propiedad más característica de esos modelos computacionales altamente flexibles.