¿Cómo obtiene la CNN '12 de Krizhevsky 253,440 neuronas en la primera capa?

24

En Alex Krizhevsky, et al. La clasificación de Imagenet con redes neuronales convolucionales profundas enumera el número de neuronas en cada capa (ver el diagrama a continuación).

La entrada de la red es de 150,528 dimensiones, y el número de neuronas en las capas restantes de la red viene dado por 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000.

CNN

Una vista 3D

La cantidad de neuronas para todas las capas después de la primera es clara. Una forma simple de calcular las neuronas es simplemente multiplicar las tres dimensiones de esa capa ( planes X width X height):

  • Capa 2: 27x27x128 * 2 = 186,624
  • Capa 3: 13x13x192 * 2 = 64,896
  • etc.

Sin embargo, mirando la primera capa:

  • Capa 1: 55x55x48 * 2 = 290400

¡Tenga en cuenta que esto no es 253,440como se especifica en el documento!

Calcular tamaño de salida

La otra forma de calcular el tensor de salida de una convolución es:

Si la imagen de entrada es un tensor 3D nInputPlane x height x width, el tamaño de la imagen de salida será nOutputPlane x owidth x oheightdonde

owidth = (width - kW) / dW + 1

oheight = (height - kH) / dH + 1 .

(de la documentación de Torch SpatialConvolution )

La imagen de entrada es:

  • nInputPlane = 3
  • height = 224
  • width = 224

Y la capa de convolución es:

  • nOutputPlane = 96
  • kW = 11
  • kH = 11
  • dW = 4
  • dW = 4

(por ejemplo 11, tamaño del grano , zancada 4)

Al conectar esos números obtenemos:

owidth = (224 - 11) / 4 + 1 = 54 oheight = (224 - 11) / 4 + 1 = 54

Por lo tanto, 55x55nos faltan las dimensiones que necesitamos para que coincida con el papel. Pueden ser rellenos (pero el cuda-convnet2modelo establece explícitamente el relleno en 0)

Si tomamos las 54dimensiones de tamaño, obtenemos 96x54x54 = 279,936neuronas, todavía demasiadas.

Así que mi pregunta es esta:

¿Cómo obtienen 253,440 neuronas para la primera capa convolucional? ¿Qué me estoy perdiendo?

R. Girard
fuente
¿Alguna vez has resuelto esto? Solo para ser pedante con sus cálculos: el ancho y el alto en realidad serían 54.25. Traté de resolver esto, y como primer paso dividí las supuestas 253440 neuronas entre 96 filtros, lo que produce 2640 neuronas por filtro. Este no es un número cuadrado. Entonces, o ambos tenemos un malentendido aquí, o podría haber un error por parte de los autores ... ¿Los ha contactado?
anderas
lo mismo conmigo, esto me confunde mucho. por cierto es cierto que la entrada es 224x224x3? Creo que debe ser 227x227x3. veamos si tenemos 227x227, 5 celdas en la primera izquierda y 5 celdas en la última derecha no pueden ser el centro de la convolución del núcleo con un tamaño de 11x11. Entonces, el primer centro del núcleo es la celda (6,6) y el último centro del núcleo en la primera fila es la celda (6x222). Con stride-4 obtendremos el centro del núcleo en la fila sexta son: celda en la columna: 6,10,14, ..., 222 y la formulación simple para el centro del núcleo-k está en la columna = 6+ (k -1) * 4, de modo que la columna 222 es el k-ésimo centro = (222-6) / 4 +1 = 55.
44
Tenga en cuenta que 48 * 48 * 55 * 2 = 253440, por lo que es posible que tuvieran un error tipográfico al calcular el número de neuronas en la primera capa (multiplicado por 48 en lugar de 55).
tsiki
@Firebug Este es un uso interesante de la etiqueta [referencias]. Pensé que lo usamos solo para preguntas que piden referencias. Pero tal vez estaba equivocado. ¿Lo usas de manera diferente?
ameba dice Reinstate Monica

Respuestas:

8

De la nota estándar sobre NN:

Ejemplo del mundo real. Krizhevsky et al. La arquitectura que ganó el desafío ImageNet en 2012 aceptó imágenes de tamaño [227x227x3]. En la primera capa convolucional, utilizó neuronas con un tamaño de campo receptivo F = 11, zancada S = 4 y sin relleno de cero P = 0. Como (227 - 11) / 4 + 1 = 55, y dado que la capa Conv tenía una profundidad de K = 96, el volumen de salida de la capa Conv tenía un tamaño [55x55x96]. Cada una de las 55 * 55 * 96 neuronas en este volumen estaba conectada a una región de tamaño [11x11x3] en el volumen de entrada. Además, las 96 neuronas en cada columna de profundidad están conectadas a la misma región [11x11x3] de la entrada, pero por supuesto con diferentes pesos. Además, si lees el artículo real, dice que las imágenes de entrada eran 224x224, lo que seguramente es incorrecto porque (224 - 11) / 4 + 1 claramente no es un número entero. Esto ha confundido a muchas personas en la historia de ConvNets y se sabe poco sobre lo que sucedió. Mi mejor conjetura es que Alex usó cero relleno de 3 píxeles adicionales que no menciona en el documento.

ref: http://cs231n.github.io/convolutional-networks/

Estas notas acompañan la clase CS231n de Stanford: Redes neuronales convolucionales para el reconocimiento visual. Para preguntas / inquietudes / informes de errores con respecto a contactar a Justin Johnson con respecto a las tareas, o contactar a Andrej Karpathy con respecto a las notas del curso

Tocino
fuente
¿Es posible dar crédito nombrando al autor de esas notas?
Silverfish
Los autores están claramente referenciados en las notas, ver cs231n.github.io
Bacon
2
Si bien se hace referencia a ellos claramente si sigue el enlace, la cita también aparece aquí, por lo que también se debe dar crédito aquí. Eso es en parte cortesía, pero también porque el enlace puede dejar de funcionar (por ejemplo, si el material se elimina / se paga / se traslada a una nueva dirección). Desafortunadamente, tenemos un problema grave con la "rotura de enlaces" en este sitio, aunque tenemos la intención de servir como un depósito a largo plazo de respuestas de alta calidad a preguntas estadísticas, muchas de nuestras respuestas anteriores se han vuelto obsoletas por enlaces que ya no funcionan . Por lo tanto, generalmente es más seguro tratar de hacer las respuestas lo más autónomas posible.
Silverfish
0

Este artículo es realmente confuso. En primer lugar, el tamaño de entrada de las imágenes es incorrecto 224x224 no da una salida de 55. Esas neuronas son simplemente como píxeles agrupados en uno, por lo que la salida es una imagen 2D de valores aleatorios (valores de neuronas). Entonces, básicamente, el número de neuronas = anchoxaltoxprofundo, no hay secretos para resolver esto.

Moe
fuente