¿Qué son las capas deconvolucionales?


188

Recientemente leí Redes totalmente convolucionales para la segmentación semántica por Jonathan Long, Evan Shelhamer, Trevor Darrell. No entiendo qué hacen las "capas deconvolucionales" / cómo funcionan.

La parte relevante es

3.3. El muestreo ascendente es una convolución hacia atrás

Otra forma de conectar salidas gruesas a píxeles densos es la interpolación. Por ejemplo, la interpolación bilineal simple calcula cada salida yyoj de las cuatro entradas más cercanas mediante un mapa lineal que depende solo de las posiciones relativas de las celdas de entrada y salida.
En cierto sentido, el muestreo ascendente con factor F es una convolución con un paso de entrada fraccional de 1 / f. Siempre que F sea ​​integral, una forma natural de muestreo ascendente es, por lo tanto, convolución hacia atrás (a veces llamada deconvolución) con un paso de salida de F . Tal operación es trivial de implementar, ya que simplemente invierte los pasos de convolución hacia adelante y hacia atrás.
Por lo tanto, el muestreo ascendente se realiza dentro de la red para el aprendizaje de extremo a extremo mediante retropropagación a partir de la pérdida de píxeles.
Tenga en cuenta que el filtro de deconvolución en una capa de este tipo no necesita ser reparado (p. Ej., Al muestreo ascendente bilineal), pero puede ser aprendido. Una pila de capas de desconvolución y funciones de activación pueden incluso aprender un muestreo ascendente no lineal.
En nuestros experimentos, encontramos que el muestreo en la red es rápido y efectivo para aprender predicciones densas. Nuestra mejor arquitectura de segmentación utiliza estas capas para aprender a muestrear para una predicción refinada en la Sección 4.2.

No creo haber entendido realmente cómo se entrenan las capas convolucionales.

Lo que creo que he entendido es que las capas convolucionales con un tamaño de núcleo aprenden filtros de tamaño k × k . La salida de una capa convolucional con el tamaño del núcleo k , zancada s N y n filtros es de dimensión dim Inputkk×kksnortenorte. Sin embargo, no sé cómo funciona el aprendizaje de capas convolucionales. (Entiendo cómo los MLP simples aprenden con el descenso de gradiente, si eso ayuda).Entrada tenues2norte

Entonces, si mi comprensión de las capas convolucionales es correcta, no tengo idea de cómo se puede revertir esto.

¿Alguien podría ayudarme a comprender las capas deconvolucionales?


3
Este video explica la deconvolución / muestreo: youtu.be/ByjaPdWXKJ4?t=16m59s
user199309

66
Con la esperanza de que pudiera ser útil para cualquiera, hice un cuaderno para explorar cómo la convolución y la convolución transpuesta se pueden usar en TensorFlow (0.11). Quizás tener algunos ejemplos prácticos y cifras puede ayudar un poco más a comprender cómo funcionan.
AkiRoss

1
Para mí, esta página me dio una mejor explicación, también explica la diferencia entre deconvolución y transposición de convolución: intodatascience.com/…
T.Antoni

¿El muestreo ascendente no se parece más a la agrupación hacia atrás que a la convolución estriada hacia atrás, ya que no tiene parámetros?
Ken Fehling

Nota: El nombre "capa deconvolucional" es engañoso porque esta capa no realiza la deconvolución .
user76284

Respuestas:


210

La capa de desconvolución es un nombre muy desafortunado y debería llamarse una capa convolucional transpuesta .

Visualmente, para una convolución transpuesta con paso uno y sin relleno, simplemente rellenamos la entrada original (entradas azules) con ceros (entradas blancas) (Figura 1).

Figura 1

En el caso del paso dos y el relleno, la convolución transpuesta se vería así (Figura 2):

Figura 2

Puede encontrar más (excelentes) visualizaciones de aritmética convolucional aquí .


16
Solo para asegurarme de que lo entendí: "Desconvolución" es más o menos lo mismo que convolución, pero ¿agrega algo de relleno? (Alrededor de la imagen / cuando s> 1 también alrededor de cada píxel)?
Martin Thoma

17
Sí, una capa de deconvolución también realiza convolución. Es por eso que la convolución transpuesta encaja mucho mejor como nombre y el término deconvolución es realmente engañoso.
David Dao

