Ma compréhension est que la couche convolutionnelle d'un réseau neuronal convolutionnel a quatre dimensions: canaux d'entrée, hauteur de filtre, largeur de filtre, nombre de filtres. En outre, je crois comprendre que chaque nouveau filtre est simplement compliqué sur TOUS les canaux d'entrée (ou les cartes d'entité / d'activation de la couche précédente).
CEPENDANT, le graphique ci-dessous de CS231 montre chaque filtre (en rouge) appliqué à un seul canal, plutôt que le même filtre utilisé sur les canaux. Cela semble indiquer qu'il existe un filtre distinct pour CHAQUE canal (dans ce cas, je suppose que ce sont les trois canaux de couleur d'une image d'entrée, mais la même chose s'appliquerait à tous les canaux d'entrée).
C'est déroutant - existe-t-il un filtre unique différent pour chaque canal d'entrée?
Source: http://cs231n.github.io/convolutional-networks/
L'image ci-dessus semble contradictoire avec un extrait des "Fondamentaux du Deep Learning" d'O'reilly :
"... les filtres ne fonctionnent pas uniquement sur une seule carte d'entités. Ils fonctionnent sur l'intégralité du volume de cartes d'entités qui ont été générées sur une couche particulière ... Par conséquent, les cartes d'entités doivent pouvoir fonctionner sur des volumes, pas seulement des zones "
... De plus, je crois comprendre que ces images ci-dessous indiquent qu'un filtre LE MÊME est juste convolu sur les trois canaux d'entrée (contrairement à ce qui est illustré dans le graphique CS231 ci-dessus):
Réponses:
L'ancien. En fait, il existe un noyau distinct défini pour chaque combinaison canal d'entrée / canal de sortie.
Typiquement pour une architecture CNN, dans un seul filtre comme décrit par votre
number_of_filters
paramètre, il y a un noyau 2D par canal d'entrée. Il existe desinput_channels * number_of_filters
ensembles de poids, chacun décrivant un noyau de convolution. Ainsi, les diagrammes montrant un ensemble de poids par canal d'entrée pour chaque filtre sont corrects. Le premier diagramme montre également clairement que les résultats de l'application de ces noyaux sont combinés en les additionnant et en ajoutant des biais pour chaque canal de sortie.Cela peut également être considéré comme utilisant une convolution 3D pour chaque canal de sortie, qui se trouve avoir la même profondeur que l'entrée. C'est ce que montre votre deuxième diagramme, et aussi ce que de nombreuses bibliothèques feront en interne. Mathématiquement, c'est le même résultat (à condition que les profondeurs correspondent exactement), bien que le type de couche soit généralement appelé "Conv2D" ou similaire. De même, si votre type d'entrée est intrinsèquement 3D, comme des voxels ou une vidéo, alors vous pouvez utiliser une couche "Conv3D", mais en interne, il pourrait bien être implémenté comme une convolution 4D.
la source
input_channels
versions avec des poids différents . Avez-vous une source "officielle" qui confirme cette compréhension?L'image suivante que vous avez utilisée dans votre question décrit très précisément ce qui se passe. N'oubliez pas que chaque élément du filtre 3D (cube gris) est composé d'une valeur (
3x3x3=27
valeurs) différente. Ainsi, trois filtres 2D différents de taille3x3
peuvent être concaténés pour former ce seul filtre 3D de taille3x3x3
.Le
3x3x3
bloc RVB de l'image est multiplié par élément par un filtre 3D (représenté en gris). Dans ce cas, le filtre a des3x3x3=27
poids. Lorsque ces poids sont multipliés par élément puis additionnés, cela donne une valeur.Alors, existe-t-il un filtre séparé pour chaque canal d'entrée?
OUI , il y a autant de filtres 2D que de canaux d'entrée dans l'image. Cependant , cela aide si vous pensez que pour les matrices d'entrée avec plus d'un canal, il n'y a qu'un seul filtre 3D (comme indiqué dans l'image ci-dessus).
Alors pourquoi cela s'appelle-t-il une convolution 2D (si le filtre est 3D et la matrice d'entrée est 3D)?
Il s'agit d'une convolution 2D car les enjambées du filtre se situent uniquement sur les dimensions en hauteur et en largeur ( PAS en profondeur) et, par conséquent, la sortie produite par cette convolution est également une matrice 2D. Le nombre de directions de mouvement du filtre détermine les dimensions de la convolution.
Remarque: Si vous développez votre compréhension en visualisant un seul filtre 3D au lieu de plusieurs filtres 2D (un pour chaque couche), alors vous aurez un temps facile à comprendre les architectures CNN avancées comme Resnet, InceptionV3, etc.
la source
input_channels
versions avec des poids différents . Si c'est aussi votre compréhension, existe-t-il une source "officielle" qui le confirme?Je poursuis les réponses ci-dessus avec un exemple concret dans l'espoir de clarifier davantage le fonctionnement de la convolution en ce qui concerne les canaux d'entrée et de sortie et les poids, respectivement:
Soit l'exemple comme suit (par rapport à 1 couche convolutionnelle):
input_channels=5
output_channels=56
On remarque que:
Cette couche convolutive contient donc:
56 filtres tridimensionnels de taille 4x4x5 (= 80 poids différents chacun) pour tenir compte des 56 canaux de sortie où chacun a une valeur pour la 3e dimension de 5 pour correspondre aux 5 canaux d'entrée. Au total, il y a
number_of_filters=input_channel*output_channels=5*56=280
Filtres 2D de taille 4x4 (soit 280x16 poids différents au total).
la source
Il n'y a que des restrictions en 2D. Pourquoi?
Imaginez une couche entièrement connectée.
Ce serait terriblement énorme, chaque neurone serait connecté à peut-être 1000x1000x3 entrées de neurones. Mais nous savons que le traitement du pixel voisin est logique, nous nous limitons donc à un petit voisinage 2D, de sorte que chaque neurone n'est connecté qu'à 3x3 neurones proches en 2D. Nous ne savons rien de tel sur les canaux, nous nous connectons donc à tous les canaux.
Pourtant, il y aurait trop de poids. Mais en raison de l'invariance de translation, un filtre fonctionnant bien dans une zone est très probablement utile dans une zone différente. Nous utilisons donc le même ensemble de poids sur 2D. Encore une fois, il n'y a pas une telle invariance de traduction entre les canaux, donc il n'y a pas une telle restriction là-bas.
la source
Reportez-vous à la section "Connectivité locale" dans http://cs231n.github.io/convolutional-networks/ et à la diapositive 7-18.
L'hyperparamètre "Champ réceptif" du filtre est défini uniquement par la hauteur et la largeur, car la profondeur est fixée par la profondeur de la couche précédente.
NOTEZ que "L'étendue de la connectivité le long de l'axe de profondeur est toujours égale à la PROFONDEUR du volume d'entrée" -ou- PROFONDEUR de la carte d'activation (dans le cas de couches ultérieures).
Intuitivement, cela doit être dû au fait que les données des canaux d'image sont entrelacées et non planes. De cette façon, l'application du filtre peut être obtenue simplement par multiplication des vecteurs de colonne.
NOTEZ que Convolutional Network apprend tous les paramètres du filtre (y compris la dimension de profondeur) et qu'ils sont totaux "h w input_layer_depth + 1 (polarisation)".
la source
Je recommande le chapitre 2.2.1 de ma thèse de maîtrise comme réponse. Pour ajouter aux réponses restantes:
Keras est votre ami pour comprendre ce qui se passe:
donne
Essayez de formuler vos options. Qu'est-ce que cela signifierait pour les paramètres si quelque chose d'autre était le cas?
Cette approche vous aide également avec d'autres types de couches, pas seulement les couches convolutives.
Veuillez également noter que vous êtes libre d'implémenter différentes solutions, qui peuvent avoir d'autres nombres de paramètres.
la source
Juste pour clarifier deux détails:
Le moyen le plus simple de s'en convaincre est d'imaginer ce qui se passe dans d'autres scénarios et de voir que le calcul devient dégénéré - c'est-à-dire que si vous n'entrelacez pas et ne recombinez pas les résultats, alors les différentes sorties ne feraient rien du tout - elles aurait le même effet qu'une sortie unique avec des poids combinés.
la source
Pour quiconque essaie de comprendre comment les convolutions sont calculées, voici un extrait de code utile dans Pytorch:
L'exécution de ceci donne la sortie suivante:
Remarquez la somme de chaque canal de la convolution sur toutes les sorties des canaux précédents.
la source