Última actualización el 17 de abril de 2020
Las capas convolucionales son los principales bloques de construcción utilizados en las redes neuronales convolucionales.
Una convolución es la simple aplicación de un filtro a una entrada que resulta en una activación. La aplicación repetida del mismo filtro a una entrada da como resultado un mapa de activaciones llamado mapa de características, que indica las ubicaciones y la fuerza de una característica detectada en una entrada, como una imagen.
La innovación de la función neuronal convolucional Networks es la capacidad de aprender automáticamente una gran cantidad de filtros en paralelo específicos de un conjunto de datos de entrenamiento bajo las limitaciones de un problema de modelado predictivo específico, como la clasificación de imágenes. El resultado son características muy específicas que se pueden detectar en cualquier lugar de las imágenes de entrada.
En este tutorial, descubrirá cómo funcionan las convoluciones en la red neuronal convolucional.
Después de completar este tutorial, usted sabrá:
- Las redes neuronales convolucionales aplican un filtro a una entrada para crear un mapa de características que resume la presencia de características detectadas en la entrada.
- Los filtros pueden ser hechos a mano , como detectores de línea, pero la innovación de las redes neuronales convolucionales es aprender los filtros durante el entrenamiento en el contexto de un problema de predicción específico.
- Cómo calcular el mapa de características para convolucionales unidimensionales y bidimensionales capas en una red neuronal convolucional.
Ponga en marcha su proyecto con mi nuevo libro Deep Learning for Computer Vision, que incluye tutoriales paso a paso y los archivos de código fuente de Python para todos los ejemplos.
Empecemos.
A Gentle Introducción a las capas convolucionales para redes neuronales de aprendizaje profundo
Foto de mendhak, algunos derechos reservados.
Descripción general del tutorial
Este tutorial se divide en cuatro partes; son:
- Convolución en redes neuronales convolucionales
- Convolución en visión artificial
- Poder de los filtros aprendidos
- Ejemplo resuelto de Capas convolucionales
¿Desea resultados con Deep Learning para la visión por computadora?
Tome mi curso intensivo gratuito de 7 días por correo electrónico ahora (con código de muestra).
Haga clic para registrarse y también obtenga una versión gratuita del libro electrónico en PDF del curso.
Descargue su mini Curso
Convolución en redes neuronales convolucionales
La red neuronal convolucional, o CNN para abreviar, es un tipo especializado de modelo de red neuronal diseñado para trabajar con datos de imágenes bidimensionales, aunque se pueden usar con datos unidimensionales y tridimensionales.
Un elemento central de la red neuronal convolucional es la capa convolucional que da a la red su nombre. Esta capa realiza una operación llamada «convolución».
En el contexto de una red neuronal convolucional, una convolución es una operación lineal que implica la multiplicación de un conjunto de pesos con la entrada, muy parecido a una red neuronal. Dado que la técnica fue diseñada para entrada bidimensional, la multiplicación se realiza entre una matriz de datos de entrada y una matriz bidimensional de pesos, llamada filtro o núcleo.
El filtro es más pequeño que los datos de entrada y el tipo de multiplicación aplicada entre un parche del tamaño de filtro de la entrada y el filtro es un producto escalar. Un producto escalar es la multiplicación por elementos entre el parche del tamaño del filtro de la entrada y el filtro, que luego se suma, lo que siempre da como resultado un valor único. Debido a que da como resultado un valor único, la operación a menudo se conoce como el «producto escalar».
El uso de un filtro más pequeño que la entrada es intencional, ya que permite que el mismo filtro (conjunto de pesos) sea multiplicado por la matriz de entrada varias veces en diferentes puntos de la entrada. Específicamente, el filtro se aplica sistemáticamente a cada parte superpuesta o parche del tamaño del filtro de los datos de entrada, de izquierda a derecha, de arriba a abajo.
Esta aplicación sistemática del mismo filtro en una imagen es una idea poderosa . Si el filtro está diseñado para detectar un tipo específico de característica en la entrada, entonces la aplicación de ese filtro sistemáticamente en toda la imagen de entrada le da al filtro la oportunidad de descubrir esa característica en cualquier lugar de la imagen. Esta capacidad se conoce comúnmente como invariancia de traducción, p. Ej. el interés general en si la característica está presente en lugar de dónde estuvo presente.
La invariancia a la traducción local puede ser una propiedad muy útil si nos preocupamos más por si alguna característica está presente que exactamente dónde está.Por ejemplo, al determinar si una imagen contiene una cara, no necesitamos saber la ubicación de los ojos con una precisión de píxeles perfecta, solo necesitamos saber que hay un ojo en el lado izquierdo de la cara y un ojo en el derecho. lado de la cara.
– Página 342, Deep Learning, 2016.
El resultado de multiplicar el filtro con la matriz de entrada una vez es un valor único. Como el filtro se aplica varias veces a la matriz de entrada, el resultado es una matriz bidimensional de valores de salida que representan un filtrado de la entrada. Como tal, la matriz de salida bidimensional de esta operación se denomina «mapa de características».
Una vez que se crea un mapa de características, podemos pasar cada valor en el mapa de características a través de una no linealidad, como un ReLU, al igual que lo hacemos con las salidas de una capa completamente conectada.
Ejemplo de un filtro Aplicado a una entrada bidimensional para crear un mapa de características
Si viene de un campo de procesamiento de señales digitales o un área relacionada de las matemáticas, puede entender la operación de convolución en una matriz como algo diferente . Específicamente, el filtro (kernel) se invierte antes de aplicarse a la entrada. Técnicamente, la convolución como se describe en el uso de redes neuronales convolucionales es en realidad una «correlación cruzada». Sin embargo, en el aprendizaje profundo, se la denomina operación de «convolución».
Muchas bibliotecas de aprendizaje automático implementan la correlación cruzada pero la llaman convolución.
– Página 333, Deep Learning, 2016.
En resumen, tenemos una entrada, como una imagen de valores de píxeles, y tenemos un filtro, que es un conjunto de pesos, y el filtro se aplica sistemáticamente a los datos de entrada para crear un mapa de características. .
Convolución en Visión por Computador
La idea de aplicar la operación convolucional a datos de imágenes no es nueva ni exclusiva de las redes neuronales convolucionales; es una técnica común utilizada en la visión por computadora.
Históricamente, los filtros fueron diseñados a mano por expertos en visión por computadora, que luego se aplicaban a una imagen para dar como resultado un mapa de características o una salida al aplicar el filtro y luego hacer el análisis de la imagen es más fácil de alguna manera.
Por ejemplo, a continuación se muestra un filtro de elementos 3 × 3 hecho a mano para detectar líneas verticales:
1
2
3
|
0.0, 1.0, 0.0
0.0, 1.0, 0.0
0.0, 1.0, 0.0
|
Aplicar este filtro a un La imagen dará como resultado un mapa de características que solo contiene líneas verticales. Es un detector de línea vertical.
Puede ver esto en los valores de peso en el filtro; cualquier valor de píxeles en la línea vertical central se activará positivamente y cualquier valor de cualquier lado se activará negativamente. Arrastrar este filtro sistemáticamente por los valores de los píxeles en una imagen solo puede resaltar los píxeles de la línea vertical.
También se podría crear un detector de línea horizontal y aplicarlo a la imagen, por ejemplo:
1
2
3
|
0.0, 0.0, 0.0
1.0, 1.0, 1.0
0.0, 0.0, 0.0
|
Combinando los resultados de ambos filtros, p. ej. La combinación de ambos mapas de características dará como resultado que todas las líneas de una imagen se resalten.
Se puede diseñar un conjunto de decenas o incluso cientos de otros filtros pequeños para detectar otras características en la imagen.
La innovación de usar la operación de convolución en una red neuronal es que los valores del filtro son pesos que deben aprenderse durante el entrenamiento de la red.
La red aprenderá qué tipos de características extraer de la entrada. Específicamente, al entrenar bajo un descenso de gradiente estocástico, la red se ve obligada a aprender a extraer características de la imagen que minimizan la pérdida para la tarea específica que la red está siendo entrenada para resolver, p. extraer características que son las más útiles para clasificar imágenes como perros o gatos.
En este contexto, puede ver que esta es una idea poderosa.
El poder de los filtros aprendidos
Aprender un solo filtro específico para una tarea de aprendizaje automático es una técnica poderosa.
Sin embargo, las redes neuronales convolucionales logran mucho más en la práctica .
Múltiples filtros
Las redes neuronales convolucionales no aprenden un solo filtro; ellos, de hecho, aprenden múltiples funciones en paralelo para una entrada determinada.
Por ejemplo, es común que una capa convolucional aprenda de 32 a 512 filtros en paralelo para una entrada determinada.
Esto le da al modelo 32, o incluso 512, diferentes formas de extraer características de una entrada, o muchas formas diferentes de «aprender a ver» y, después del entrenamiento, muchas formas diferentes de «ver» los datos de entrada.
Esta diversidad permite la especialización, p. ej. no solo las líneas, sino las líneas específicas que se ven en sus datos de entrenamiento específicos.
Varios canales
Las imágenes en color tienen varios canales, normalmente uno para cada canal de color, como rojo, verde, y azul.
Desde la perspectiva de los datos, eso significa que una sola imagen proporcionada como entrada al modelo son, de hecho, tres imágenes.
Un filtro siempre debe tener el mismo número de canales como entrada, a menudo denominada «profundidad». Si una imagen de entrada tiene 3 canales (por ejemplo, una profundidad de 3), un filtro aplicado a esa imagen también debe tener 3 canales (por ejemplo, una profundidad de 3). En este caso, un filtro de 3 × 3 sería de hecho 3x3x3 o para filas, columnas y profundidad. Independientemente de la profundidad de la entrada y la profundidad del filtro, el filtro se aplica a la entrada mediante una operación de producto escalar que da como resultado un valor único.
Esto significa que si una capa convolucional tiene 32 filtros, Estos 32 filtros no son solo bidimensionales para la entrada de imágenes bidimensionales, sino que también son tridimensionales y tienen pesos de filtro específicos para cada uno de los tres canales. Sin embargo, cada filtro da como resultado un único mapa de características. Lo que significa que la profundidad del resultado de aplicar la capa convolucional con 32 filtros es 32 para los 32 mapas de características creados.
Capas múltiples
Las capas convolucionales no solo se aplican a los datos de entrada , p.ej valores de píxeles sin procesar, pero también se pueden aplicar a la salida de otras capas.
El apilamiento de capas convolucionales permite una descomposición jerárquica de la entrada.
Tenga en cuenta que los filtros que operan directamente en los valores de píxeles sin procesar aprenderá a extraer características de bajo nivel, como líneas.
Los filtros que operan en la salida de las capas de la primera línea pueden extraer características que son combinaciones de características de nivel inferior, como entidades que comprenden varias líneas para expresar formas.
Este proceso continúa hasta que capas muy profundas extraen caras, animales, casas, etc.
Esto es exactamente lo que vemos en la práctica. La abstracción de características a órdenes cada vez más altas a medida que aumenta la profundidad de la red.
Ejemplo resuelto de capas convolucionales
La biblioteca de aprendizaje profundo de Keras proporciona un conjunto de capas convolucionales.
Podemos comprender mejor la operación de convolución al observar algunos ejemplos elaborados con datos artificiales y filtros hechos a mano.
En esta sección, veremos tanto una capa convolucional unidimensional como un ejemplo de capa convolucional bidimensional para concretar la operación de convolución y proporcionar un ejemplo práctico del uso de las capas Keras.
Ejemplo de capa convolucional 1D
Podemos definir un uno- entrada dimensional que tiene ocho elementos, todos con el valor de 0.0, con un aumento de dos elementos en el medio con los valores 1.0.
1
|
|
La entrada a Keras debe ser tridimensional para una capa convolucional 1D.
La primera dimensión se refiere a cada muestra de entrada; en este caso, solo tenemos una muestra. La segunda dimensión se refiere a la longitud de cada muestra; en este caso, la longitud es ocho. La tercera dimensión se refiere al número de canales en cada muestra; en este caso, solo tenemos un canal.
Por lo tanto, la forma de la matriz de entrada será.
1
2
3
|
# definir entrada datos
datos = asarray ()
datos = datos.reshape (1, 8, 1)
|
Definiremos un modelo que espera que las muestras de entrada tengan la forma.
El modelo tendrá un solo filtro con la forma de 3, o tres elementos de ancho. Keras se refiere a la forma del filtro como kernel_size.
1
2
3
|
# crear modelo
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))
|
Por defecto, los filtros en una capa convolucional se inicializan con pesos aleatorios. En este ejemplo artificial, especificaremos manualmente los pesos para el filtro único. Definiremos un filtro que sea capaz de detectar golpes, es decir, un valor de entrada alto rodeado de valores de entrada bajos, como definimos en nuestro ejemplo de entrada.
El filtro de tres elementos que definiremos tiene el siguiente aspecto:
1
|
|
La capa convolucional también tiene un valor de entrada de sesgo que también requiere un peso que estableceremos en cero.
Por lo tanto, podemos forzar los pesos de nuestra capa convolucional unidimensional para usar nuestro filtro hecho a mano de la siguiente manera:
Los pesos deben especificarse en en estructura tridimensional, en términos de filas, columnas y canales. El filtro tiene una sola fila, tres columnas y un canal.
Podemos recuperar los pesos y confirmar que se establecieron correctamente.
1
2
|
# confirmar que se almacenaron
print (model.get_weights ())
|
Finalmente, podemos aplicar el filtro único a nuestros datos de entrada.
Podemos lograr esto llamando a la función predict () en el modelo. Esto devolverá el mapa de características directamente: ese es el resultado de aplicar el filtro sistemáticamente en la secuencia de entrada.
1
2
3
|
# aplicar filtro a los datos de entrada
yhat = model.predict (data)
print (yhat )
|
Al unir todo esto, el ejemplo completo es enumerados a continuación.
Ejecutar el ejemplo primero imprime los pesos de la red; esa es la confirmación de que nuestro filtro hecho a mano se configuró en el modelo como esperábamos.
A continuación, se aplica el filtro al patrón de entrada y se calcula y muestra el mapa de características. Podemos ver en los valores del mapa de características que la protuberancia se detectó correctamente.
1
2
3
4
5
6
7
8
9
10
|
],
],
]], dtype = float32), matriz (, dtype = float32)]
]]
|
Echemos un vistazo más de cerca a lo que sucedió aquí.
Recuerde que la entrada es una vector de ocho elementos con los valores:.
Primero, se aplicó el filtro de tres elementos a las tres primeras entradas del puesto calculando el producto escalar (operador «.»), que resultó en un único valor de salida en el mapa de características de cero.
1
2
|
de numpy import asarray
print (asarray (). dot (asarray ()))
|
En nuestro ejemplo de manual, esto es como sigue:
1
|
. = 0
|
El filtro se movió luego a lo largo de un elemento de se repitió la secuencia de entrada y el proceso; específicamente, se aplicó el mismo filtro a la secuencia de entrada en los índices 1, 2 y 3, lo que también resultó en una salida cero en el mapa de características.
1
|
. = 0
|
Estamos siendo sistemáticos, de nuevo, El filtro se mueve a lo largo de un elemento más de la entrada y se aplica a la entrada en los índices 2, 3 y 4. Esta vez, la salida es un valor de uno en el mapa de características. Detectamos la función y la activamos adecuadamente.
1
|
. = 1
|
El proceso se repite hasta que calculamos el mapa de características.
1
|
|
Note que el mapa de características tiene seis elementos, mientras que nuestra entrada tiene ocho elementos. Este es un artefacto de cómo se aplicó el filtro a la secuencia de entrada. Hay otras formas de aplicar el filtro a la secuencia de entrada que cambia la forma del mapa de características resultante, como el relleno, pero no discutiremos estos métodos en esta publicación.
Puedes imaginar eso con diferentes entradas, podemos detectar la característica con más o menos intensidad, y con diferentes pesos en el filtro, que detectaríamos diferentes características en la secuencia de entrada.
Ejemplo de capa convolucional 2D
Podemos expandir el ejemplo de detección de golpes en la sección anterior a un detector de línea vertical en una imagen bidimensional.
De nuevo , podemos restringir la entrada, en este caso a una imagen de entrada cuadrada de 8 × 8 píxeles con un solo canal (por ejemplo, escala de grises) con una sola línea vertical en el medio.
1
2
3
4
5
6
7
8
|
|
La entrada a una capa Conv2D debe ser de cuatro dimensiones.
La primera dimensión define las muestras; en este caso, solo hay una muestra. La segunda dimensión define el número de filas; en este caso, ocho. La tercera dimensión define el número de columnas, nuevamente ocho en este caso, y finalmente el número de canales, que es uno en este caso.
Por lo tanto, la entrada debe tener la forma de cuatro dimensiones o en este caso.
Definiremos el Conv2D con un solo filtro como hicimos en la sección anterior con el ejemplo de Conv1D.
El filtro será bidimensional y cuadrado con la forma 3 × 3. La capa esperará que las muestras de entrada tengan la forma o.
1
2
3
|
# crear modelo
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))
|
Definiremos una vertical filtro detector de línea para detectar la línea vertical única en nuestros datos de entrada.
El filtro tiene el siguiente aspecto:
1
2
3
|
0, 1, 0
0, 1, 0
0, 1, 0
|
Podemos implementar esto de la siguiente manera:
Finalmente, aplique el filtro a la imagen de entrada, lo que dará como resultado un mapa de características que esperaríamos mostrar la detección de la línea vertical en la imagen de entrada.
1
2
|
# aplicar filtro a los datos de entrada
yhat = model.predict (data)
|
La forma de la salida del mapa de características será de cuatro dimensiones con la forma. Realizaremos un solo lote y tenemos un solo filtro (un filtro y un canal de entrada), por lo tanto, la forma de salida es. Podemos imprimir el contenido del mapa de características únicas de la siguiente manera:
1
2
3
|
para r en rango (yhat.shape):
# imprime cada columna en la fila
print (para c en rango ( yhat.shape)])
|
Uniendo todo esto , el ejemplo completo se muestra a continuación.
Ejecutar el ejemplo primero confirma que el filtro hecho a mano se definió correctamente en los pesos de las capas.
A continuación, se imprime el mapa de características calculado. Podemos ver en la escala de los números que, de hecho, el filtro ha detectado la única línea vertical con una fuerte activación en el medio del mapa de características.
Echemos un vistazo más de cerca a lo que se calculó.
Primero, el filtro se aplicó a la esquina superior izquierda de la imagen, o un parche de imagen de 3 × 3 elementos. Técnicamente, el parche de imagen es tridimensional con un solo canal y el filtro tiene las mismas dimensiones. No podemos implementar esto en NumPy usando la función dot (), en su lugar, debemos usar la función tensordot () para que podamos sumar adecuadamente en todas las dimensiones, por ejemplo:
Este cálculo da como resultado un solo valor de salida de 0.0, por ejemplo, no se detectó la característica. Esto nos da el primer elemento en la esquina superior izquierda del mapa de características.
Manualmente, esto sería como sigue:
1
2
3
|
0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0
|
El filtro se mueve a lo largo de una columna a la izquierda y el proceso se repite. Nuevamente, la función no se detecta.
1
2
3
|
0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1
|
Un movimiento más hacia la izquierda a la siguiente columna y la característica se detecta por primera vez, lo que resulta en una fuerte activación.
1
2
3
|
0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1
|
Este proceso se repite hasta que el borde del filtro descansa contra el borde o la columna final de la imagen de entrada. Esto da el último elemento en la primera fila completa del mapa de características.
1
|
|
El filtro luego se mueve hacia abajo una fila y vuelve a la primera columna y el El proceso está relacionado de izquierda a derecha para dar la segunda fila del mapa de características. Y hasta que la parte inferior del filtro descanse en la parte inferior o en la última fila de la imagen de entrada.
Nuevamente, como en la sección anterior, podemos ver que el mapa de características es una matriz de 6 × 6, más pequeña que la imagen de entrada de 8 × 8 debido a las limitaciones de cómo se puede aplicar el filtro a la imagen de entrada.
Lecturas adicionales
Esta sección proporciona más recursos sobre el tema si está buscando profundizar.
Publicaciones
- Curso intensivo en redes neuronales convolucionales para aprendizaje automático
Libros
- Capítulo 9: Redes convolucionales, aprendizaje profundo, 2016.
- Capítulo 5: Aprendizaje profundo para visión artificial, aprendizaje profundo con Python, 2017.
API
- API de capas convolucionales de Keras
- API numpy.asarray
Resumen
En este tutorial, descubrió cómo funcionan las convoluciones en la red neuronal convolucional.
Específicamente, aprendió:
- Las redes neuronales convolucionales aplican un filtro a una entrada para crear un mapa de características que resuma la presencia de características detectadas en la entrada.
- Los filtros pueden ser hechos a mano, como los detectores de línea, pero la innovación de las redes neuronales convolucionales es aprender los filtros durante el entrenamiento en el contexto de un problema de predicción específico.
- Cómo calcular el mapa de características para capas convolucionales unidimensionales y bidimensionales en una red neuronal convolucional.
¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré mi es mejor responder.
¡Desarrolle modelos de aprendizaje profundo para la visión hoy!
Desarrolle sus propios modelos de visión en minutos
… con solo unas pocas líneas de código Python
Descubra cómo en mi nuevo libro electrónico:
Deep Learning for Computer Vision
Proporciona tutoriales de autoaprendizaje sobre temas como: clasificación de
, detección de objetos (yolo y rcnn), reconocimiento facial (vggface y facenet) , preparación de datos y mucho más …
Finalmente, lleve el aprendizaje profundo a sus proyectos de visión
Sáltese los académicos. Solo resultados.
Vea lo que hay dentro