Introducción al deep learning parte 2: Redes Neuronales Convolucionales

Source: Deep Learning on Medium


Go to the profile of Harpie Crispi

0. Pre requisitos

Antes de comenzar me gustaria hacer énfasis que este articulo es parte de un “Learning Path”. Y es por ello que te recomiendo leer la parte anterior.

Espero que cuentes con estos conocimiento, para poder sacar el mayor provecho a este articulo.

Debe evitarse hablar a los jóvenes del éxito como si se tratase del principal objetivo en la vida. La razón más importante para trabajar en la escuela y en la vida es el placer de trabajar, el placer de su resultado y el conocimiento del valor del resulta

– Albert Einstein

1. Que es una Red Neuronal Convolucional

en su día me lo cuestione al igual que tu, y luego de documentarme a base de varios vídeos pude comprenderlo, y hoy te transmitiré ese conocimiento, de la forma mas intuitiva posible, porque no es mas complejo que un Perceptron.

Y vamos a comenzar de la siguiente manera.


¿Que ves en esta imagen?, ¿ves una persona joven mirando hacia atrás o una persona vieja mirando hacia abajo?, en este momento tu cerebro esta luchando por encontrar una de las dos figuras antes nombradas.

Esta imagen prueba que es lo que busca nuestro cerebro cuando visualizas algo, esta buscando propiedades, dependiendo de las propiedades, y dependiendo de las propiedades, y dependiendo de las propiedades que nos enfoquemos, vamos a categorizar las cosas y vamos a poder dar una respuesta de acuerdo a lo que vemos.

Cuando nos enfocamos, en cierto punto de la imagen, nuestro cerebro considerara que hay mas propiedades, que corresponden a una mujer joven mirando hacia atrás, y si nos enfocamos en otro punto, nuestro cerebro considerara que hay mas propiedades de una persona vieja mirando hacia abajo, entonces de esa forma, dependiendo de las propiedades, que nuestro cerebro considere al mirar la imagen, veremos una cosa u otra.

Ahora quiero que veas la siguiente imagen y trata de expresar la sensación que te produce.

Esta imagen la vi hace unos días cuando estaba buscando información sobre la percepción, y la explicación de por que nos produce este sentimiento o sensación tan extraña la explicare ahora.

Literalmente nuestro cerebro esta tratando de decidir que estamos viendo, entre muchas opciones distintas, porque nosotros podemos percibir solo figura y forma, pero cuando figura y forma se superponen, el cerebro no logra determinar con exactitud que estamos viendo, obviamente sabemos que es, pero aun así nuestro cerebro esta confundido.

Estos ejemplos nos pueden tratar de ayudar a la hora de comprender como nuestro cerebro funciona en el aspecto de visión, toma ciertas características de lo que estemos observando para tratar de determinar de que se trata, por ejemplo, cuantas veces has mirado por sobre tu hombro y has visto una sombra de algo, y tratas de adivinar que es, y dices muchas posibilidades, y no sabes determinar que es esa cosa, y dices, es una pelota y te giras y en realidad es un gato.

Las Redes Neuronales Convolucionales son muy similares en gracias a los avances dentro de esta área, la forma en que las computadoras procesan imágenes es muy similar a la manera en que nosotros lo hacemos, así que quiero que tengas todos estos conceptos presentes para ver a lo que me refiero.

Lo que hace una red neuronal convolucional es demasiado simple, le pasas una imagen, y te la clasifica.

Mientras el documento avanza vamos a ir entrando en detalle.

tomemos un ejemplo, yo a mi red neuronal convolucional le di un dataset de emociones e imágenes de esas emociones si yo le paso una nueva imagen que no este en el dataset que represente una emoción, mi red neuronal convolucional, debería ser capaz de saber a que emoción corresponde esa imagen.

