Site Overlay

¡El aprendizaje automático es divertido! Parte 3: Aprendizaje profundo y redes neuronales convolucionales

Podemos entrenar este tipo de red neuronal en unos minutos en un portátil moderno. Cuando haya terminado, tendremos una red neuronal que puede reconocer imágenes de «8» con una precisión bastante alta. Bienvenido al mundo del reconocimiento de imágenes (de finales de los años 80)

Tunnel Vision

¡Es realmente sorprendente que el simple hecho de alimentar una red neuronal con píxeles haya funcionado para crear un reconocimiento de imágenes! ¡El aprendizaje automático es mágico! …¿verdad?

Pues claro que no es tan sencillo.

En primer lugar, la buena noticia es que nuestro reconocedor de «8» realmente funciona bien en imágenes simples donde la letra está justo en el centro de la imagen:

Pero ahora las noticias realmente malas:

Nuestro reconocedor «8» falla totalmente cuando la letra no está perfectamente centrada en la imagen. El más mínimo cambio de posición lo arruina todo:

Esto se debe a que nuestra red sólo ha aprendido el patrón de un «8» perfectamente centrado. No tiene ni idea de lo que es un «8» descentrado. Conoce exactamente un patrón y sólo un patrón.

Eso no es muy útil en el mundo real. Los problemas del mundo real nunca son tan limpios y simples. Así que tenemos que averiguar cómo hacer que nuestra red neuronal funcione en los casos en los que el «8» no está perfectamente centrado.

Idea de fuerza bruta nº 1: buscar con una ventana deslizante

Ya hemos creado un programa realmente bueno para encontrar un «8» centrado en una imagen. ¿Y si buscamos posibles «8» alrededor de la imagen en secciones más pequeñas, una sección cada vez, hasta que encontremos uno?

Este enfoque se llama ventana deslizante. Es la solución de fuerza bruta. Funciona bien en algunos casos limitados, pero es realmente ineficiente. Tienes que revisar la misma imagen una y otra vez buscando objetos de diferentes tamaños. Podemos hacerlo mejor!

Idea de fuerza bruta #2: Más datos y una red neuronal profunda

Cuando entrenamos nuestra red, sólo le mostramos «8 «s que estaban perfectamente centrados. ¿Y si la entrenamos con más datos, incluyendo «8» en todas las posiciones y tamaños diferentes alrededor de la imagen?

Ni siquiera necesitamos recoger nuevos datos de entrenamiento. Podemos simplemente escribir un script para generar nuevas imágenes con los «8» en todo tipo de posiciones diferentes en la imagen:

Creamos datos de entrenamiento sintéticos creando diferentes versiones de las imágenes de entrenamiento que ya teníamos. Esta es una técnica muy útil!

Usando esta técnica, podemos crear fácilmente un suministro interminable de datos de entrenamiento.

Más datos hacen que el problema sea más difícil de resolver para nuestra red neuronal, pero podemos compensarlo haciendo que nuestra red sea más grande y así pueda aprender patrones más complicados.

Para hacer la red más grande, simplemente apilamos capa tras capa de nodos:

Lo llamamos «red neuronal profunda» porque tiene más capas que una red neuronal tradicional.

Esta idea existe desde finales de la década de 1960. Pero hasta hace poco, entrenar una red neuronal tan grande era demasiado lento para ser útil. Pero una vez que descubrimos cómo utilizar las tarjetas gráficas 3D (que fueron diseñadas para hacer la multiplicación de matrices realmente rápido) en lugar de los procesadores normales del ordenador, trabajar con grandes redes neuronales de repente se convirtió en algo práctico. De hecho, la misma tarjeta de vídeo NVIDIA GeForce GTX 1080 que se utiliza para jugar a Overwatch puede utilizarse para entrenar redes neuronales con una rapidez increíble.

Pero aunque podamos hacer que nuestra red neuronal sea realmente grande y entrenarla rápidamente con una tarjeta gráfica 3D, eso no nos va a llevar hasta la solución. Tenemos que ser más inteligentes acerca de cómo procesamos las imágenes en nuestra red neuronal.

Piensa en ello. No tiene sentido entrenar una red para que reconozca un «8» en la parte superior de una imagen por separado de entrenarla para que reconozca un «8» en la parte inferior de una imagen como si fueran dos objetos totalmente diferentes.

Debería haber alguna manera de hacer que la red neuronal sea lo suficientemente inteligente como para saber que un «8» en cualquier parte de la imagen es la misma cosa sin todo ese entrenamiento extra. Por suerte… lo hay.

La solución es la convolución

Como humano, sabes intuitivamente que las imágenes tienen una jerarquía o estructura conceptual. Considera esta imagen:

Foto de mi hijo

Como humano, reconoces instantáneamente la jerarquía en esta imagen:

  • El suelo está cubierto de hierba y cemento
  • Hay un niño
  • El niño está sentado en un caballito saltarín
  • El caballito saltarín está encima de la hierba

Lo más importante es que reconocemos la idea de un niño independientemente de la superficie en la que esté. No tenemos que reaprender la idea de niño para cada superficie posible en la que pueda aparecer.

Pero ahora mismo, nuestra red neuronal no puede hacer esto. Piensa que un «8» en una parte diferente de la imagen es una cosa completamente diferente. No entiende que mover un objeto en la imagen no lo convierte en algo diferente. Esto significa que tiene que volver a aprender la identificación de cada objeto en cada posición posible. Eso apesta.

Necesitamos dar a nuestra red neuronal la comprensión de la invariabilidad de la traducción – un «8» es un «8» sin importar en qué parte de la imagen aparezca.

