Que signifie 1x1 convolution dans un réseau de neurones?

106

Je suis en train de faire le tutoriel Udacity Deep Learning. Dans la leçon 3, ils parlent d'une convolution 1x1. Cette convolution 1x1 est utilisée dans Google Inception Module. J'ai du mal à comprendre ce qu'est une convolution 1x1.

J'ai aussi vu ce post de Yann Lecun.

Quelqu'un pourrait-il bien vouloir m'expliquer cela?

jkschin
la source
Voir aussi une question
gkcn
1
Voici un article de blog sur ces modules qui est entré dans les détails sur les convolutions 1x1: hackathonprojects.wordpress.com/2016/09/25/…
Tommy
1
En termes simples, l’idée est de réduire le nombre de canaux dans le volume 3D, accélérant ainsi le calcul.
Onerhao

Réponses:

113

Supposons que j’ai une couche de convection qui délivre un tenseur en forme de où:(N,F,H,W)

  • N est la taille du lot
  • F est le nombre de filtres convolutifs
  • H,W sont les dimensions spatiales

Supposons que cette sortie alimente une couche de avec des filtres 1x1, un remplissage nul et une foulée 1. La sortie de cette couche de convection 1x1 aura alors une forme .F1(N,F1,H,W)

Vous pouvez donc utiliser des filtres de convection 1x1 pour modifier la dimensionnalité dans l’espace du filtre. Si nous augmentons la dimensionnalité, si nous diminuons la dimensionnalité, dans la dimension du filtre.F1>FF1<F

En effet, dans l'article de Google Inception intitulé Going Deeper with Convolutions , ils déclarent (en gras, c'est le mien, pas l'auteur original):

Un gros problème avec les modules ci-dessus, du moins sous cette forme naïve, est que même un nombre modeste de convolutions 5x5 peut être prohibitif au-dessus d’une couche convolutive avec un grand nombre de filtres.

Cela nous amène à la deuxième idée de l’architecture proposée: appliquer judicieusement des réductions de dimensions et des projections chaque fois que les exigences en calcul augmenteraient trop. Ceci est basé sur le succès des imbrications: même les imbriquées de petites dimensions peuvent contenir beaucoup d’informations sur un patch d’image relativement grand ... Des convolutions 1x1 sont utilisées pour calculer les réductions avant les coûteuses convolutions 3x3 et 5x5. En plus d'être utilisées en tant que réductions, elles incluent également l'utilisation de l'activation linéaire rectifiée, ce qui en fait un double objectif.

Ainsi, dans l'architecture Inception, nous utilisons les filtres de convolution 1x1 pour réduire la dimensionnalité dans la dimension du filtre. Comme je l'ai expliqué ci-dessus, ces couches de convection 1x1 peuvent en général être utilisées pour modifier la dimensionnalité de l'espace de filtre (augmentation ou diminution) et dans l'architecture Inception, nous voyons l'efficacité de ces filtres 1x1 pour la réduction de la dimensionnalité, explicitement dans l'espace de dimension du filtre. , pas l'espace de dimension spatiale.

Peut-être existe-t-il d'autres interprétations des filtres de convergence 1x1, mais je préfère cette explication, en particulier dans le contexte de l'architecture Google Inception.

Indie AI
la source
3
Est-ce que la conv. 1x1 compresse la dimension de filtre précédente en 1 avant de mettre en œuvre la conv 5x5?
Leonard Loo
1
@LeonardLoo chaque noyau 1x1 réduit la dimension du filtre à 1, mais vous pouvez avoir plusieurs noyaux dans une convolution 1x1, de sorte que le nombre de "filtres" peut être arbitraire.
Fazzolini
43

Une convolution 1x1 mappe simplement un pixel d'entrée avec tous ses canaux à un pixel de sortie, sans rien regarder autour de lui. Il est souvent utilisé pour réduire le nombre de canaux de profondeur, car il est souvent très lent pour multiplier des volumes avec des profondeurs extrêmement grandes.

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

Celui du bas est environ 3,7 fois plus lent.

Théoriquement, le réseau de neurones peut «choisir» les «couleurs» d'entrée à utiliser avec cette option, au lieu de tout multiplier par la force brute.

