Comment calculer le nombre de paramètres des réseaux neuronaux convolutionnels?

Je ne peux pas donner le bon nombre de paramètres de AlexNet ou VGG Net.

Par exemple, pour calculer le nombre de paramètres d'une couche conv3-256 de VGG Net, la réponse est de 0,59 M = (3*3)*(256*256), c'est-à-dire (Taille du noyau) * (produit des deux nombres de canaux dans les couches communes), mais de cette façon, je ne peux pas obtenir les paramètres 138M.

Alors pourriez-vous me montrer où est le problème avec mon calcul, ou me montrer la bonne procédure de calcul?

33
demandé sur nbro 2015-01-30 11:51:14

3 réponses

Si vous faites référence à VGG Net avec 16 couches (tableau 1, colonne D), alors 138M fait référence au Nombre total de paramètres de ce réseau, c'est-à-dire y compris toutes les couches convolutionnelles, mais aussi celles entièrement connectées.

En regardant la 3ème étape convolutionnelle composée de 3 x conv3-256 couches:

  • le premier A N = 128 plans d'entrée et F = 256 plans de sortie,
  • les deux autres ont N=256 plans d'entrée et F=256 plans de sortie.

La convolution noyau est 3x3 pour chacune de ces couches. En termes de paramètres, cela donne:

  • 128x3x3x256 (poids) + 256 (biais) = 295,168 paramètres pour le 1er,
  • 256x3x3x256 (poids) + 256 (biais) = 590 080 paramètres pour les deux autres.

comme expliqué ci-dessus, vous devez le faire pour toutes les couches, mais aussi pour celles entièrement connectées, et additionner ces valeurs pour obtenir le nombre final de 138M.

-

Mise à JOUR: la répartition entre les couches donnent:

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 particulier pour les couches entièrement connectées (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) voir section 3.2 de l'article: les couches entièrement connectées sont d'abord converties en couches convolutionnelles (la première couche FC en conv.7 × 7). couche, les deux dernières couches FC à 1 × 1 conv. couche).

Détails sur fc1

Comme indiqué ci-dessus, la résolution spatiale juste avant l'alimentation des couches entièrement connectées est de 7x7 pixels. C'est parce que ce VGG Net utilise remplissage spatial Avant circonvolutions, comme détaillé dans la section 2.1 de l'article:

[...] le remplissage spatial de conv. l'entrée de couche est telle que la résolution spatiale est préservée après convolution, c'est-à-dire que le remplissage est de 1 pixel pour 3×3 conv. couche.

Avec un tel remplissage, et en travaillant avec une image d'entrée de 224x224 pixels, la résolution diminue comme suit le long des couches: 112x112, 56x56, 28x28, 14x14 et 7x7 après la dernière étape de convolution / regroupement qui a 512 cartes de fonction.

Cela donne un vecteur de fonctionnalité passé à fc1 avec la dimension: 512x7x7.

49
répondu deltheil 2015-01-31 09:50:06

Une grande ventilation du calcul pour le réseau VGG-16 est également donnée dans CS231n notes de cours.

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
répondu Ray 2017-04-20 17:05:22

Je sais que c'est un vieux post néanmoins, je pense que la réponse acceptée par @ deltheil contient une erreur. Si non, je serais heureux d'être corrigé. La couche de convolution ne doit pas avoir de biais. c'est à dire 128x3x3x256 (poids) + 256 (biais) = 295,168 devrait être 128x3x3x256 (poids) = 294,9112

Merci

1
répondu rav 2017-07-05 11:26:35