¿Cómo son las convoluciones 1x1 lo mismo que una capa completamente conectada?


55

Recientemente leí el comentario de Yan LeCuns sobre convoluciones 1x1 :

En las redes convolucionales, no existen las "capas completamente conectadas". Solo hay capas de convolución con núcleos de convolución 1x1 y una tabla de conexión completa.

Es un hecho que rara vez se entiende que ConvNets no necesita tener una entrada de tamaño fijo. Puede entrenarlos en entradas que producen un solo vector de salida (sin extensión espacial) y luego aplicarlos a imágenes más grandes. En lugar de un solo vector de salida, obtienes un mapa espacial de vectores de salida. Cada vector ve ventanas de entrada en diferentes ubicaciones en la entrada. En ese escenario, las "capas completamente conectadas" realmente actúan como convoluciones 1x1.

Me gustaría ver un ejemplo simple para esto.

Ejemplo

Suponga que tiene una red totalmente conectada. Tiene solo una capa de entrada y una capa de salida. La capa de entrada tiene 3 nodos, la capa de salida tiene 2 nodos. Esta red tiene parámetros. Para hacerlo aún más concreto, supongamos que tiene una función de activación ReLU en la capa de salida y la matriz de peso32=6

W=(011235)R2×3b=(813)R2

Entonces la red es con .f(x)=ReLU(Wx+b)xR3

¿Cómo debería verse la capa convolucional para ser la misma? ¿Qué quiere decir LeCun con "tabla de conexión completa"?

Supongo que para obtener una CNN equivalente, tendría que tener exactamente el mismo número de parámetros. El MLP de arriba tiene parámetros.23+2=8

Respuestas:


29

Su ejemplo

En su ejemplo, tenemos 3 unidades de entrada y 2 de salida. Para aplicar convoluciones, piense en las unidades que tienen forma: [1,1,3]y [1,1,2], respectivamente. En términos de CNN, tenemos mapas de características de 3entrada y 2salida, cada uno con dimensiones espaciales 1 x 1.

Aplicar una n x nconvolución a una capa con kmapas de características requiere que tengas un núcleo de forma [n,n,k]. Por lo tanto, el núcleo de ustedes 1x1convoluciones tiene forma [1, 1, 3]. Necesita 2esos núcleos (o filtros) para producir los 2mapas de características de salida. Tenga en cuenta: las convoluciones realmente son convolutions. El último rara vez se menciona.1×11×1×number of channels of the input

De hecho, si elige como núcleos y sesgo:

w1=(011)R3w2=(235)R3b=(813)R2

La capa conv calculará entonces con .f(x)=ReLU((w1xw2x)+(b1b2))xR3

Transformación en código real

Para un ejemplo de la vida real, también eche un vistazo a mi implementación vgg-fcn . El Código provisto en este archivo toma los pesos VGG, pero transforma cada capa completamente conectada en capas convolucionales. La red resultante produce el mismo resultado que vggcuando se aplica a la imagen de entrada de forma [244,244,3]. (Al aplicar ambas redes sin relleno).