11
¿Por qué dice "sin relleno" en la Figura 1, si realmente la entrada está rellenada con ceros?
Stas S

8
Por cierto: ahora se llama convolución transpuesta en TensorFlow: tensorflow.org/versions/r0.10/api_docs/python/…
Martin Thoma

99
Gracias por esta respuesta muy intuitiva, pero estoy confundido acerca de por qué el segundo es el caso 'stride two', se comporta exactamente como el primero cuando se mueve el kernel.
Demonedge

49

Creo que una forma de obtener una intuición de nivel realmente básica detrás de la convolución es que estás deslizando filtros K, que puedes considerar como plantillas K, sobre la imagen de entrada y producen activaciones K, cada una representando un grado de coincidencia con una plantilla particular . La operación inversa de eso sería tomar activaciones de K y expandirlas en una preimagen de la operación de convolución. La explicación intuitiva de la operación inversa es, por lo tanto, más o menos, la reconstrucción de imágenes dadas las plantillas (filtros) y las activaciones (el grado de coincidencia para cada plantilla) y, por lo tanto, en el nivel intuitivo básico, queremos volar cada activación por la máscara de la plantilla. y sumarlos.

Otra forma de abordar la comprensión de deconv sería examinar la implementación de la capa de deconvolución en Caffe, consulte los siguientes bits de código relevantes:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

Puede ver que está implementado en Caffe exactamente como backprop para una capa convolucional hacia adelante regular (para mí fue más obvio después de comparar la implementación de backprop en cuDNN conv layer vs ConvolutionLayer :: Backward_gpu implementado usando GEMM). Entonces, si trabaja a través de cómo se realiza la propagación hacia atrás para una convolución regular, comprenderá lo que sucede a nivel de cálculo mecánico. La forma en que funciona este cálculo coincide con la intuición descrita en el primer párrafo de esta propaganda.

Sin embargo, no sé cómo funciona el aprendizaje de capas convolucionales. (Entiendo cómo los MLP simples aprenden con el descenso de gradiente, si eso ayuda).

Para responder a su otra pregunta dentro de su primera pregunta, hay dos diferencias principales entre la retropropagación MLP (capa totalmente conectada) y las redes convolucionales:

1) la influencia de los pesos está localizada, así que primero descubra cómo hacer backprop para, digamos, un filtro 3x3 convolucionado con un área pequeña de 3x3 de una imagen de entrada, mapeando a un solo punto en la imagen resultante.

2) los pesos de los filtros convolucionales se comparten para la invariancia espacial. Lo que esto significa en la práctica es que en el paso hacia adelante, el mismo filtro 3x3 con los mismos pesos se arrastra a través de toda la imagen con los mismos pesos para el cálculo hacia adelante para producir la imagen de salida (para ese filtro en particular). Lo que esto significa para backprop es que los gradientes de backprop para cada punto de la imagen de origen se suman en todo el rango que arrastramos ese filtro durante el paso hacia adelante. Tenga en cuenta que también hay diferentes gradientes de pérdida wrt x, w y sesgo ya que dLoss / dx necesita propagarse hacia atrás, y dLoss / dw es la forma en que actualizamos los pesos. w y sesgo son entradas independientes en el DAG de cálculo (no hay entradas anteriores), por lo que no hay necesidad de hacer propagación hacia atrás en ellas.

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

77
Creo que esta es la mejor respuesta para esta pregunta.
kli_nlpr

8
Estoy de acuerdo en que esta es la mejor respuesta. La respuesta principal tiene animaciones bonitas, pero hasta que leí esta respuesta solo parecían circunvoluciones regulares con algo de relleno arbitrario para mí. Oh, cómo la gente se deja llevar por los dulces de los ojos.
Reii Nakano

1
De acuerdo, la respuesta aceptada no explica nada. Esto es mucho mejor.
BjornW

Gracias por tu gran explicación. Actualmente no puedo entender cómo hacer el backprop correctamente. ¿Podría darme una pista sobre eso, por favor?
Bastian

33

Matemáticas paso a paso que explican cómo la convolución de transposición hace un muestreo ascendente 2x con un filtro 3x3 y un paso de 2:

ingrese la descripción de la imagen aquí

El fragmento de TensorFlow más simple para validar las matemáticas:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