Como te podrás imaginar, esto es una característica muy poderosa para una aplicación de cualquier tipo, el poder que tiene el poder reconocer cosas en imágenes, o en vídeo, porque un vídeo no es mas que una secuencia de imágenes, por lo que estas redes neuronales también sirven para clasificar cosas en vídeos, algo a recalcar es que la salida esta basada en probabilidades, no te dará un resultado exacto, pero nosotros tomamos el resultado con mayores probabilidades, que suele ser casi siempre el correcto, pero hay que tener en cuenta que aveces se equivocara ese casi siempre depende de muchos factores que hay que tener en cuenta, pero ahora no nos concentremos en eso.

¿Y como es que el PC interpreta las imágenes?. Bueno cuando te bajas una imagen en cualquier formato, en el fondo es una matriz de valores, en el caso de una imagen en blanco y negro, es una matriz de dos dimensiones, de valores que van desde el 0 al 255, que representan la intensidad del color blanco, es decir que cuando este valor 0 el computador dibuja un pixel de color negro en la pantalla y cuando el valor este valor es 255 el computador dibuja un pixel de color blanco en la pantalla.

En cambio cuando es una imagen a color, es una matriz de 3 dimensiones que cada dimensión representa una capa de color, y cada uno de estas capas tienen valores que van del 0 al 255, que representan la intensidad de ese color, y el computador para mostrar toma un valor y dibuja un pixel del color resultante de la mezcla.

Para ejemplificar mejor esto, tome una imagen del dataset mnist, y aumente la intensidad de sus valores la gratifique en pantalla y luego convertí todos los valores de 255 en 1 y lo mostré en pantalla con la función print y esto es lo que salio de ese experimento, así te quedara mas clara la idea

Entonces de esta manera nuestro modelo puede tomar los datos y trabajar con ellos.

2. Convolucion

Esta es la ecuación de convolucion, se ve aterradora, pero veras que es demasiado simple de hecho, no te esfuerces en entender esta formula, porque vamos a explicarlo de forma intuitiva, así que mantendremos las matemáticas fuera, pero, si quieres ir a explorar las matemáticas tras las redes neuronales convolucionales, visita este paper que te dejare a continuación, que explica las matemáticas que operan tras el telón:

Publicación: Convolutional neural networks por Jianxin Wu

Entonces, ¿que es una convolucion?

Aquí tenemos los elementos clave, La imagen y el detector de propiedades, obviamente no tendrán valores de 1 y 0, pero con esos valores se puede explicar mejor el ejemplo, y otra cosa es que el detector de propiedades puede ser de cualquier tamaño, lo mas común es 3×3, también algunos llaman al detector de propiedades con el nombre de Feature Detector, Kernel, Filter. Estos tres términos hacen referencia a nuestro detector de propiedades, tienes que tener bien en cuenta estos nombres, porque en algunas librerías se usan los unos o los otros.

Entonces la operación de convolucion, no es mas que una multiplicación elemento por elemento con ciertas propiedades.

entonces esta operación data como resultado una matriz llamada Matriz de propiedades, que es solo una tabla donde pongamos el resultado de las operaciones, entonces empezamos multiplicando las dos matrices

1*0 + 1*1 = 1

0*1 + 1*0 = 0

1 + 0 = 1

Y luego de hacer este computo va a mover el resultado al mapa de propiedades, en orden

Y luego se moverá tantos espacios como indique el valor de “strides”, si han trabajado antes con redes neuronales convolucionales, deberían recordar el llamado valor “strides”, ese valor hace referencia a la cantidad de pasos que mi filtro (detector de propiedades), en la imagen. Para dejarlo mas claro miren esta imagen:

Como ven si mi valor de Strides = 2 me moveré dos espacios, pero si mi Strides = 1 me moveré 1 espacio, entonces esta operación se repetirá hasta terminar la matriz, como podemos ver en este gif que prepare, en esta caso mi valor de Strides = 1

Esta matriz de propiedades, también es llamada “Feature Map”, “Feature Matrix”, “Convolved Feature” o “Activation Map”, pero cuando nombran cualquiera de estos términos, se están refiriendo a la matriz verde del gif yo lo llamare matriz de propiedades.

