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 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
Ainsi , le réseau est avec .
À 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 paramètres.
la source
kernel = filter
, êtes-vous d'accord? >> "Donc, la convolution 1x1 concerne uniquement la sortie, pas le noyau? Pas du tout. Une3x3
convolution peut avoir une forme de sortie arbitraire." En effet, si un remplissage est utilisé,stride=1
puisoutput 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 de3x3x512
convolutions. 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.Convolution Demo
de 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]
.( Source )
la source
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 :
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 source
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∑1j=0X[j]W0[j]+b[0] ∑1j=0X[j]W1[j]+b[1] ∑1j=0X[j]W2[j]+b[2]
1x1
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 taillenxn
est source de confusion (bien que correcte).la source