Comment les convolutions 1x1 sont-elles identiques à une couche entièrement connectée?

55

J'ai récemment lu les commentaires de Yan LeCuns sur 1x1 convolutions :

Dans les réseaux convolutionnels, il n’existe pas de "couches entièrement connectées". Il existe uniquement des couches de convolution avec des noyaux de convolution 1x1 et une table de connexion complète.

C'est un fait trop rarement compris que ConvNets n'a pas besoin d'une entrée de taille fixe. Vous pouvez les former sur des entrées produisant un seul vecteur de sortie (sans étendue spatiale), puis les appliquer à des images plus grandes. Au lieu d'un seul vecteur de sortie, vous obtenez alors une carte spatiale des vecteurs de sortie. Chaque vecteur voit les fenêtres d’entrée à différents endroits sur l’entrée. Dans ce scénario, les "couches entièrement connectées" agissent vraiment comme des convolutions 1x1.

Je voudrais voir un exemple simple pour cela.

Exemple

Supposons que vous ayez un réseau entièrement connecté. Il ne comporte qu'un calque d'entrée et un calque de sortie. La couche d'entrée a 3 nœuds, la couche de sortie a 2 nœuds. Ce réseau a 32=6 paramètres. Pour le rendre encore plus concret, disons que vous avez une fonction d'activation ReLU dans la couche en sortie et la matrice de pondération

W=(011235)R2×3b=(813)R2

Ainsi , le réseau est f(x)=ReLU(Wx+b) avec xR3 .

À quoi la couche convolutive doit-elle ressembler? Que veut dire LeCun avec "table de connexion complète"?

Je suppose que pour obtenir un CNN équivalent, il faudrait exactement le même nombre de paramètres. Le MLP de dessus a 23+2=8 paramètres.

Martin Thoma
la source

Réponses:

29

Votre exemple

Dans votre exemple, nous avons 3 unités d’entrée et 2 unités de sortie. Pour appliquer des convolutions, pensez aux unités ayant la forme: [1,1,3]et [1,1,2]respectivement. En termes CNN, nous avons 3des 2cartes de caractéristiques d' entrée et de sortie, chacune ayant des dimensions spatiales 1 x 1.

L'application d'une n x nconvolution à une couche avec kdes cartes de caractéristiques nécessite un noyau de forme [n,n,k]. Par conséquent, le noyau de vos 1x1convolutions a une forme [1, 1, 3]. Vous avez besoin 2de ces noyaux (ou filtres) pour produire les 2cartes de caractéristiques en sortie. Remarque: les circonvolutions réalité à 1 × 1 × nombre de canaux des convolutions d' entrée . Le dernier n'est que rarement mentionné.1×11×1×number of channels of the input

En effet si vous choisissez comme noyaux et biais:

w1=(011)R3w2=(235)R3b=(813)R2

La couche de conv va alors calculer avec x R 3 .f(x)=ReLU((w1xw2x)+(b1b2))xR3

Transformation en vrai code

Pour un exemple concret, jetez également un coup d’œil à mon implémentation de vgg-fcn . Le code fourni dans ce fichier prend les poids VGG, mais transforme chaque couche entièrement connectée en une couche convolutive. Le réseau résultant produit le même résultat que vgglorsqu'il est appliqué à l'image d'entrée de la forme [244,244,3]. (Lorsque vous appliquez les deux réseaux sans remplissage).

