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?
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.
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
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