¿Entonces que hicimos aquí?. Primero redujimos el tamaño de la imagen, y es algo importante a mencionar, porque esta reducción de tamaño, esta relacionada con el valor de Strides, si tu valor de Strides, es demasiado alto la imagen se reduce mas, así que el valor no debe ser ni muy bajo ni alto, si no lo justo dependiendo el caso, de hecho el valor mas común es Strides = 2 y suele ser el mas efectivo.

Entonces redujimos el valor de nuestra imagen, pero ¿perdimos información?, la respuesta es si y no, Si porque redujimos el tamaño y no porque lo que hicimos fue detectar ciertas propiedades relevantes, es decir, cuando hacemos esta operación, solo nos quedamos con la información que forma parte integral en el resultado, ¿recuerdas antes cuando hablábamos de las ilusiones ópticas?, no teníamos que fijarnos en la imagen completa para interpretar un resultado distinto, solo tomábamos ciertas características y casi por arte de magia nuestro cerebro se hacia cargo de interpretar otro resultado, lo mismo pasa aquí, no nos fijamos en la imagen completa, solo en las características que nos permiten identificar que es lo que esta presente dentro de la imagen, y esta operación es la encargada de seleccionar esas características que hacen que nuestra red “vea” un resultado o el otro.

Teniendo esto claro, ahora quiero hablarte de donde salen los valores de nuestro, detector de propiedades, y es que ciertamente en este punto debes tener la idea de que solo hay una matriz de propiedades, pero en realidad creamos múltiples mapas de propiedades, porque usamos distintos filtros, para nuestro detector de propiedades, y esto a su vez nos permite perder menos informacion y capturar mas propiedades integrales que forman parte del resultado.

Entonces cada una de estas matrices de propiedades aplico un detector de propiedades distinto con valores distintos, por eso el detector de propiedades, es mucho mas eficiente el filtro, porque hay redes convolucionales que solo funcionan con un filtro, pero el detector de propiedades aplica muchos filtros a la vez, y ahora veremos algunos de ellos

Fuente Imagen: https://docs.gimp.org/2.8/en/plug-in-convmatrix.html

Esto es demasiado visual e intuitivo, como vemos el 5 esta realzando el pixel del medio y los -1 están reduciendo aun mas los pixeles que lo rodean y a su vez borrando todos los otros pixeles que lo rodean

Fuente Imagen: https://docs.gimp.org/2.8/en/plug-in-convmatrix.html

Este filtro lo que esta haciendo es sumar todos los valores, del centro y borrar los valores de al rededor si lo pasamos por a imagen obtenemos ese resultado.

Fuente Imagen: https://docs.gimp.org/2.8/en/plug-in-convmatrix.html

Aquí estas borrando todos los pixeles de la imagen y el del medio lo dejas igual e inviertes el valor de la izquierda.

Como estamos viendo si queremos conservar algo es 1 si queremos intensificar algo subimos el valor y si queremos borrar algo es 0, en si es algo bastante visual.

Fuente Imagen: https://docs.gimp.org/2.8/en/plug-in-convmatrix.html

Aquí estamos reduciendo el valor del medio quedándonos con los de al rededor pero borrando los que están en las esquinas del filtro.

Fuente Imagen: https://docs.gimp.org/2.8/en/plug-in-convmatrix.html

Este filtro lo que esta haciendo es romper la simetría de la imagen, si te das a la tarea de observar es como si dos imágenes se superpusieran asimétricamente, esto es algo técnico, pero no se como explicarlo de mejor forma solo debes observar la imagen y relacionarla con el filtro.

Pero no quiero que entiendas estos filtros, lo único que quiero es que te vallas con la conclusión, de que las capas convolucionales, funcionan en base a borrar cierta información de la imagen y maximizar otro tipo de información que puede ser parte integral del resultado con el fin de reducir el tamaño de la imagen para hacer el procesamiento mas rápido.

