Notes de lecture du code source Darknet (2)

De  https://github.com/BBuf/Darknet,  j'ai vu un blog bien écrit: https://mp.weixin.qq.com/s/RruZSl49vv5B0eRif-p9HQ

Apprenez d'abord. Il y a du contenu supplémentaire à ajouter.

analyse im2col

À partir du code ci-dessus, nous pouvons savoir que le point central de la propagation vers l'avant de la couche convolutive est l'opération im2col et la méthode de calcul de la matrice sgemm pour calculer les données après avoir utilisé im2col pour réorganiser. Analysons maintenant l'algorithme im2col. L'algorithme sgemm est juste appelé directement après l'exécution d'im2col, donc je n'entrerai pas dans les détails.

Considérant qu'il est plus facile de comprendre l'idée d'im2col avec des images, j'utiliserai l'image du blogueur de CSDN Tiger-Gao pour la décrire. Tout d'abord, que se passe-t-il après avoir réorganisé une image monocanal avec une longueur et une largeur de 4 via im2col? Regardez l'image ci-dessous:


Insérez la description de l'image ici

Jetons un coup d'œil au processus de changement en détail:

 

Il s'agit d'un processus de changement à canal unique, alors qu'en est-il du multi-canal? Regardez d'abord l'image originale:

 

Insérez la description de l'image ici

Le processus de im2col multicanal consiste à d'abord im2col le premier canal, puis im2col le deuxième canal, et enfin im2col le troisième canal. Les données de chaque canal im2col sont également stockées en permanence dans la mémoire. Regardez l'image ci-dessous:

Insérez la description de l'image ici

C'est le changement de l'image d'origine après im2col, qu'en est-il du noyau? Voir l'image originale:

 

Insérez la description de l'image ici

Les données du canal du noyau sont également stockées en permanence dans la mémoire. Ainsi, l'image du noyau ci-dessus peut être exprimée comme la figure suivante après l'algorithme im2col:

 

Alors, comment obtenir le résultat de la propagation vers l'avant? Dans DarkNet et Caffe sont implémentés de la même manière que Kernel * Img, c'est-à-dire en multiplication matricielle:

M=1 ,
N=output_h * output_w
K=input_channels * kernel_h * kernel_w

Les résultats sont les suivants:

 

 

Les données d'image sont stockées en continu, donc l'image de sortie peut également être comme indiqué dans la figure ci-dessous [output_h * output_w] = [2 * 2]:

 

Insérez la description de l'image ici

Le processus pour les images multicanaux est similaire:

 

 

De même, les données d'image de plusieurs canaux de sortie sont stockées en continu, de sorte que l'image de sortie peut également être comme indiqué dans la figure ci-dessous [output_channels * output_h * output_w] = [32 * 2]

 

Insérez la description de l'image ici

L'implémentation de l'algorithme im2col est dans src/im2col.cla im2col_cpufonction.

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/juluwangriyue/article/details/109185644
conseillé
Classement