Les couches convolutives transformées sont introduites dans la fonction _fc_layer(ligne 145). Ils ont une taille de noyau 7x7pour FC6 (qui est maximale, car pool5VGG génère une carte de caractéristiques de forme [7,7, 512]. Couche FC7et FC8est implémentée en tant que 1x1convolution.

"Table de connexion complète"

Je ne suis pas sûr à 100%, mais il pourrait faire référence à un filtre / noyau qui a la même dimension que la carte de caractéristiques en entrée. Dans les deux cas (Code et votre exemple), les dimensions spatiales sont maximales au sens où la dimension spatiale du filtre est identique à la dimension spatiale de l'entrée.

MarvMind
la source
"Le noyau de vos 1x1 convolutions a donc une forme [1, 1, 3].". Quelle? Il semble y avoir un plus grand malentendu des convolutions. Je pensais que si un noyau de convolution a la forme [1, 1, 3], alors on dirait qu’il s’agit d’une convolution 1x1x3? Donc, la convolution 1x1 concerne uniquement la sortie, pas le noyau?
Martin Thoma
2
Pour moi kernel = filter, êtes-vous d'accord? >> "Donc, la convolution 1x1 concerne uniquement la sortie, pas le noyau? Pas du tout. Une 3x3convolution peut avoir une forme de sortie arbitraire." En effet, si un remplissage est utilisé, stride=1puis output shape = input shape. >> "Je pensais que si un noyau de convolution avait la forme [1, 1, 3], alors on dirait qu'il s'agit d'une convolution 1x1x3?" Non, je n'ai jamais entendu quelqu'un parler de 3x3x512convolutions. Cependant, tous les filtres de convolution que j'ai vus ont une troisième dimension spatiale égale au nombre de cartes de caractéristiques de la couche en entrée.
MarvMind
Pour référence, jetez un coup d'œil au cours Convolution Demode Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . Ou à l'API tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Les filtres sont supposés avoir une forme [filter_height, filter_width, in_channels, out_channels].
MarvMind
Puis-je ajouter la chose avec "1x1 convolutions sont 1 x 1 x nombre de canaux de l'entrée" à votre réponse? C'était la source de ma confusion et je ne cesse d'oublier cela.
Martin Thoma
Bien sûr vas y!
MarvMind
4

nnimnnm

nnim

nnim

nnim

( Source )

Michael Yahalom
la source
1
n=1
2

Le noyau équivalent a simplement la forme de l’entrée et calcule un produit tenseur. (J'utilise le mot "forme" car il semble y avoir une certaine confusion sur "taille", qui ignore souvent la dimension canal / profondeur). Il n'y a pas de "glissement du noyau entre les entrées", car le noyau est aussi gros que possible. Citant les notes de cours de Stanford CS 231n :

toute couche FC peut être convertie en couche CONV. Par exemple, une couche FC avec K = 4096 qui recherche un volume d’entrée de taille 7 × 7 × 512 peut être exprimée de manière équivalente en tant que couche CONV avec F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096. En d’autres termes, nous définissons la taille du filtre pour qu’elle corresponde exactement à la taille du volume d’entrée. Par conséquent, la sortie sera simplement de 1 × 1 × 4096 puisqu’une seule colonne de profondeur «s’adapte» au volume d’entrée, donnant un résultat identique à la couche FC initiale.

Je crois que "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" signifie ici que chaque noyau de conv a la forme 7x7x512 et qu'il y a 4096 filtres de ce type.

La réponse précédente indiquait que le dernier fc de AlexNet (qui reçoit une entrée de forme 1x1x4096 et calcule 1000 scores de classe) est implémenté en tant que "convolution 1x1". Pour être complet, chaque noyau de ce type a la forme 1x1x4096, et il y en a 1000.

Le Cunn explique également cela dans l' article de CNN , page 8, description de LeNet5:

La couche C5 est une couche convolutionnelle avec 120 cartes de caractéristiques. Chaque unité est connectée à un quartier 5x5 sur les 16 cartes de fonctions de S4. Ici, parce que la taille de S4 est également de 5x5, la taille des cartes de caractéristiques de C5 est de 1x1; cela équivaut à une connexion complète entre S4 et C5.

Yibo Yang
la source
1

Pour tout utilisateur novice de PyTorch comme moi, ne confondez pas "couche entièrement connectée" avec une "couche linéaire".

Une couche linéaire et des convolutions 1x1 sont la même chose. Il m'a fallu un certain temps pour comprendre qu'il n'existait pas de "couche entièrement connectée" - c'était simplement un aplatissement des dimensions spatiales en un tenseur géant 1D. L’aplatissement provoque la présentation de chaque élément de tous les emplacements spatiaux en tant que carte / canal / dimension distincte (comme vous l’appelez). Par conséquent, lorsque nous appliquons une couche linéaire sur un tenseur aplati , nous obtenons une opération entièrement connectée qui, bien entendu, n’est pas la même chose qu’une convolution 1x1.

UNE 1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

D'autres réponses qui prétendent qu'une couche entièrement connectée est simplement une couche de convolution valide nxn pour une entrée de taille nxnest source de confusion (bien que correcte).

Rakshit Kothari
la source