Creo que tu cálculo está mal aquí. La salida intermedia debe ser 3+ 2 * 2 = 7, luego para un kernel 3x3 la salida final debe ser 7-3 + 1 = 5x5
Alex

Lo siento, @Alex, pero no entiendo por qué la salida intermedia es 7. ¿Puedes explicarlo?
andriys

2
@andriys En la imagen que has mostrado, ¿por qué se recorta el resultado final?
James Bond

28

Las notas que acompañan a la clase CS231n de Stanford CS : Redes neuronales convolucionales para el reconocimiento visual, por Andrej Karpathy , hacen un excelente trabajo al explicar las redes neuronales convolucionales.

Leer este documento debería darle una idea aproximada sobre:

  • Redes desconvolucionales Matthew D. Zeiler, Dilip Krishnan, Graham W. Taylor y Rob Fergus Departamento de Informática, Courant Institute, Universidad de Nueva York

Estas diapositivas son excelentes para las redes deconvolucionales.


29
¿Es posible resumir el contenido de cualquiera de esos enlaces, en un párrafo corto? Los enlaces pueden ser útiles para futuras investigaciones, pero idealmente una respuesta de intercambio de pila debería tener suficiente texto para abordar la pregunta básica sin necesidad de salir del sitio.
Neil Slater

Lo siento, pero el contenido de estas páginas es demasiado grande para resumirlo en un breve párrafo.
Azrael

12
No se requiere un resumen completo, solo un titular, por ejemplo, "Una red neuronal deconvolucional es similar a una CNN, pero está capacitada para que las características en cualquier capa oculta puedan usarse para reconstruir la capa anterior (y por repetición a través de capas, eventualmente la entrada podría ser reconstruida a partir de la salida). Esto le permite ser entrenado sin supervisión para aprender características genéricas de alto nivel en un dominio problemático, generalmente procesamiento de imágenes "(tenga en cuenta que ni siquiera estoy seguro de si eso es correcto, por lo tanto, no escribo mi propia respuesta).
Neil Slater

66
Aunque los enlaces son buenos, un breve resumen del modelo en sus propias palabras hubiera sido mejor.
SmallChess

11

Acabo de encontrar un gran artículo del sitio web de Theaon sobre este tema [1]:

La necesidad de convoluciones transpuestas generalmente surge del deseo de usar una transformación que vaya en la dirección opuesta a una convolución normal, [...] para proyectar mapas de características en un espacio de dimensiones superiores. [...] es decir, mapear desde un espacio de 4 dimensiones a un espacio de 16 dimensiones, manteniendo el patrón de conectividad de la convolución.

Las convoluciones transpuestas, también llamadas convoluciones de paso fraccionado, funcionan intercambiando los pasos hacia adelante y hacia atrás de una convolución. Una forma de decirlo es notar que el núcleo define una convolución, pero si se trata de una convolución directa o una convolución transpuesta se determina por cómo se calculan los pases hacia adelante y hacia atrás.

La operación de convolución transpuesta se puede considerar como el gradiente de alguna convolución con respecto a su entrada, que generalmente es cómo se implementan las convoluciones transpuestas en la práctica.

Finalmente, tenga en cuenta que siempre es posible implementar una convolución transpuesta con una convolución directa. La desventaja es que generalmente implica agregar muchas columnas y filas de ceros a la entrada, lo que resulta en una implementación mucho menos eficiente.

Entonces, en términos simples, una "convolución transpuesta" es una operación matemática que utiliza matrices (al igual que la convolución), pero es más eficiente que la operación de convolución normal en el caso en el que desea volver de los valores convolucionados al original (dirección opuesta). Por esta razón, en las implementaciones se prefiere la convolución cuando se calcula la dirección opuesta (es decir, para evitar muchas multiplicaciones 0 innecesarias causadas por la matriz dispersa que resulta del relleno de la entrada).

Image ---> convolution ---> Result

Result ---> transposed convolution ---> "originalish Image"

A veces guarda algunos valores a lo largo de la ruta de convolución y reutiliza esa información cuando "regresa":

Result ---> transposed convolution ---> Image

Esa es probablemente la razón por la que erróneamente se llama "deconvolución". Sin embargo, tiene algo que ver con la transposición matricial de la convolución (C ^ T), de ahí el nombre más apropiado "convolución transpuesta".

