Comment le CNN '12 de Krizhevsky obtient-il 253 440 neurones dans la première couche?

24

Dans Alex Krizhevsky, et al. Classification Imagenet avec des réseaux de neurones convolutionnels profonds, ils énumèrent le nombre de neurones dans chaque couche (voir schéma ci-dessous).

L'entrée du réseau est de 150528 dimensions et le nombre de neurones dans les couches restantes du réseau est donné par 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000.

CNN

Une vue 3D

Le nombre de neurones pour toutes les couches après la première est clair. Une façon simple de calculer les neurones consiste à simplement multiplier les trois dimensions de cette couche ( planes X width X height):

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

Cependant, en regardant la première couche:

  • Couche 1: 55x55x48 * 2 = 290400

Notez que ce n'est pas 253,440 comme spécifié dans le document!

Calculer la taille de sortie

L'autre façon de calculer le tenseur de sortie d'une convolution est:

Si l'image d'entrée est un tenseur 3D nInputPlane x height x width, la taille de l'image de sortie sera celle nOutputPlane x owidth x oheight

owidth = (width - kW) / dW + 1

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

(à partir de la documentation de Torch SpatialConvolution )

L'image d'entrée est:

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

Et la couche de convolution est:

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

(par exemple taille du noyau 11, foulée 4)

En insérant ces chiffres, nous obtenons:

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

Nous sommes donc à court des 55x55dimensions dont nous avons besoin pour correspondre au papier. Il peut s'agir d'un remplissage (mais le cuda-convnet2modèle définit explicitement le remplissage à 0)

Si nous prenons les 54dimensions -taille, nous obtenons des 96x54x54 = 279,936neurones - encore trop.

Voici donc ma question:

Comment obtiennent-ils 253 440 neurones pour la première couche convolutionnelle? Qu'est-ce que je rate?

R. Girard
la source
Avez-vous déjà résolu cela? Juste pour être pédant avec vos calculs: la largeur et la hauteur seraient en fait 54,25. J'ai essayé de comprendre cela, et dans un premier temps, j'ai divisé les supposés 253440 neurones entre 96 filtres, ce qui donne 2640 neurones par filtre. Ce n'est pas un nombre carré. Donc soit nous avons tous les deux un malentendu ici, soit il y a peut-être une erreur de la part des auteurs ... Les avez-vous contactés?
anderas
même avec moi, c'est très confus pour moi. btw il est vrai que l'entrée est 224x224x3? je pense que ce doit être 227x227x3. voyons si nous avons 227x227, 5 cellules sur la première gauche et 5 cellules sur la dernière droite ne peuvent pas être le centre de la convolution du noyau avec une taille 11x11. Ainsi, le premier centre du noyau est la cellule (6,6) et le dernier du noyau central dans la première ligne est la cellule (6x222). Avec la foulée-4, nous obtiendrons le centre du noyau sur la sixième ligne: cellule sur la colonne: 6,10,14, ..., 222 et la formulation simple pour le centre du noyau-k est sur la colonne = 6+ (k -1) * 4 pour que la colonne 222 soit le kième centre = (222-6) / 4 +1 = 55.
4
Notez que 48 * 48 * 55 * 2 = 253440, il est donc possible qu'ils aient une faute de frappe lors du calcul du nombre de neurones dans la première couche (multiplié par 48 au lieu de 55).
tsiki
@Firebug Il s'agit d'une utilisation intéressante de la balise [references]. Je pensais que nous l'utilisions uniquement pour les questions qui demandent des références. Mais peut-être que j'avais tort. L'utilisez-vous différemment?
amibe dit Reinstate Monica

Réponses:

8

De la note de Stanfords sur NN:

Exemple du monde réel. Le Krizhevsky et al. l'architecture qui a remporté le défi ImageNet en 2012 a accepté des images de taille [227x227x3]. Sur la première couche convolutive, il a utilisé des neurones avec une taille de champ récepteur F = 11, une foulée S = 4 et sans remplissage nul P = 0. Depuis (227 - 11) / 4 + 1 = 55, et puisque la couche Conv avait une profondeur de K = 96, le volume de sortie de la couche Conv avait une taille [55x55x96]. Chacun des 55 * 55 * 96 neurones de ce volume était connecté à une région de taille [11x11x3] dans le volume d'entrée. De plus, les 96 neurones de chaque colonne de profondeur sont connectés à la même région [11x11x3] de l'entrée, mais bien sûr avec des poids différents. Comme amusant, si vous lisez le papier réel, il prétend que les images d'entrée étaient 224x224, ce qui est sûrement incorrect car (224-11) / 4 + 1 n'est clairement pas un entier. Cela a troublé de nombreuses personnes dans l'histoire des ConvNets et on sait peu de choses sur ce qui s'est passé. Ma meilleure supposition est qu'Alex a utilisé un remplissage nul de 3 pixels supplémentaires qu'il ne mentionne pas dans le document.

réf: http://cs231n.github.io/convolutional-networks/

Ces notes accompagnent la classe CS de Stanford CS231n: Réseaux neuronaux convolutionnels pour la reconnaissance visuelle. Pour des questions / préoccupations / rapports de bugs concernant contacter Justin Johnson concernant les affectations, ou contacter Andrej Karpathy concernant les notes de cours

Bacon
la source
Est-il possible de donner du crédit en nommant l'auteur de ces notes?
Silverfish
Les auteurs sont clairement auto-référencés dans les notes, voir cs231n.github.io
Bacon
2
Bien qu'ils soient clairement référencés si vous suivez le lien, la citation apparaît ici aussi, donc il faut également mentionner ici. C'est en partie par courtoisie, mais aussi parce que le lien peut cesser de fonctionner (par exemple, si le matériel est supprimé / paywall / déplacé vers une nouvelle adresse). Malheureusement, nous avons un grave problème avec la "pourriture des liens" sur ce site - alors que nous avons l'intention de servir de référentiel à long terme de réponses de haute qualité aux questions statistiques, beaucoup de nos anciennes réponses ont été rendues obsolètes par des liens qui ne fonctionnent plus . Il est donc généralement plus sûr d'essayer de rendre les réponses aussi autonomes que possible.
Silverfish
0

Ce document est vraiment déroutant. Tout d'abord, la taille d'entrée des images est incorrecte 224x224 ne donne pas une sortie de 55. Ces neurones sont simplement comme des pixels groupés en un, donc la sortie est une image 2D de valeurs aléatoires (valeurs de neurones). Donc, fondamentalement, le nombre de neurones = widthxheightxdepth, aucun secret n'est là pour comprendre cela.

Moe
la source