Haremos esto usando un proceso llamado Convolución. La idea de la convolución se inspira en parte en la ciencia de la computación y en parte en la biología (es decir, los científicos locos que literalmente pinchan los cerebros de los gatos con sondas extrañas para averiguar cómo los gatos procesan las imágenes).

Cómo funciona la convolución

En lugar de alimentar imágenes enteras en nuestra red neuronal como una cuadrícula de números, vamos a hacer algo mucho más inteligente que aprovecha la idea de que un objeto es el mismo sin importar dónde aparezca en una imagen.

Así es como va a funcionar, paso a paso –

Paso 1: Romper la imagen en mosaicos de imágenes superpuestas

De forma similar a nuestra búsqueda por ventana deslizante de arriba, vamos a pasar una ventana deslizante sobre toda la imagen original y guardar cada resultado como un mosaico de imagen separado y diminuto:

Al hacer esto, convertimos nuestra imagen original en 77 mosaicos de imagen diminutos de igual tamaño.

Paso 2: Alimentar cada mosaico de imagen en una pequeña red neuronal

Antes, alimentamos una sola imagen en una red neuronal para ver si era un «8». Haremos exactamente lo mismo aquí, pero lo haremos para cada ficha de imagen individual:

Repite esto 77 veces, una vez para cada ficha.

Sin embargo, hay un gran giro: mantendremos los mismos pesos de la red neuronal para cada baldosa de la misma imagen original. En otras palabras, tratamos todos los mosaicos de la imagen por igual. Si aparece algo interesante en cualquier mosaico, marcaremos ese mosaico como interesante.

Paso 3: Guardar los resultados de cada mosaico en una nueva matriz

No queremos perder de vista la disposición de los mosaicos originales. Así que guardamos el resultado de procesar cada baldosa en una rejilla con la misma disposición que la imagen original. El aspecto es el siguiente:

En otras palabras, hemos empezado con una imagen grande y hemos terminado con una matriz un poco más pequeña que registra qué secciones de nuestra imagen original eran las más interesantes.

Paso 4: Downsampling

El resultado del paso 3 fue una matriz que registra qué partes de la imagen original son las más interesantes. Pero esa matriz sigue siendo bastante grande:

Para reducir el tamaño de la matriz, la reducimos utilizando un algoritmo llamado max pooling. Suena elegante, pero no lo es en absoluto.

Sólo miraremos cada cuadrado 2×2 de la matriz y nos quedaremos con el número más grande:

La idea aquí es que si encontramos algo interesante en cualquiera de los cuatro azulejos de entrada que componen cada cuadrado de la cuadrícula 2×2, sólo nos quedaremos con el bit más interesante. Esto reduce el tamaño de nuestra matriz manteniendo los bits más importantes.

Paso final: Hacer una predicción

Hasta ahora, hemos reducido una imagen gigante a una matriz bastante pequeña.

¿Adivina qué? Esa matriz es sólo un montón de números, así que podemos usar esa pequeña matriz como entrada en otra red neuronal. Esta red neuronal final decidirá si la imagen es o no una coincidencia. Para diferenciarla de la etapa de convolución, la llamamos red «totalmente conectada».

Así que, desde el principio hasta el final, nuestra cadena de cinco pasos se parece a esto:

Agregando aún más pasos

Nuestra cadena de procesamiento de imágenes es una serie de pasos: convolución, max-pooling y, finalmente, una red totalmente conectada.

Cuando se resuelven problemas en el mundo real, estos pasos pueden combinarse y apilarse tantas veces como se quiera. Puedes tener dos, tres o incluso diez capas de convolución. Puedes añadir una combinación máxima donde quieras para reducir el tamaño de tus datos.

La idea básica es empezar con una imagen grande y reducirla continuamente, paso a paso, hasta que finalmente tengas un único resultado. Cuantos más pasos de convolución tenga, más complicadas serán las características que su red podrá aprender a reconocer.

Por ejemplo, el primer paso de convolución podría aprender a reconocer los bordes afilados, el segundo paso de convolución podría reconocer los picos utilizando su conocimiento de los bordes afilados, el tercer paso podría reconocer aves enteras utilizando su conocimiento de los picos, etc.

Aquí está el aspecto de una red convolucional profunda más realista (como la que se encontraría en un trabajo de investigación):

En este caso, empiezan con una imagen de 224 x 224 píxeles, aplican la convolución y el max pooling dos veces, aplican la convolución 3 veces más, aplican el max pooling y luego tienen dos capas totalmente conectadas. El resultado final es que la imagen se clasifica en una de las 1000 categorías.

Construcción de la red correcta

Entonces, ¿cómo sabes qué pasos debes combinar para que tu clasificador de imágenes funcione?

Honestamente, tienes que responder a esto haciendo mucha experimentación y pruebas. Puede que tengas que entrenar 100 redes antes de encontrar la estructura y los parámetros óptimos para el problema que estás resolviendo. El aprendizaje automático implica mucho ensayo y error.

Construyendo nuestro clasificador de pájaros

Ahora, por fin, sabemos lo suficiente para escribir un programa que pueda decidir si una imagen es un pájaro o no.

Como siempre, necesitamos algunos datos para empezar. El conjunto de datos gratuito CIFAR10 contiene 6.000 imágenes de aves y 52.000 imágenes de cosas que no son aves. Pero para obtener aún más datos, también añadiremos el conjunto de datos Caltech-UCSD Birds-200-2011 que tiene otras 12.000 fotos de aves.

Aquí están algunas de las aves de nuestro conjunto de datos combinado:

Deja una respuesta

Tu dirección de correo electrónico no será publicada.