2020-12-09 Analyse de la structure du réseau neuronal convolutif par apprentissage profond

1. Aperçu de la structure

Tout d'abord, nous analysons le traitement des images par les réseaux de neurones traditionnels. Si vous utilisez toujours des images sur CIFAR-10, il y a un total de 3072 fonctionnalités. Si la structure normale du réseau est entrée, chaque unité neuronale de la première couche aura 3072 poids. Si elle est plus grande Après avoir entré l'image du pixel, il y a plus de paramètres, et le réseau utilisé pour le traitement de l'image a généralement une profondeur de plus de 10 couches. Ensemble, la quantité de paramètres est trop grande et trop de paramètres entraîneront un ajustement excessif, et l'image a aussi la sienne propre Fonctionnalités, nous devons utiliser ces fonctionnalités pour réformer le réseau traditionnel afin d'accélérer la vitesse de traitement et la précision.
Nous avons remarqué que les pixels de l'image sont composés de 3 canaux, et nous avons profité de cette fonctionnalité pour placer leurs neurones dans un espace tridimensionnel (largeur, hauteur, profondeur), correspondant au 32x32x3 de l'image (prenez CIFAR comme exemple) comme indiqué ci-dessous : Le
Écrivez la description de l'image ici
rouge est le calque d'entrée où la profondeur est de 3 et le calque de sortie est une structure 1x1x10. La signification des autres couches sera introduite plus tard, et maintenant nous savons d'abord que chaque couche a une structure hauteur × largeur × profondeur .

2. Couches de réseau neuronal convolutif