¿Que hacemos luego de haber calculado todo esto?. Lo que debemos hacer es aplicar nuestra función rectificadora (ReLU). Y la razón para hacer esto, es incrementar la no linealidad, en nuestro resultado, y la función rectificadora, rompe la linealidad en la imagen resultante de la convolucion. y la razón para hacer esto, es porque una imagen tiene muchos elementos no lineales, que nosotros como seres humanos sabemos distinguir, sabemos decir donde empieza una cosa y termina otra, pero un algoritmo no puede determinarlo, entonces una solución a esto, es aplicar la función rectificadora, para que sea mas fácil determinar los elementos no lineales de nuestra imagen.

La otra razón es que al haber aplicado diferentes filtros, y haber detectado ciertas propiedades a nuestra imagen para determinar las propiedades importantes de la misma, corremos el riesgo de que nuestro algoritmo nos devuelva un resultado lineal, y para resolver este problema, debemos aplicar la función rectificadora, para romper con esta linealidad pero vamos a un ejemplo mas practico.

Fuente: http://mlss.tuebingen.mpg.de/2015/slides/fergus/Fergus_1.pdf

Aquí tenemos una imagen de entrada, una vez le aplicamos el detector de propiedades queda así

Fuente: http://mlss.tuebingen.mpg.de/2015/slides/fergus/Fergus_1.pdf

Como ves los pixeles negros, son valores negativos y los pixeles blancos valores positivos, tenemos que recordar que una imagen no esta compuesta solo de 1 y 0 tenemos muchos valores distintos y como vimos antes los filtros del detector de propiedades tenia valores negativos, así que casi siempre tendrás valores negativos, y si recordamos nuestra función rectificadora devuelve 0 y si el valor es negativo y el valor en si cuando es positivo. entonces si la aplicamos aquí tendremos este resultado

Fuente: http://mlss.tuebingen.mpg.de/2015/slides/fergus/Fergus_1.pdf

No es fácil ver cual es el beneficio, y es un concepto demasiado matemático y difícil de llevarlo a palabras, por lo que no quiero ahondar en esta parte, porque es matemáticamente beneficioso casi por intuición, pero explicarlo es un poco difícil

Antes de cerrar esta sección quiero recomendarte leer el paper de Jay Kuo que explica mejor este concepto:

Understanding Convolutional Neural Networks with A Mathematical Model Por C.-C Jay Kuo

3. Max Pooling

¿Por que es tan importante el proceso de Max Pooling?. Primero observemos esta imagen.

Esta es la misma imagen de una motocicleta con pequeñas transformaciones, pero sigue siendo una motocicleta, entonces, yo necesito que mi red neuronal sea capaz de determinar de que se trata la imagen sin importar los pequeños cambios que se pueda tener, ahora mira esto.

Estas son imágenes de motocicletas, distintas, que presentan cambios en la posición, algunas están en otro angulo, rotadas, y es que cualquier tipo de imagen que sea distinta a la otra, pero en ella este presente el mismo elemento en este caso la motocicleta, es imposible que sean iguales entre si, y el proceso de Max Pooling nos brinda la flexibilidad necesaria para que nuestra red neuronal sea capaz de determinar que es una motocicleta sin importar los cambios entre una y otra imagen, ¿y esto como es posible?.

Aquí tenemos nuestra matriz de propiedades, después de haber sido sometida al proceso de Convolucion, entonces luego de entonces lo que pasara en el proceso de Max Pooling, es que escoger los valores mas altos, que como habíamos dicho son las propiedades importantes dentro de mi imagen, y lo haré de una forma similar a como lo hice en mi proceso de convolucion.

Voy a poner una matriz de cualquier tamaño en este caso es de (2,2) y la voy a mover con un valor de Strides de igual forma que en mi Convolucion, por la imagen para conseguir todos los valores mas altos que al final son los que forman parte integral de mi resultado. Lo que hay que tener en cuenta es que, en mi proceso de Convolucion, era importante que mi filtro, calzara perfectamente con el tamaño de mi imagen, para no salirme de ella, pero en este caso, eso no es importante. Entonces lo que haremos sera lo siguiente