Libre Debreuil
la source
19
Je dirais que 1x1 mappe non seulement un pixel sur un pixel de sortie, mais réduit tous les canaux de pixel d'entrée en un pixel. Dans votre exemple de la première ligne, il y a 256 canaux en entrée et chacun des 64 noyaux 1x1 réduit tous les 256 canaux en un seul "pixel" (nombre réel). Le résultat est que vous disposez maintenant de 64 canaux au lieu de 256 avec la même dimension spatiale, ce qui rend le calcul de la convolution 4x4 moins coûteux en termes de calcul que dans l'exemple de la deuxième ligne.
Fazzolini
Bon point, va mettre à jour le post :)
Libre Debreuil
3
Où avez-vous eu 3,7 fois plus lent?
CMCDragonkai
@CMCDragonkai Supposons que le coût de calcul est proportionnel au nombre de poids. Dans le dernier cas, le num_weights = in_depth x out_depth x kernel_size = 256x256x4x4. Dans le premier cas, num_weights = 256x64x1x1+64x265x4x4=256x64x17. Prenez le ratio et cela donne 256/17 ~ 3.7. Consultez cette page papier pour une visualisation sur la relation entre les poids numériques et la profondeur d’entrée et de sortie. arxiv.org/pdf/1603.07285.pdf
Nelson Dinh
11

La principale raison pour laquelle je n'ai pas compris les convolutions 1x1, c'est parce que je ne comprenais pas comment convolutions fonctionnaient réellement. Le facteur clé est le fonctionnement du calcul d'une convolution de plusieurs canaux / filtres. Pour comprendre cela, j'ai trouvé cette réponse utile également:any

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

En particulier, le type 2.2 est la description correcte d’une convolution.

Une autre réponse utile:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

Cette réponse explique comment vous avez un filtre distinct pour chaque combinaison de canaux entrée / sortie . Après avoir calculé chacun de ces éléments, les résultats sont additionnés sur l’ axe du canal d’entrée en laissant le nombre de valeurs du canal de sortie .

Voici une vidéo que j'ai trouvée et qui m'a aidé à comprendre le fonctionnement d'une convolution 1x1.

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

Voici les principales choses que j'en ai tirées:

  • L'entrée dans une convolution 1x1 est généralement des convolutions précédentes de taille x . Mais s'il y avait des filtres dans la dernière couche de convolutions, vous obtenez une matrice de forme . Une convolution 1x1 est en réalité un vecteur de taille qui convole sur l’ensemble de l’image, créant ainsi un filtre de sortie x . Si vous avez 1x1 convolutions, la sortie de toutes les 1x1 convolutions est size .mnf1(m,n,f1)f1mnf2(m,n,f2)
  • Ainsi, une convolution 1x1, en supposant que , peut être considérée comme une représentation des filtres via les filtres . Il permet au réseau d’apprendre comment réduire la dimension plus efficacement.f2<f1f1f2
Simon Alford
la source
Ok, c’est le seul endroit jusqu’à présent qui explique correctement la convolution 1x1 est en fait un produit «point» avec(m,n,f1)
Red Floyd
3

Je vais essayer d'expliquer de manière plus intuitive et plus brève avec des illustrations!

Un 1 * 1 conv (aka réseau dans le réseau )?

Supposons que vous saisissiez (n_H, n_W, n_c_prev). Vous pouvez considérer (1 * 1 * n_c_prev) comme un seul neurone (un réseau entièrement connecté - pourquoi N / w en N / w ) prenant des nombres (n_c_prev) dans l'entrée en les multipliant par (1 * 1 * n_c_prev ) puis en ajoutant puis en prenant ReLu & output (n_H, n_W) et si vous avez plusieurs filtres (n_c), alors la sortie serait (n_H, n_W, n_C).

Vous pouvez donc utiliser la couche de regroupement pour réduire les dimensions spatiales (n_H, n_W) et utiliser 1 * 1 conv pour réduire le n_c_prev (le nombre de canaux), ce qui enregistre beaucoup de calculs. Par exemple

entrez la description de l'image ici

Par conséquent, un emporter

  • Vous pouvez utiliser une couche de convolution 1x1 pour réduire n_C mais pas n_H, n_W.

  • Vous pouvez utiliser une couche de regroupement pour réduire n_H, n_W et n_C.