Las capas convolucionales transformadas se introducen en la función _fc_layer(línea 145). Tienen un tamaño de núcleo 7x7para FC6 (que es máximo, ya que a partir pool5de VGG sale un mapa de características de forma [7,7, 512]. Capa FC7y FC8se implementan como 1x1convolución.

"Tabla de conexión completa"

No estoy 100% seguro, pero podría referirse a un filtro / núcleo que tiene la misma dimensión que el mapa de características de entrada. En ambos casos (Código y su Ejemplo) las dimensiones espaciales son máximas en el sentido de que la dimensión espacial del filtro es la misma que la dimensión espacial de la entrada.


"Por lo tanto, el núcleo de ustedes convoluciones 1x1 tiene forma [1, 1, 3]". ¿Qué? Parece haber un mayor malentendido de convoluciones. Pensé que si un núcleo de convolución tiene forma [1, 1, 3], ¿se podría decir que es una convolución 1x1x3? Entonces, ¿la convolución 1x1 solo se trata de la salida, no del núcleo?
Martin Thoma

2
Para mí kernel = filter, ¿estás de acuerdo? >> "Entonces, ¿la convolución 1x1 es solo sobre la salida, no sobre el núcleo? En absoluto. Una 3x3convolución puede tener una forma de salida arbitraria". De hecho, si se usa relleno y stride=1luego el output shape = input shape. >> "Pensé que si un núcleo de convolución tiene forma [1, 1, 3], ¿se podría decir que es una convolución 1x1x3?" No, nunca escuché a alguien hablar de 3x3x512convoluciones. Sin embargo, todos los filtros de convolución que he visto tienen una tercera dimensión espacial igual al número de mapas de características de la capa de entrada.
MarvMind

Como referencia, eche un vistazo al Convolution Democurso Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . O en la API de tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Se supone que los filtros tienen forma [filter_height, filter_width, in_channels, out_channels].
MarvMind

¿Puedo agregar a su respuesta lo que dice "1x1 convoluciones son 1 x 1 x número de canales de entrada"? Esta fue la fuente de mi confusión y sigo olvidando esto.
Martin Thoma

Claro, adelante!
MarvMind

4

Una capa completamente conectada (para el tamaño de entrada con canales y neuronas de salida) NO ES equivalente a una capa de convolución 1x1 sino a una capa de convolución x (es decir, un núcleo grande, del mismo tamaño que la entrada-no pad) con un número de filtros igual a la salida FC / capa oculta (es decir, filtros)nnimnnm

Como solicitó, tiene el mismo número de parámetros que el FCN, es decir, (más sesgo):nnim

FCN: (pesos por capa de entrada = entrada canales) (veces salida / ancho de capa oculta)nnim

CNN: (cada núcleo) (núcleo por canal de entrada) (número de filtros)nnim

( Fuente )


1
Por supuesto, estas dos cosas son equivalentes en el caso especial ; Creo que ahí es donde entra la confusión.n=1
Yibo Yang

2

El kernel equivalente simplemente tiene cualquier forma que tenga la entrada y calcula un producto de punto tensorial. (Uso la palabra "forma" ya que parece haber cierta confusión sobre "tamaño", que a menudo ignora la dimensión del canal / profundidad). No hay "deslizar el núcleo a través de la entrada", ya que el núcleo es tan grande como puede ser. Citando las notas del curso Stanford CS 231n :

cualquier capa FC se puede convertir en una capa CONV. Por ejemplo, una capa FC con K = 4096 que está mirando un volumen de entrada de tamaño 7 × 7 × 512 puede expresarse de manera equivalente como una capa CONV con F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096. En otras palabras, estamos configurando el tamaño del filtro para que sea exactamente el tamaño del volumen de entrada y, por lo tanto, la salida será simplemente 1 × 1 × 4096, ya que solo una columna de profundidad se "ajusta" en el volumen de entrada, dando un resultado idéntico al la capa inicial de FC.

Creo que "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" aquí significa que cada núcleo conv tiene forma 7x7x512, y hay 4096 filtros de este tipo.

La respuesta anterior mencionó que el último fc de AlexNet (que recibe la entrada con forma 1x1x4096 y calcula 1000 puntajes de clase) se implementa como "convolución 1x1". Para completar, cada uno de esos núcleos conv tiene forma 1x1x4096, y hay 1000 de ellos.

Le Cunn también explica esto en el documento de CNN , página 8, descripción de LeNet5:

La capa C5 es una capa convolucional con 120 mapas de características. Cada unidad está conectada a un vecindario 5x5 en los 16 mapas de características de S4. Aquí, debido a que el tamaño de S4 también es 5x5, el tamaño de los mapas de características de C5 es 1x1; Esto equivale a una conexión completa entre S4 y C5.


1

Para cualquier usuario novato de PyTorch como yo, no confunda "capa completamente conectada" con una "capa lineal".

Una capa lineal y convoluciones 1x1 son lo mismo. Me llevó un tiempo comprender que no existe una "capa completamente conectada": es simplemente un aplanamiento de las dimensiones espaciales en un tensor gigante 1D. El aplanamiento hace que cada elemento en todas las ubicaciones espaciales se presente como un mapa de características / canal / dimensión separado (como quiera llamarlo). Por lo tanto, cuando aplicamos una capa lineal en un tensor aplanado , obtenemos una operación completamente conectada , que obviamente no es lo mismo que una convolución 1x1.

Una 1x1convolución es simplemente una suma ponderada de mapas de características de entrada, en la pregunta de OP, 3. O [0] = . Del mismo modo, O [1] = y O [2] = .j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

Las 3 ecuaciones anteriores se abren para convertirse en .O=W2×3X3×1+b2×1

Otras respuestas que afirman que una capa totalmente conectada es simplemente una capa de convolución válida nxn para una entrada de tamaño nxnes confusa (aunque correcta).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.