Cómo calcular el número de parámetros de las redes neuronales convolucionales?


No puedo dar el número correcto de parámetros de AlexNet o VGG Net.

Por ejemplo, para calcular el número de parámetros de una capa conv3-256 de VGG Net, la respuesta es 0.59 M = (3*3)*(256*256), es decir (tamaño del núcleo) * (producto de ambos número de canales en las capas de unión), sin embargo, de esa manera, no puedo obtener los parámetros 138M.

Entonces, ¿podría mostrarme dónde está mal mi cálculo, o mostrarme el procedimiento de cálculo correcto?

Author: nbro, 2015-01-30

3 answers

Si se refiere a la red VGG con 16 capas (tabla 1, columna D), entonces 138M se refiere al número total de parámetros de esta red, es decir, incluyendo todas las capas convolucionales, pero también las completamente conectadas.

Mirando la 3ra etapa convolucional compuesta de 3 x conv3-256 capas:

  • el primero tiene N = 128 planos de entrada y F=256 planos de salida,
  • los otros dos tienen N=256 planos de entrada y F=256 planos de salida.

La convolución kernel es 3x3 para cada una de estas capas. En términos de parámetros esto da:

  • 128x3x3x256 (pesos) + 256 (sesgos) = 295,168 parámetros para el primero,
  • 256x3x3x256 (pesos) + 256 (sesgos) = 590,080 parámetros para los otros dos.

Como se explicó anteriormente, debe hacerlo para todas las capas, pero también para las completamente conectadas, y sumar estos valores para obtener el número final de 138M.

-

ACTUALIZACIÓN : el desglose entre las capas dan:

conv3-64  x 2       : 38,720
conv3-128 x 2       : 221,440
conv3-256 x 3       : 1,475,328
conv3-512 x 3       : 5,899,776
conv3-512 x 3       : 7,079,424
fc1                 : 102,764,544
fc2                 : 16,781,312
fc3                 : 4,097,000
TOTAL               : 138,357,544

En particular para las capas completamente conectadas (fc):

 fc1 (x): (512x7x7)x4,096 (weights) + 4,096 (biases)
 fc2    : 4,096x4,096     (weights) + 4,096 (biases)
 fc3    : 4,096x1,000     (weights) + 1,000 (biases)

(x) consulte la sección 3.2 del artículo: las capas completamente conectadas se convierten primero en capas convolucionales (la primera capa FC a una CONV 7 × 7. capa, las dos últimas capas FC a 1 × 1 conv. capas).

Detalles acerca de fc1

Como se precisa por encima de la resolución espacial justo antes de alimentar las capas completamente conectadas es de 7x7 píxeles. Esto se debe a que esta red VGG utiliza relleno espacial antes de las circunvoluciones, como se detalla en la sección 2.1 del documento:

[...] the spatial padding of conv. la entrada de capa es tal que la resolución espacial se conserva después de la convolución, es decir, el relleno es de 1 píxel para 3×3 conv. capas.

Con tal relleno, y trabajando con una imagen de entrada de 224x224 píxeles, la resolución disminuye de la siguiente manera a lo largo de las capas: 112x112, 56x56, 28x28, 14x14 y 7x7 después de la última etapa de convolución / agrupación que tiene 512 mapas de características.

Esto da un vector de entidad pasado a fc1 con dimensión: 512x7x7.

 49
Author: deltheil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-31 09:50:06

Un gran desglose del cálculo para la red VGG-16 también se da en CS231n notas de conferencia.

INPUT:     [224x224x3]    memory:  224*224*3=150K   weights: 0
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*3)*64 = 1,728
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*64)*64 = 36,864
POOL2:     [112x112x64]   memory:  112*112*64=800K  weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*128)*128 = 147,456
POOL2:     [56x56x128]    memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2:     [28x28x256]    memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [14x14x512]    memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [7x7x512]      memory:  7*7*512=25K      weights: 0
FC:        [1x1x4096]     memory:  4096             weights: 7*7*512*4096 = 102,760,448
FC:        [1x1x4096]     memory:  4096             weights: 4096*4096 = 16,777,216
FC:        [1x1x1000]     memory:  1000             weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters
 33
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 17:05:22

Sé que este es un post antiguo sin embargo, creo que la respuesta aceptada por @deltheil contiene un error. Si no, me encantaría que me corrigieran. La capa de convolución no debe tener sesgo. i. e. 128x3x3x256 (pesos) + 256 (sesgos) = 295,168 debería ser 128x3x3x256 (pesos) = 294,9112

Gracias

 1
Author: rav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-05 11:26:35