Voy a seleccionar los valores mas altos de mi matriz de propiedades, y obtendré un resultado como este.

Aquí lo que hicimos fue deshacernos de 75% de la imagen, pero sin perder la información importante de la misma, porque recordemos que lo que nos interesa conservar son los valores altos, y de este modo es muy fácil procesar la imagen, porque de una imagen sumamente grande nos quedamos solo con las partes importantes de la misma.

Y eso nos lleva a la siguiente sección donde sucede la magia.

4. Conexión Total

Como habrás intuido, por la arquitectura de las Redes Neuronales Convolucionales, no están totalmente conectadas, entonces el problema que se hace evidente es, ¿Como voy a pasar esta información a mi perceptron?.

Y la forma de solucionar este problema, es algo relativamente simple, vamos a tomar la información de nuestras capas de Max Pooling y ponerla en una columna, con el fin de aplanara para que pueda pasar al perceptron, y este proceso se llama Flattening, y se logra con una capa llamada Flatten, y se vería mas o menos como esto.

y de esta forma pasamos toda nuestra información de las capas convolucionales hacia el perceptron, para que haga el proceso de clasificar estos valores, y encasillarlos en las categorías que le hemos pasado con el dataset y hace el proceso de Forward Propagation y Back Propagation que vimos en el articulo anterior, la única diferencia notable seria que se ajustan los pesos como normalmente se hace, pero también se actualizan los valores de los filtros, de esta forma la Red Neuronal, puede comparar de cierta manera, que si las características que se están seleccionando son las correctas, se repite a lo largo de todo el dataset.

Otra cosa a destacar es que en el caso anterior podíamos tener 1 neurona para predecir 2 valores, pero aquí por la forma en que se calcula la perdida (Que hablaremos de ello luego) para ajustar los pesos, y los filtros, me inclino por tener una neurona de salida por cada categoría que tengamos en el dataset, si tenemos un dataset para clasificar perros y gatos, en lugar de tener una neurona que me de valores de 0 para gato, y 1 para perro, recomiendo encarecidamente tener una neurona por cada una de las categorías de nuestros datos, entonces quedaría de esta forma

Pero… ¿Como es que esta red neuronal es capaz de sacar una señal por una neurona y por otra no?, quizás te lo estés preguntando como lo hice yo en mi momento, y no es algo tan complicado, pero lo explicare en detalle en la sección opcional, pero aquí mantengamoslo simple.

Entonces primero enfoquémonos en el la neurona de salida del perro del perro.

Digamos que tengamos los siguientes valores en la ultima capa, las neuronas que tienen como valor 1 son las que mas se activaron durante la predicción, entonces la neurona del perro se activa, ¿Como saben las neuronas cuando activarse si esas neuronas están conectadas con las dos, no deberían activarse las dos?. Durante el proceso de entrenamiento gracias a la función de perdida estas neuronas de salida aprendieron a que neuronas debían poner atención para activarse, de cierta forma estas neuronas aprendieron que valores de entrada eran importantes y cuales no.

Imagina que la primera neurona de arriba, corresponde a una característica de un perro, por ejemplo orejas largas, y la que esta abajo corresponde a una característica de un gato, por ejemplo bigote, entonces cuando la neurona detecta unas orejas largas en la imagen, es como si las neuronas del perro dicen, podría ser un perro y calculan la probabilidad, no te hagas a la idea que si se detectan orejas de perro las otras neuronas permanecerán desactivadas, igual van a activarse un poco, pero nosotros para saber que categoría es a la que pertenece la imagen, debemos tomar el valor mayor de nuestra matriz de resultados. Pero a grandes rasgos así es como se predice el resultado.

4. Softmax y Cross-Entropy (Bloque Opcional)