Por lo tanto, tiene mucho sentido cuando se considera el costo informático. Pagaría mucho más por Amazon gpus si no utilizara la convolución transpuesta.

Lea y vea las animaciones aquí cuidadosamente: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#no-zero-padding-unit-strides-transposed

Alguna otra lectura relevante:

La transposición (o más generalmente, la transposición hermitiana o conjugada) de un filtro es simplemente el filtro coincidente [3]. Esto se encuentra invirtiendo el núcleo en el tiempo y tomando el conjugado de todos los valores [2].

También soy nuevo en esto y agradecería cualquier comentario o corrección.

[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic

[3] https://en.wikipedia.org/wiki/Matched_filter



1
Creo que esta es la mejor respuesta!
kli_nlpr

10

Podríamos usar PCA por analogía.

Cuando se usa conv, el paso hacia adelante es extraer los coeficientes de los componentes principales de la imagen de entrada, y el paso hacia atrás (que actualiza la entrada) es usar (el gradiente de) los coeficientes para reconstruir una nueva imagen de entrada, de modo que La nueva imagen de entrada tiene coeficientes de PC que coinciden mejor con los coeficientes deseados.

Cuando se usa deconv, el pase hacia adelante y el pase hacia atrás se invierten. El pase hacia adelante intenta reconstruir una imagen a partir de los coeficientes de la PC, y el pase hacia atrás actualiza los coeficientes de la PC dados (el gradiente de) la imagen.

El pase hacia adelante deconv hace exactamente el cálculo de gradiente conv en este post: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

Es por eso que en la implementación caffe de deconv (consulte la respuesta de Andrei Pokrovsky), el pase deconv forward llama a backward_cpu_gemm (), y el pase hacia atrás llama a forward_cpu_gemm ().


6

Además de la respuesta de David Dao: también es posible pensar al revés. En lugar de centrarse en qué píxeles de entrada (de baja resolución) se utilizan para producir un único píxel de salida, también puede centrarse en qué píxeles de entrada individuales contribuyen a qué región de píxeles de salida.

Esto se hace en esta publicación de destilación , que incluye una serie de visualizaciones muy intuitivas e interactivas. Una ventaja de pensar en esta dirección es que explicar los artefactos del tablero de ajedrez se vuelve fácil.


5

Convoluciones desde una perspectiva DSP

Llego un poco tarde a esto, pero todavía me gustaría compartir mi perspectiva y mis ideas. Mi formación es física teórica y procesamiento de señales digitales. En particular, estudié las wavelets y las convoluciones están casi en mi columna vertebral;)

La forma en que la gente de la comunidad de aprendizaje profundo habla sobre las circunvoluciones también me resultaba confusa. Desde mi perspectiva, lo que parece faltar es una separación adecuada de las preocupaciones. Explicaré las convoluciones de aprendizaje profundo usando algunas herramientas DSP.

Descargo de responsabilidad

Mis explicaciones serán un poco onduladas y no matemáticamente rigurosas para transmitir los puntos principales.


Definiciones

Xnorte={Xnorte}norte=-={...,X-1,X0 0,X1,...}

ynorteXnorte

(yX)norte=k=-ynorte-kXk

q=(q0 0,q1,q2)X=(X0 0,X1,X2,X3)T

qX=(q1q0 00 00 0q2q1q0 00 00 0q2q1q0 00 00 0q2q1)(X0 0X1X2X3)

knorte

kXnorte=Xnortek

kk-1