En d'autres termes, entrez la description de l'image ici

  • que faites-vous avec le filtre 1 * 1 CONV? vous prenez essentiellement "1 * 1 * num_input_channel_of_featureMap" taille poids & convolution (élément par * suivi de +) ce volume sur image / featureMap de taille "W H num_input_channel_of_featureMap" et ce que vous obtenez est une sortie de taille "W * H".

  • Maintenant, vous pouvez utiliser le nombre "#filters" de ce type "1 * 1 * num_input_channel_of_featureMap" et obtenir le volume "W H #filter" comme résultat final!

  • Plus précisément, vous multipliez "1 * 1" tels 32 pondérations différentes (1 * 1 Volume) par une tranche à la même position dans la carte des caractéristiques en entrée, suivie de ReLu et obtenez un seul nombre correspondant généré, affiché sous forme de pixel de couleur verte. !

  • 1 * 1 CONV permet de réduire le nombre de canaux et d’économiser sur les calculs de certains réseaux (INCEPTIONS).!

  • Mais, bien sûr, si vous voulez conserver le même nombre de canaux que celui de la carte de caractéristiques en entrée, c’est bien aussi, la seule chose que fait 1 * 1 CONV est simple: appliquez-lui la non-linéarité ReLU, ce qui lui permet d’apprendre des fonctions complexes. NN .

anu
la source
1

Une autre idée sur la réduction de la dimensionnalité dans le contexte des filtres 1x1:

Prenons par exemple une couche 4096x8x8 fc7 de FCN. Que se passe-t-il si la couche suivante (appelez-la fc8) est 2048x8x8 avec la taille de filtre 1? fc7 est très profond à l'intérieur du réseau, chacune de ses caractéristiques 4096 est sémantiquement riche, mais chaque neurone (par exemple, l'image d'entrée est 250x250x3) possède un grand champ récepteur. En d'autres termes, si un neurone est très actif, nous savons que quelque part dans son champ sémantique, une caractéristique correspondante est présente.

Prenons par exemple un neurone situé le plus à gauche dans FC8 avec un filtre 1x1. Il se connecte à tous les 4096 neurones / entités uniquement dans le même champ récepteur (coin supérieur gauche de l'image), chacun d'eux étant activé par une seule caractéristique. Certains d'entre eux (500 mêmes) sont très actifs. Si le neurone résultant est également très actif, cela signifie qu'il a probablement appris à identifier une ou plusieurs caractéristiques de ce champ réceptif. Après avoir effectué ceci 2048 fois pour les neurones les plus à gauche de la FC8, un certain nombre d’entre eux (par exemple 250) seront très actifs, ce qui signifie qu’ils ont «collecté» des caractéristiques du même champ récepteur à travers la FC7, et beaucoup très probablement plus de un.

Si vous continuez à réduire la dimensionnalité, un nombre décroissant de neurones apprendra un nombre croissant de caractéristiques issues du même champ réceptif. Et comme les paramètres spatiaux 8x8 restent les mêmes, nous ne modifions pas la "vue" de chaque neurone, nous ne diminuons donc pas la grossièreté spatiale.

Vous voudrez peut-être jeter un coup d'œil aux «réseaux entièrement convolutionnels» de Long, Shelhamer et Darrel.

Alex
la source
1
Je pense que ceci est une autre bonne intuition du mécanisme, mais je vais devoir y revenir, car je trouve la notation pour les dimensions confuse, et en particulier "Après que vous ayez fait cela 2048 fois pour la partie la plus à gauche neurones dans FC8 ".
WillC
Je n'ai pas très bien compris ce que vous essayez de dire, pourriez-vous s'il vous plaît préciser les choses?
Michael Heidelberg
0

L'opération mathématique de convolution consiste à calculer le produit de deux fonctions (continues ou discrètes) sur toutes les positions possibles.

v×v

Les applications de traitement d’image des réseaux de neurones - y compris les réseaux de neurones de convolution - ont été examinées dans: [M. Egmont-Petersen, D. de Ridder, H. Handels. Traitement d'images avec des réseaux de neurones - une revue , Pattern Recognition , Vol. 35, n ° 10, pages 2279-2301, 2002].

Match Maker EE
la source