Con los conocimientos que has adquirido antes de llegar hasta esta sección ya puedes saltar al bloque practico, pero si quieres saber un poco mas a fondo como funciona la predicción en las redes convolucionales, puedes leer este bloque.

Habíamos dicho que la red neuronal aprendía a que neuronas ponerle atención, pero en realidad, matemáticamente, como podría un algoritmo determinar a que neurona ponerle o no esa atención, como sabe que valores sumar y cuales no, y es que esto realmente no se puede en las redes neuronales tradicionales, esto pasa porque nosotros introducimos una función que se llama softmax para poder favorecer esta situación, es muy probable que ya sepas de esta función si has aplicado redes neuronales convolucionales antes, pero si quieres saber como funciona quédate aquí.

Función Softmax

Realmente los valores que arroja la red neuronal al predecir algo, serian muy distintos, de no ser por esta función. Porque realmente de las ultimas neuronas, la salida es literalmente cualquier numero real, pero esta función se encarga de llevar ese valor mas cerca del 0 y del 1.

La función softmax no viene sola, porque viene de la mano con la función llamada Cross-Entropy, si esto aun no te hace sentido, no te preocupes que iremos profundizando poco a poco en como es que esto funciona.

Función Cross-Entropy

Entonces, que es la función Cross-Entropy, si te acuerdas en el articulo anterior teníamos la función denominada “La suma de los errores al cuadrado” que nos ayudaba a calcular el valor de perdida para luego ajustar los pesos de nuestra red neuronal a través de el proceso de back propagation, por decirlo de alguna manera, esta función es el equivalente al mse pero para las redes neuronales convolucionales, aunque podrías seguir usando la función mse pero créeme que esta función es la mejor opción.

Esta es la función que tenemos que minimizar, en el proceso de entrenamiento de nuestra red neuronal, es decir, que en la ultima capa la función de activación tendría que ser softmax, para luego pasarla a la función de cross entropy, ten esto muy en cuenta. Vamos a ver de forma mas practica un ejemplo de como esto funciona y que entiendas mejor la idea que quiero explicarte.

¿Como ocupo la formula?, Aquí mi red hizo una predicción (q), esta función se aplica a todas las predicciones del dataset pero digamos que tenia un dataset de 1 imagen, entonces algo a tener en cuenta es que mi valor precedido es el segundo parámetro y el dato real es el primero, y si quiero aplicar la formula tengo que tener esto muy en cuenta porque o si no saldrán valores erróneos porque le estaré aplicando el logaritmo a mi dato de entrenamiento.

¿Porque es tan beneficioso usarla?, Una vez aclarado lo anterior, veamos una imagen, aquí durante el entrenamiento obtuve los siguientes resultados.

Mis dos redes neuronales tuvieron las dos primeras predicciones correctas, y ambas se equivocaron en el ultimo valor, pero notemos que mi segunda red neuronal tuvo un peor desempeño, entonces lo que haré va a ser aplicar la función MSE y Cross Entropy a estos resultados, para comparar.

Quizás no lo veas a simple vista, pero te daré una pista, la función MSE da valores mas bajos que la función Cross Entropy, es decir, la función MSE no esta calculando el mínimo real de mi función, es decir, que con la función MSE nunca llegare a minimizar el error real, aunque mi error sea de 0, la red neuronal seguirá cometiendo errores, porque esta función descubrió un mínimo local, no un mínimo real. Y esto siempre pasara en el casos de clasificación.

Pero en el de solo tener dos categorías te recomiendo poner a la capa de salida la función sigmoide como activación, y como función de perdida la función Binary Crossentropy para realizar una clasificación binaria entre dos categorías donde 0 representara a una de ellas y 1 a la otra.

Leer es aprender; practicar también es aprender, y es una forma más importante de aprender.

-Mao Zedong

5. implementación en Tensorflow Keras API