Les réseaux de neurones convolutifs ont trois couches: couche convolutionnelle, couche de pooling et couche entièrement connectée (couche convolutionnelle, couche de pooling et couche entièrement connectée).
Prenons l'exemple du réseau de neurones convolutifs CIFAR-10. Un réseau simple devrait contenir ces couches:
[INPUT-CONV-RELU-POOL-FC] qui est [input-convolution-activation-pooling-classification score], Les couches sont décrites comme suit:

  • INPUT [32x32x3] Longueur d'entrée 32 largeur 32 image avec trois canaux
  • CONV: Calculez la zone locale de l'image. Si nous voulons utiliser 12 filtres fliters, son volume sera [32x32x12].
  • RELU: C'est toujours une couche d'excitation max (0, x), et la taille est toujours ([32x32x12]).
  • PISCINE: Échantillonnage le long de la (largeur, hauteur) de l'image, en réduisant les dimensions de longueur et de largeur, par exemple, le résultat est [16x16x12].
  • FC (c'est-à-dire entièrement connecté) calcule la taille finale du score de classification est [1x1x10], cette couche est entièrement connectée et chaque unité est connectée à chaque unité de la couche précédente.

Remarque:
1. Les volumes et les réseaux neuronaux contiennent différentes couches (par exemple, CONV / FC / RELU / POOL sont également les plus populaires)
2. Chaque couche entre et sort des données de structure 3D, à l'exception de la dernière couche
3. Certaines couches peuvent ne pas Paramètres, certaines couches peuvent avoir des paramètres (par exemple, CONV / FC do, RELU / POOL pas)
4. Certaines couches peuvent avoir des hyperparamètres et certaines couches peuvent ne pas avoir d'hyperparamètres (par exemple CONV / FC / POOL faire, RELU pas)
La figure ci-dessous est un exemple. Elle ne peut pas être représentée en trois dimensions et ne peut être développée que dans une seule colonne.
Écrivez la description de l'image ici
Les détails spécifiques de chaque couche sont décrits ci-dessous:

2.1 Couche convolutive

La couche convolutive est la couche centrale du réseau neuronal convolutif, ce qui améliore considérablement l'efficacité de calcul.
La couche convolutive est composée de nombreux filtres, chaque filtre n'a qu'une petite partie, à chaque fois il n'est connecté qu'à une petite partie de l'image d'origine, l'image sur UFLDL:
Écrivez la description de l'image ici
c'est le résultat d'un filtre qui continue de glisser,
nous voilà Pour aller plus loin, l'image que nous saisissons est tridimensionnelle, donc chaque filtre a également trois dimensions. En supposant que notre filtre est 5x5x3, nous obtiendrons également un mappage similaire à la valeur d'activation de l'image ci-dessus, c'est-à-dire convoluée La fonction est appelée carte d'activation dans la figure ci-dessous, et sa méthode de calcul est wT × x + bwT × x + b, où w est 5x5x3 = 75 données, qui est le poids, qui peut être ajusté.
Nous pouvons avoir plusieurs filtres:

Écrivez la description de l'image ici
Allez plus loin, il y a trois hyperparamètres lorsque l'on glisse:
1. Profondeur, profondeur, qui est déterminée par le nombre de filtres.
2. Foulée, foulée, l'intervalle de chaque glissement, l'animation ci-dessus ne glisse qu'un numéro à la fois, c'est-à-dire que la longueur du pas est 1.
3. Le nombre de zéros, de zéros, parfois au besoin, utilisera zéro Développez la zone de l'image. Si le nombre de zéros est 1, la longueur devient +2. La partie grise de la figure
Écrivez la description de l'image ici
ci-dessous est le zéro du complément. Voici un exemple unidimensionnel:
Écrivez la description de l'image ici
la formule de calcul de la dimension de l'espace en sortie est

(W − F + 2P) / S + 1 (W − F + 2P) / S + 1


Où w est la taille de l'entrée, f est la taille du filtre, p est la taille du remplissage nul et s est la taille du pas. Dans la figure, si le remplissage zéro est 1, la sortie est de 5 nombres et la taille du pas est de 2 et la sortie est de 3 nombres.
Jusqu'à présent, nous ne semblons pas avoir impliqué  le concept de nerve wow, maintenant nous le comprenons d'un point de vue neurologique:
chaque valeur d'activation mentionnée ci-dessus est: wT × x + bwT × x + b, cette formule nous est familière wow, ceci C'est la formule de notation des neurones, nous pouvons donc considérer chaque carte d'activation comme un chef-d'œuvre d'un filtre.S'il y a 5 filtres, il y aura 5 filtres différents connectés à une partie en même temps.
Les réseaux de neurones convolutifs ont une autre caractéristique importante: le partage de poids : les  poids des différentes unités neuronales (fenêtres glissantes) sur le même filtre sont les mêmes. Cela réduit considérablement le nombre de poids.
De cette façon, le poids de chaque couche est le même, et le résultat de chaque calcul de filtre est une convolution (un biais b sera ajouté plus tard):
Écrivez la description de l'image ici
c'est aussi la source du nom du réseau de neurones convolutif.
L'image ci-dessous est fausse, veuillez consulter le site officiel  http://cs231n.github.io/convolutional-networks/#conv , découvrez l'erreur et comprenez le principe de fonctionnement de la convolution.

Bien que le poids w de chaque filtre soit ici changé en trois parties, la forme wx + b est toujours utilisée dans le neurone.
-Backpropagation: La rétropropagation de ce type de convolution est toujours de la convolution, et le processus de calcul est relativement simple
-1x1 convolution: Certains articles utilisent la convolution 1 * 1, comme le premier  Network in NetworkCela peut effectivement faire plusieurs produits internes. L'entrée a trois couches, donc chaque couche doit avoir au moins trois ws, c'est-à-dire que le filtre du graphique dynamique ci-dessus est changé en 1x1x3.
-Convolutions dilatées. Récemment, il y a des recherches (  par exemple, voir l'article de Fisher Yu et Vladlen Koltun ) ont ajouté un hyperparamètre à la couche convolutive: la dilatation. Ceci est un autre contrôle du filtre. Allumons l'effet: lorsque la dilatation est égale à 0, calculons la convolution w [0] x [0] + w [1] x [1] + w [2] x [2]; dilatation Quand = 1, cela devient comme ceci: w [0] x [0] + w [1] x [2] + w [2] x [4]; c'est-à-dire que chaque image que nous voulons traiter est séparée par 1. Ceci Cela permet d'utiliser moins de couches pour fusionner les informations spatiales. Par exemple, nous utilisons deux couches CONV 3x3 sur la couche supérieure. C'est la deuxième couche qui joue le rôle de 5x5 (champ récepteur efficace). Si vous utilisez des convolutions dilatées, c'est efficace Le champ réceptif se développera de manière exponentielle.

 

2.2 Couche de regroupement

On peut voir de ce qui précède qu'il y a encore de nombreux résultats obtenus après la couche convolutive, et en raison de l'existence de la fenêtre glissante, beaucoup d'informations se chevauchent également, il y a donc une couche de regroupement, qui divise les résultats obtenus par la couche convolutionnelle en plusieurs points sans chevauchement. Pièce, puis sélectionnez la valeur maximale de chaque pièce, ou la valeur moyenne, ou la norme 2, ou d'autres valeurs de votre choix. Prenons le pool max avec la valeur maximale comme exemple:
Écrivez la description de l'image ici
-Propagation arrière: le gradient de la valeur maximale a été inversé avant Je l'ai déjà appris lors de la propagation, ici nous
suivons généralement la valeur d'activation maximale, de sorte que l'efficacité sera améliorée lors de la rétropropagation. - Se débarrasser du pooling. Certaines personnes pensent que le pooling est inutile, comme The All Convolutional Net  Beaucoup de gens pensent qu'aucune couche de pooling n'est importante pour les modèles génératifs.Il semble que la couche de pooling puisse progressivement diminuer ou disparaître dans le développement futur.

2.3 Autres couches

  1. Couche de normalisation, dans le passé, la couche de normalisation était utilisée pour simuler l'effet inhibiteur du cerveau humain, mais progressivement je pense qu'elle n'est pas très utile, donc je l'utilise moins. Cet article présente son rôle dans l'API de la bibliothèque cuda-convnet d'Alex Krizhevsky.
  2. Couche entièrement connectée, cette couche entièrement connectée est la même que ce que nous avons appris auparavant. Comme mentionné précédemment, la couche de classification finale est une couche entièrement connectée.

2.4 Conversion de couches FC en couches CONV

À l'exception des différentes méthodes de connexion, la couche entièrement connectée et la couche convolutive sont calculées en produits internes, qui peuvent être convertis les uns aux autres:
1. Si le FC fait le travail de la couche CONV, il est équivalent à la plupart des positions de sa matrice sont 0 (matrice clairsemée).
2. Si la couche FC est convertie en couche CONV. Cela équivaut à la connexion partielle de chaque couche devient tous les liens. Par exemple, l'entrée de la couche FC avec K = 4096 est 7 × 7 × 512, alors la couche convolutionnelle correspondante est F = 7, P = 0, S = 1, K = 4096 la sortie est 1 × 1 × 4096.
Exemple:
Supposons qu'un cnn entre une image 224x224x3, et après plusieurs changements, un calque génère 7x7x512. Ensuite, deux couches 4096 FC et les 1000 derniers FC sont utilisées pour calculer le score de classification. Voici le processus de conversion de ces trois couches de fc en Conv:
1 Utilisez la couche conv avec F = 7 pour sortir [1x1x4096];
2. Utilisez le filtre avec F = 1 pour sortir [1x1x4096];
3. Utilisez la couche conv avec F = 1 pour sortir [1x1x1000].

Chaque conversion convertira les paramètres FC dans la forme de paramètre conv. Si une image plus grande est transmise dans le système converti, le calcul avancera très rapidement. Par exemple, si vous entrez une image 384x384 dans le système ci-dessus, vous obtiendrez la sortie de [12x12x512] avant les trois dernières couches, et la couche conv convertie ci-dessus obtiendra [6x6x1000], ((12-7) / 1 + 1 = 6). Nous Un résultat de classement 6x6 a été obtenu en un clic.
C'est plus rapide que les 36 itérations d'origine. Il s'agit d'une technique d'application pratique.
De plus, nous pouvons utiliser deux couches convolutives avec une taille de pas de 16 au lieu d'une couche convolutive avec une taille de pas de 32 pour entrer l'image ci-dessus afin d'améliorer l'efficacité.

3 Construisez un réseau neuronal convolutif

Ci-dessous, nous utiliserons CONV, POOL, FC, RELU pour construire un réseau de neurones convolutifs:

3.1 Hiérarchie

Nous construisons selon la structure suivante

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
  •  

Où N> = 0 (généralement N <= 3), M> = 0, K> = 0 (généralement K <3)
Note ici: nous préférons utiliser des CONV multicouches et de petite taille.
Pourquoi?
Par exemple, 3 3x3 et une couche conv 7x7, ils peuvent tous obtenir des champs réceptifs 7x7. Mais 3x3 présente les avantages suivants:
1. La combinaison non linéaire de
3 couches a une capacité d'expression plus forte que la combinaison linéaire d' une couche ; 2. 3 couches Le nombre de paramètres de la couche convolutive de petite taille est inférieur, 3x3x3 <7x7;
3. En rétropropagation, nous devons utiliser plus de mémoire pour stocker les résultats de la couche intermédiaire.

Il convient de noter que les architectures de lancement de Google et les réseaux résiduels de Microsoft Research Asia ont tous deux créé une structure de connexion plus complexe que la structure ci-dessus.

3.2 Taille de la couche

  1. Couche d'entrée: La couche d'entrée est généralement sous la forme exponentielle de 2, comme 32 (par exemple CIFAR-10), 64, 96 (par exemple STL-10) ou 224 (par exemple ImageNet ConvNets communs), 384, 512, etc.
  2. Couche convolutive: généralement un petit filtre tel que 3x3 ou maximum 5x5, la taille du pas est définie sur 1, lors de l'ajout d'un remplissage nul, la couche convolutive peut ne pas changer la taille de l'entrée, si vous devez utiliser un grand filtre, il est souvent dans le premier La première couche utilise la méthode de remplissage à zéro P = (F − 1) / 2.
  3. Couche de mise en commun: un paramètre courant consiste à utiliser une couche de mise en commun maximale de 2x2, et il y a rarement une couche de mise en commun maximale supérieure à 3x3.
  4. Si notre taille de pas est supérieure à 1 ou s'il n'y a pas de remplissage nul, nous devons faire très attention à savoir si notre taille de pas et notre filtre sont suffisamment robustes et si notre réseau est connecté de manière uniforme et symétrique.
  5. Une taille de pas de 1 fonctionne mieux et est plus compatible avec la mise en commun.
  6. L'avantage du remplissage à zéro: si vous ne remplissez pas zéro, les informations de bord seront rapidement supprimées
  7. Tenez compte des limites de la mémoire de l'ordinateur. Par exemple, entrez une image 224x224x3, le filtre est 3x3, un total de 64 filtres et le remplissage est 1. Chaque image nécessite 72 Mo de mémoire, mais si elle est exécutée sur le GPU, la mémoire peut ne pas être suffisante, vous pouvez donc ajuster les paramètres tels que le filtre à 7x7 et avancer à 2 (ZF net ). Ou filer11x11, pas de 4. (AlexNet)

3.3 Cas

  1. LeNet. La première application réussie de cnn (Yann LeCun dans les années 1990). Ses atouts sont les codes postaux, les chiffres, etc.
  2. AlexNet. Le premier largement utilisé en vision par ordinateur (par Alex Krizhevsky, Ilya Sutskever et Geoff Hinton). Le défi ImageNet ILSVRC en 2012 brille, similaire à la structure LeNet mais plus profonde et plus grande, superposition de couches convolutives multicouches.
  3. ZF Net. Le gagnant de l'ILSVRC 2013 (Matthew Zeiler et Rob Fergus). Il est devenu connu sous le nom de ZFNet (abréviation de Zeiler & Fergus Net). Ajustement des paramètres structurels d'Alexnet, extension de la couche convolutive intermédiaire pour créer la première couche de filtres Et la taille des pas est réduite.
  4. GoogLeNet. Le lauréat de l'ILSVRC 2014 (Szegedy et al. De Google.) A considérablement réduit le nombre de paramètres (de 60M à 4M). En utilisant le pooling moyen au lieu de la première couche FC de ConvNet, éliminant de nombreux paramètres, il y en a beaucoup Des variantes telles que: Inception-v4.
  5. VGGNet. Le finaliste de l'ILSVRC 2014 (Karen Simonyan et Andrew Zisserman) a prouvé les avantages de la profondeur. Il peut être utilisé sur Caffe. Mais il y a trop de paramètres, (140M), et beaucoup de calculs. Mais maintenant, il y a beaucoup de inutiles Les paramètres peuvent être supprimés.
  6. ResNet. (Kaiming He et al). Gagnant de l'ILSVRC 2015. Depuis le 10 mai 2016, il s'agit du modèle le plus avancé. Il existe également une version améliorée de  Identity Mappings in Deep Residual Networks (publiée en mars 2016) .
    Parmi eux, VGG Le coût de calcul est:
INPUT: [224x224x3]        memory:  224*224*3=150K   weights: 0
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*3)*64 = 1,728
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*64)*64 = 36,864
POOL2: [112x112x64]  memory:  112*112*64=800K   weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*128)*128 = 147,456
POOL2: [56x56x128]  memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2: [28x28x256]  memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2: [14x14x512]  memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2: [7x7x512]  memory:  7*7*512=25K  weights: 0
FC: [1x1x4096]  memory:  4096  weights: 7*7*512*4096 = 102,760,448
FC: [1x1x4096]  memory:  4096  weights: 4096*4096 = 16,777,216
FC: [1x1x1000]  memory:  1000 weights: 4096*1000 = 4,096,000



TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters
  •  

Notez que lorsque la mémoire est le plus utilisée, dans les premières couches CONV, les paramètres se trouvent essentiellement dans les dernières couches FC. Le premier FC a 100M!

3.4 Utilisation de la mémoire

La mémoire est principalement consommée dans les aspects suivants:
1. Un grand nombre de valeurs d'activation et de valeurs de gradient. Lors du test, vous ne pouvez stocker que la valeur d'activation actuelle et ignorer les valeurs d'activation précédentes dans les couches inférieures, ce qui réduira considérablement la quantité de stockage de la valeur d'activation.
2. Le stockage des paramètres, le gradient lors de la rétropropagation et le cache lors de l'utilisation de l'élan, Adagrad ou RMSProp occuperont le stockage, de sorte que la mémoire utilisée par les paramètres estimés doit généralement être multipliée par au moins 3 fois
. 3. Chaque fois que le réseau fonctionne Souvenez-vous de toutes sortes d'informations, telles que le lot de données graphiques, etc.
Si l'on estime que la mémoire requise par le réseau est trop grande, vous pouvez réduire de manière appropriée le lot d'images, après tout, la valeur d'activation occupe beaucoup d'espace mémoire.

les autres informations

  1. Benchmarks Soumith pour la performance CONV
  2. Démonstration en  temps réel ConvNets du navigateur de démonstration ConvNetJS CIFAR-10 .
  3. Caffe , le populaire outil ConvNets
  4. ResNets à la pointe de la technologie à Torch7

 

Je suppose que tu aimes

Origine blog.csdn.net/qingfengxd1/article/details/110928363
conseillé
Classement