kXnorte={Xnorte/ /knorte/ /kZ0 0de otra manera

k=3

3{...,X0 0,X1,X2,X3,X4 4,X5 5,X6 6,...}={...,X0 0,X3,X6 6,...}
3{...,X0 0,X1,X2,...}={...X0 0,0 0,0 0,X1,0 0,0 0,X2,0 0,0 0,...}

k=2

2X=(X0 0X2)=(10 00 00 00 00 010 0)(X0 0X1X2X3)

y

2X=(X0 00 0X10 0)=(10 00 00 00 010 00 0)(X0 0X1)

k=kT


Convoluciones de aprendizaje profundo por partes

qX tenemos lo siguiente:

  • kk(qX) ,
  • k(kq)X ,
  • kq(kX)

q(kX)=q(kTX)=(k(q)T)TX

(q)q

q(kX)=(q1q0 00 00 0q2q1q0 00 00 0q2q1q0 00 00 0q2q1)(10 00 00 00 010 00 0)(X0 0X1)=(q1q20 00 0q0 0q1q20 00 0q0 0q1q20 00 0q0 0q1)T(10 00 00 00 00 010 0)T(X0 0X1)=((10 00 00 00 00 010 0)(q1q20 00 0q0 0q1q20 00 0q0 0q1q20 00 0q0 0q1))T(X0 0X1)=(k(q)T)TX

Como se puede ver, es la operación transpuesta, por lo tanto, el nombre.

Conexión al muestreo ascendente vecino más cercano

2(11)Xq2(11)qXq=(q0 0q1q2)

(11)q=(q0 0q0 0+q1q1+q2q2),

es decir, podemos reemplazar un muestreador ascendente repetido con factor 2 y una convolución con un núcleo de tamaño 3 por una convolución transpuesta con un tamaño de núcleo 4. Esta convolución transpuesta tiene la misma "capacidad de interpolación" pero podría aprender mejores interpolaciones de coincidencia.


Conclusiones y observaciones finales

Espero poder aclarar algunas convoluciones comunes que se encuentran en el aprendizaje profundo un poco separándolas en las operaciones fundamentales.

No cubrí la agrupación aquí. Pero esto es solo un muestreador no lineal y también puede tratarse dentro de esta notación.


Excelente respuesta Tomar una perspectiva matemática / simbólica a menudo aclara las cosas. ¿Estoy en lo cierto al pensar que el término "deconvolución" en este contexto choca con la terminología existente ?
user76284

Realmente no choca, simplemente no tiene sentido. Desconvolución solo una convolución con operador de muestreo ascendente. El término deconvolución suena como si fuera una forma de operación inversa. Hablar de una inversa aquí solo tiene sentido en el contexto de las operaciones matriciales. Se multiplica con la matriz inversa, no con la operación inversa de convolución (como la división frente a la multiplicación).
André Bergner

zθX=zzθz=X

θz=Xz=(θ)+X

En resumen, la llamada "capa de deconvolución" del OP no está realmente haciendo deconvolución. Está haciendo otra cosa (lo que describiste en tu respuesta).
user76284

4

Tuve muchos problemas para comprender qué sucedió exactamente en el documento hasta que encontré esta publicación de blog: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation -with-tensorflow-and-tf-slim /

Aquí hay un resumen de cómo entiendo lo que está sucediendo en un muestreo superior 2x:

Información de papel

  • ¿Qué es el muestreo ascendente?
  • ¿Cuáles son los parámetros de esa convolución?
  • ¿Los pesos son fijos o entrenables?
    • El documento establece que "inicializamos el muestreo ascendente 2x a la interpolación bilineal, pero permitimos que se aprendan los parámetros [...]".
    • Sin embargo, la página correspondiente de github dice "En nuestros experimentos originales, las capas de interpolación se inicializaron en núcleos bilineales y luego se aprendieron. En los experimentos de seguimiento, y esta implementación de referencia, los núcleos bilineales son fijos".
    • → pesos fijos

Ejemplo simple

  1. imagine la siguiente imagen de entrada:

Imagen de entrada

  1. Las convoluciones fraccionadamente estriadas funcionan insertando factor-1 = 2-1 = 1 ceros entre estos valores y luego asumiendo stride = 1 más adelante. Por lo tanto, recibirá la siguiente imagen acolchada de 6x6

imagen acolchada

  1. El filtro bilineal 4x4 se ve así. Sus valores se eligen de tal manera que los pesos utilizados (= todos los pesos que no se multiplican con un cero insertado) suman 1. Sus tres valores únicos son 0.56, 0.19 y 0.06. Además, el centro del filtro es, por convención, el píxel en la tercera fila y la tercera columna.

filtrar

  1. Al aplicar el filtro 4x4 en la imagen acolchada (usando padding = 'same' y stride = 1) se obtiene la siguiente imagen muestreada 6x6:

Imagen mejorada

  1. Este tipo de muestreo ascendente se realiza individualmente para cada canal (consulte la línea 59 en https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/surgery.py ). Al final, el muestreo ascendente 2x es realmente un cambio de tamaño muy simple usando interpolación bilineal y convenciones sobre cómo manejar los bordes. El muestreo ascendente de 16x o 32x funciona de la misma manera, creo.