Ahora vamos a implementar una Red Neuronal Convolucional muy básica en Tensorflow con la API de Keras, Vamos a resolver el problema clásico de Perros contra Gatos. El dataset que estoy usando te lo dejo aquí. Lo escogí porque básicamente es la versión mas ordenada de este dataset que encontré:

FastAi Dog vs Cats

Y te recomiendo entrenar esta red si o si, en google colab, si no sabes como descargar un dataset desde google colab, te dejo el código de como descargue y descomprimí el dataset.

Google Colab

Anteriormente pre procesamos nuestros datos y luego armamos el modelo, ahora no hay nada que pre procesar porque son imágenes, no tenemos valores categóricos, solo valores continuos, entonces no hace falta hacer un pre procesamiento tan largo, por lo que, vamos a explicar como armamos el modelo, explicare detalladamente como armar nuestra capa de Convolucion. Primero vamos a importar nuestras capas

Vamos a usar un modelo secuencial, que ya sabemos lo que es, vamos a ir apilando las capas una tras otra, para al momento de compilar, se conecten, y se declaren los procesos de backpropagation, y todo lo que ya hemos visto, y lo demás son todas las capas que hemos visto a lo largo de este documento. Vamos a instaciar nuestro modelo y armar la primera capa de convolucion.

Vamos a detenernos aquí para explicar los argumentos.

El primer argumento es la cantidad de matrices de propiedades que vamos a tener como salida en este caso tendremos 128 filtros, que vamos a aplicar a nuestra imagen. iré haciendo una representación gráfica de nuestro modelo mientras vamos avanzando, y vamos a tener un detector de propiedades de (3×3), y vamos a moverlo de 1 pixel en 1, y ese es mi argumento Strides, el argumento input_shape, es para definir el tamaño de mis imágenes de entrada, que en este caso le pasare imágenes de (64×64), a color, es decir con canales RGB por lo que mi matriz de entrada tendrá un tamaño de (64x64x3) y el ultimo es el numero de canales, y ponemos nuestra función rectificadora, y nuestra salida se va a ver así

Ahora vamos a poner la capa de MaxPooling.

Esto recordemos que va a reducir el tamaño de nuestros filtros de 3×3 a 2×2, los strides no es necesario ponerlos, generalmente aquí usamos los parámetros por defecto, y cuando lo dejamos por defecto, los strides seran igual a nuestro pool size, en este caso strides= 2.

Ahora voy a agregar otra capa de convolucion y max pooling

Ahora vamos a hacer la conexión total con la capa flatten, que no lleva ni un argumento, solo convierte cualquier matriz a un vector columna.

Ahora vamos a conectarlo con el perceptron

En este caso tendremos 256 neuronas en la capa oculta, y una neurona de salida, porque tenemos un dataset de 2 categorías “perro o gato” así que vamos a hacer una clasificación binaria. Y para ello recordemos que tenemos que tener la función sigmoide, en el caso de tener mas categorías deberíamos tener una neurona para cada una de las categorías, y de funcion de activación softmax recuerda.

Por ultimo vamos a compilar

Y así se vería nuestro modelo actualmente

Código Completo:

6. Pre procesando, Entrenando, y Prediciendo

Como el pre procesado es mas simple usare una de las herramientas de pre procesado de imágenes que keras trae por defecto, que es el ImageDataGenerator. Para importarla haremos lo siguiente

Ahora vamos a instanciar este Objeto, y vamos hacer dos distintos, uno para el set de entrenamiento, y otro para el set de prueba.

Con el fin de evitar el overfitting, vamos a aplicarle unas transformaciones, como rotaciones, zoom e invertirla en el eje horizontal, el argumento mas importante, es el reescale, se acuerdan en el articulo anterior, debíamos normalizar los valores entre 0 y 1, aqui haremos lo mismo con todos los valores de la imagen, entonces como dijimos el valor mas alto que podía tener un valor dentro de la matriz de una imagen es 255, vamos a dividir todos los valores por ese numero, para expresar esto debemos pasarle como argumento 1./255 y el dataset de prueba no le aplicaremos transformaciones, porque no se necesitan, ya que solo queremos predecir de que se trata.

