web-dev-qa-db-fra.com

Réseaux de neurones convolutifs - plusieurs canaux

Comment s'effectue l'opération de convolution lorsque plusieurs canaux sont présents au niveau de la couche d'entrée? (par exemple RVB)

Après avoir fait quelques lectures sur l'architecture/l'implémentation d'un CNN, je comprends que chaque neurone dans une carte d'entités fait référence à NxM pixels d'une image comme défini par la taille du noyau. Chaque pixel est ensuite pris en compte par les mappes de caractéristiques apprises ensemble de poids NxM (le noyau/filtre), sommées et entrées dans une fonction d'activation. Pour une simple image en niveaux de gris, j'imagine que l'opération serait quelque chose d'adhérer au pseudo-code suivant:

for i in range(0, image_width-kernel_width+1):
    for j in range(0, image_height-kernel_height+1):
        for x in range(0, kernel_width):
            for y in range(0, kernel_height):
                sum += kernel[x,y] * image[i+x,j+y]

        feature_map[i,j] = act_func(sum)
        sum = 0.0

Cependant, je ne comprends pas comment étendre ce modèle pour gérer plusieurs canaux. Trois jeux de poids distincts sont-ils requis par carte d'entités, partagés entre chaque couleur?

Référence à la section "Poids partagés" de ce didacticiel: http://deeplearning.net/tutorial/lenet.html Chaque neurone dans une carte d'entités fait référence à la couche m-1 avec des couleurs référencées à partir de neurones séparés. Je ne comprends pas la relation qu'ils expriment ici. Les neurones sont-ils des noyaux ou des pixels et pourquoi font-ils référence à des parties distinctes de l'image?

Sur la base de mon exemple, il semblerait qu'un seul noyau de neurones soit exclusif à une région particulière d'une image. Pourquoi ont-ils divisé le composant RVB sur plusieurs régions?

22
Junkers

Comment s'effectue l'opération de convolution lorsque plusieurs canaux sont présents au niveau de la couche d'entrée? (par exemple RVB)

Dans un tel cas, vous avez un noyau 2D par canal d'entrée (a.k.a plane).

Ainsi, vous effectuez chaque convolution (entrée 2D, noyau 2D) séparément et vous additionnez les contributions qui donne la carte finale des caractéristiques de sortie.

Veuillez vous référer à la diapositive 64 de ce tutoriel CVPR 2014 par Marc'Aurelio Ranzato :

enter image description here

Trois jeux de poids distincts sont-ils requis par carte d'entités, partagés entre chaque couleur?

Si vous considérez une carte d'entités de sortie donnée, vous avez 3 noyaux 2D (c'est-à-dire un noyau par canal d'entrée). Chaque noyau 2D partage les mêmes poids sur l'ensemble du canal d'entrée (R, G ou B ici).

Donc toute la couche convolutionnelle est un tenseur 4D (nb. Plans d'entrée x nb. Plans de sortie x largeur du noyau x hauteur du noyau).

Pourquoi ont-ils divisé le composant RVB sur plusieurs régions?

Comme détaillé ci-dessus, considérez chaque canal R, G et B comme un plan d'entrée séparé avec son noyau 2D dédié.

35
deltheil

Max n'a pas vraiment de sens, car les canaux sont censés être indépendants. Tirer le maximum des résultats de différents filtres sur différents canaux, c'est mélanger différents aspects ensemble.

Pour combiner les sorties de différents canaux, nous avons fondamentalement besoin d'une fonction pour ajouter la sortie ensemble. Le choix de la fonction d'addition ici à mon avis peut varier en fonction des cas d'utilisation. Une implémentation consiste simplement à faire une sommation, selon l'implémentation de pytorch conv2d. voir https://pytorch.org/docs/stable/nn.html pour plus de détails

0
Liyuan Zhang