Aquí vamos a definir el tamaño de nuestra imagen en función de la capa de entrada de nuestro modelo que es de (64,64,3) entonces tenemos que re escalar cada imagen a 64×64 para pasarla por la capa de entrada, cuando entrenamos una red con un generador, en la función fit del modelo no tenemos la opción batchsize, porque es el generador que va a pasar los minibaches, y como tenemos 1 salida tenemos que codificar nuestras etiquetatas de manera binaria, la cualidad de esta manera de procesar los datos, es que tratara cada carpeta de nuestro dataset como una categoría.

Antes de entrenar en google colab, vamos a hacer lo siguiente, vamos a ir a la pestaña de dice entorno de ejecución, y vamos a seleccionar la opción cambiar tipo de entorno de ejecución.

Y en la opción acelerador de hardware pondremos GPU

Ahora si estamos listos para entrenar.

Entrenamos nuestro modelo. Yo en 25 épocas alcance una precisión de 77% y ahora quiero hablar que esta es la razón por la que no recomiendo entrenar modelos convolucionales desde cero, necesitamos muchos datos, y muchas épocas y eso de traduce en mucho tiempo, luego de ver nuestra sección de LSTM te enseñare como realmente podemos entrenar modelos convolucionales de manera mas rápida y con un valor de precisión mayor en datasets gigantes de imágenes, pero por ahora es una introducción.

Ahora vamos a hacer una predicción voy a usar esta imagen

Autor: Lui Peng

Para subir una imagen a google colab, lo haremos de la siguiente manera

Ahora vamos a pre procesar la imagen que yo la tengo con el nombre p.jpg para ello importaremos dos librerias

Y una vez cargada la imagen haremos lo siguiente

Primero cargaremos nuestra imagen, y la re escalaremos a 64×64 para pasarla a nuestro modelo para hacer la predicción, luego pasaremos nuestra imagen a matriz, y vamos a expandir sus dimensiones, porque nuestra entrada recibe en realidad una matriz de 4 dimensiones, que es en el siguiente formato (Cantidad de imágenes, Ancho de la imagen, Alto de la imagen, Canales de color)

Entonces al tener solo este formato (Ancho de la imagen, Alto de la imagen, Canales de color), por lo que nuestra red neuronal no sera capaz de procesarlo, así que tenemos que decirle que es 1 imagen y la forma de la matriz resultante del ultimo comando seria esta (1,32,32,3).

Y ahora haremos la predicción, y vamos a ver que predijo nuestra red

Resultado: [[1]]

Etiquetas: {‘cats’: 0, ‘dogs’: 1}

La predicción fue correcta, ahora veremos como guardar el modelo en google drive, con google colab, primero vamos a montar nuestro drive en el directorio actual, para ello corremos el siguiente código.

Nos va a pedir una autenticacion muy fácil de hacer, para que google colab tenga permisos de acceder a nuestro drive.

Yo creare una nueva carpeta, y para guardar el modelo usare la función save del objeto Sequential. Luego lo puedes bajar a tu computador, y lo cargamos de esta manera.

Y de esta manera podemos guardar el progreso de nuestro modelo y usarlo mas tarde. Con esto concluimos y pasemos a los agradecimientos.

Codigo Completo:

7. Agradecimientos

Bueno hoy aprendimos lo mas básico de las redes neuronales convolucionales, aprendimos como funcionan y como implementarlas, si este articulo te ayudo aprieta el botón CLAP!, y compártelo con tus conocidos que les interese este tema, y de paso agradecer por el cálido recibimiento de mi anterior articulo, me encanta que la gente este interesada en el material que hago. Así que, si quieres que siga haciendo artículos sobre este tema, sígueme apoyando, con tu apoyo es como yo me doy por pagado. Hasta la próxima ! :D