Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Capteurs Intelligents
Chapitre 4
Nous avons présenté dans les chapitres précédents les réseaux de neurones, mono couche
et multi couches, les principes de l’apprentissage automatique et les règles d’entrainement SGD,
Batch et Mini Batch. Nous allons présenter dans ce chapitre le Deeplearning et son application
pour la conception des interfaces intelligentes capables de traiter les données issues d’un
capteur et faire un traitement adéquat pour en extraire des paternes, même quand l’information
est complexe et (peu) non-structurées (image, son …). A la fin de ce chapitre, nous allons
donner une application sur une caméra capable de reconnaitre des chiffres écrits à la main.
2. Deeplearning
Le deep learning ou apprentissage profond est un type d'intelligence artificielle dérivé
du machine learning (apprentissage automatique) où la machine est capable d'apprendre par
elle-même, contrairement à la programmation où elle se contente d'exécuter à la lettre des règles
prédéterminées.
Base de données
Apprentissage
À chaque étape, les « mauvaises » réponses sont éliminées et renvoyées vers les niveaux
en amont pour ajuster le modèle mathématique. Au fur et à mesure, le programme réorganise
les informations en blocs plus complexes. Lorsque ce modèle est par la suite appliqué à d'autres
cas, il est normalement capable de reconnaître un chat sans que personne ne lui ait jamais
indiqué qu'il n'ai jamais appris le concept de chat. Les données de départ sont essentielles : plus
le système accumule d'expériences différentes, plus il sera performant.
Publicité
reconnaissance d'image,
traduction automatique,
voiture autonome,
diagnostic médical,
recommandations personnalisées,
modération automatique des réseaux sociaux,
prédiction financière et trading automatisé,
détection par caméra de pièces défectueuses,
détection de malwares ou de fraudes,
chatbots (agents conversationnels),
exploration spatiale,
robots intelligents.
Ville intelligente
C'est aussi grâce au deep Learning que l'intelligence artificielle de Google Alpha Go a
réussi à battre les meilleurs champions de Go en 2016. Le moteur de recherche du géant
américain est lui-même de plus en plus basé sur l'apprentissage par deep Learning plutôt que
sur des règles écrites.
Dans le domaine artistique, aujourd'hui le deep Learning est même capable de « créer »
tout seul des tableaux de Van Gogh ou de Rembrandt, d'inventer un langage totalement nouveau
pour communiquer entre deux machines. La musique aussi peut être composée par des
algorithmes du DEEPLEARNING.
3. Histoire du deeplearning
Ainsi, pour revenir à ses origines, il faut remonter au milieu du XXe siècle. En particulier
en 1943, avec l’apparition du modèle du « neurone formel », représentation schématique du
fonctionnement du cerveau humain. Ainsi qu’en 1957, avec l’invention du « perceptron »,
considéré comme le premier réseau de neurones artificiels.
Parallèlement à ces travaux, en 1950, le « test de Turing » voit le jour. Il s’agit d’une
épreuve dont le but est de tester la capacité d’une machine à reproduire le comportement
humain. Elle marque alors un tournant dans l’histoire de l’intelligence artificielle, dont
l’évolution connaîtra pourtant un sérieux ralentissement, jusque dans les années 1980
Problème : ces nouveaux réseaux de neurones, qui comportent plusieurs couches, nécessitent
une grande puissance de calcul pour être efficaces. De même, pour « entraîner » ces
algorithmes, il faut pouvoir accéder à une grande quantité de données… Des obstacles
difficiles à franchir à l’époque. Ce qui conduit la communauté scientifique à se détourner de
l’apprentissage profond dans les années 1990.
Par la suite, seuls quelques chercheurs continuent de croire en cette technologie. Et son
retour en grâce n’interviendra véritablement qu’en 2012. Cette année-là, comme tous les ans
depuis 2010, le concours ImageNet Large Scale Visual Recognition Challenge, de l’université
de Stanford, met aux prises des équipes de recherche en informatique du monde entier, sur un
défi de reconnaissance d’images. Et lors de cette édition, le programme vainqueur pulvérise les
records établis jusqu’à présent, en s’appuyant pour la première fois sur le deep learning.
Cette même année, Google dévoile son projet « Google Brain », un programme capable
d’analyser des images. D’après la firme, l’ordinateur a alors étudié des millions de captures
d’écran de vidéos, sélectionnées aléatoirement et sans information supplémentaire. Et la
machine aurait fini par découvrir par elle-même le concept de chat et par savoir détecter la
présence d’un tel animal sur les clichés.
Script : TestBackpropXOR
1. clear all
2. X = [ 0 0 1;
3. 0 1 1;
4. 1 0 1;
5. 1 1 1;
6. ];
7. % Verifiez les valeurs de D
8. D = [ 0
9. 1
10. 1
11. 0
12. ];
13. W1 = 2*rand(4, 3) - 1;
14. W2 = 2*rand(1, 4) - 1;
15. for epoch = 1:10000 % train
17. end
18. N = 4; % inference
19. for k = 1:N
20. x = X(k, :)';
21. v1 = W1*x;
22. y1 = Sigmoid(v1);
23. v = W2*y1;
24. y(k) = Sigmoid(v)
25. end
26. y'
e1 = W2'*delta;
delta1 = y1.*(1-y1).*e1;
function y = Sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
e1 = W2'*delta;
delta1 = y1.*(1-y1).*e1;
dW1 = alpha*delta1*x';
W1 = W1 + dW1;
La variable m, est un terme qui est ajouté à la règle du delta pour ajuster le poids.
L'utilisation du terme de momentum conduit l'ajustement du poids dans une certaine direction
dans une certaine mesure, plutôt que de produire un changement immédiat. Il agit de manière
similaire au moment physique, ce qui entrave la réaction du corps aux forces externes.
où m- est la valeur du moment précédent (itération k-1 )et β est une constante positive
inférieure à 1. Voyons brièvement pourquoi nous modifions la formule d'ajustement du poids
de cette manière. Les étapes suivantes montrent comment l'élan change au fil du temps.
il ressort de ces étapes que la mise à jour de poids précédente, à savoir ∆w (1), ∆w (2),
∆w (3), etc., est ajoutée à chaque itération au cours du processus. Étant donné que β est inférieur
à 1, l'ancienne mise à jour du poids exerce une influence moindre sur le moment. Bien que
l'influence diminue avec le temps, les anciennes mises à jour de poids restent dans le moment.
Par conséquent, le poids n'est pas uniquement affecté par une valeur de mise à jour de poids
particulière. Par conséquent, la stabilité d'apprentissage s'améliore. De plus, le moment se
développe de plus en plus avec les mises à jour de poids. En conséquence, la mise à jour du
poids devient également de plus en plus importante. Par conséquent, le taux d'apprentissage
augmente (regarder les équations suivantes développées pour plusieurs itérations)
Le code suivant montre le fichier BackpropMmt.m, qui implémente l'algorithme de
rétropropagation avec moment. La fonction BackpropMmt fonctionne de la même manière que
celle de l'exemple précédent; il prend les poids et les données d'entraînement et renvoie les
poids ajustés. Ce code utilise les mêmes variables que celles définies dans la fonction
BackpropXOR.
Fonction : BackpropMmt
1. function [W1, W2] = BackpropMmt(W1, W2, X, D)
2. alpha = 0.9;
3. beta = 0.9;
4. mmt1 = zeros(size(W1));
5. mmt2 = zeros(size(W2));
6. N = 4;
7. for k = 1:N
8. x = X(k, :)';
9. d = D(k);
10. v1 = W1*x;
11. y1 = Sigmoid(v1);
12. v = W2*y1;
13. y = Sigmoid(v);
14. %%
15. e = d - y;
16. delta = y.*(1-y).*e;
17. e1 = W2'*delta;
18. delta1 = y1.*(1-y1).*e1;
19. %%
20. dW1 = alpha*delta1*x';
21. mmt1 = dW1 + beta*mmt1;
22. W1 = W1 + mmt1;
23. dW2 = alpha*delta*y1';
24. mmt2 = dW2 + beta*mmt2;
25. W2 = W2 + mmt2;
26. end
27. end
Script : TestBackpropXOR
1. clear all
2. X = [ 0 0 1;
3. 0 1 1;
4. 1 0 1;
5. 1 1 1;
6. ];
7. D = [ 0
8. 1
9. 1
10. 0
11. ];
12. W1 = 2*rand(4, 3) - 1;
13. W2 = 2*rand(1, 4) - 1;
14. for epoch = 1:10000 % train
15. [W1 W2] = BackpropMmt(W1, W2, X, D);
16. end
17. N = 4; % inference
18. for k = 1:N
19. x = X(k, :)';
20. v1 = W1*x;
21. y1 = Sigmoid(v1);
22. v = W2*y1;
23. y(k) = Sigmoid(v);
24. end
25. y'
Le code initialise mmt1 et mmt2, sous forme de zéros lorsqu'il démarre le processus
d'apprentissage. La formule d'ajustement du poids est modifiée ici :
dW1 = alpha*delta1*x';
mmt1 = dW1 + beta*mmt1;
W1 = W1 + mmt1;
Cette section explique brièvement ce qu'est la fonction de coût et comment elle affecte
la règle d'apprentissage du réseau neuronal. La fonction de coût est un concept plutôt
mathématique associé à la théorie de l'optimisation (autre grande bronche de l’IA). Vous n'avez
pas besoin de le savoir pour le moment. Cependant, il est bon de savoir si vous souhaitez mieux
comprendre la règle d'apprentissage du réseau neuronal.
Ce n'est pas un concept difficile à suivre. La fonction de coût est liée à l'apprentissage
supervisé du réseau neuronal. Le chapitre précédent a expliqué que l'apprentissage supervisé
du réseau de neurones est un processus d'ajustement des poids pour réduire l'erreur des données
d'entraînement. Dans ce contexte, la mesure de l'erreur du réseau neuronal est la fonction de
coût. Plus l'erreur du réseau de neurones est grande, plus la valeur de la fonction de coût est
élevée. Il existe deux principaux types de fonctions de coût pour l'apprentissage supervisé du
réseau de neurones qui sont données ici.
𝜹 = 𝑬 à la place de 𝜹 = 𝜳′ (𝒗) ∗ 𝑬
𝐞=𝐝−𝐲
𝛅=𝐞
3. Propagez le delta du nœud de sortie vers l'arrière et calculez le delta des
nœuds cachés suivants.
𝑒 (𝑘) = 𝑊 𝑇 ∗ 𝛿
𝛿 (𝑘) = 𝛹 ′(𝑣 (𝑘) ) ∗ 𝑒 (𝑘)
Cette section revisite l'exemple de rétropropagation. Mais cette fois, la règle d'apprentissage
dérivée de la fonction d'entropie croisée est utilisée. Considérez l’entrainement du réseau
neuronal qui se compose d'une couche cachée avec quatre nœuds, trois nœuds d'entrée et un
nœud de sortie unique. La fonction sigmoïde est utilisée pour la fonction d'activation des nœuds
cachés et du nœud de sortie.
La fonction BackpropCE forme les données de XOR à l'aide de la fonction d'entropie
croisée. Il prend les poids et les données d'entraînement du réseau neuronal et renvoie les poids
ajustés.
où W1 et W2 sont les matrices de pondération pour les couches d'entrée cachées et les couches
de sortie cachées, respectivement. De plus, X et D sont respectivement les matrices d'entrée et
de sortie correctes des données. Le code suivant montre le fichier BackpropCE.m, qui
implémente la fonction BackpropCE. (rétro propagation avec la fonction d’entropie croisée)
Fonction : BackpropCE
1. function [W1, W2] = BackpropCE(W1, W2, X, D)
2. alpha = 0.9;
3. N = 4;
4. for k = 1:N
5. x = X(k, :)'; % x = a column vector
6. d = D(k);
7. v1 = W1*x;
8. y1 = Sigmoid(v1);
9. v = W2*y1;
10. y = Sigmoid(v);
11. %%%%%%%%%%%%%
12. %%%%%%%%%%%%% PARTIE 2
13. e = d - y;
14. delta = e;
15. e1 = W2'*delta;
16. delta1 = y1.*(1-y1).*e1;
17. %%%%%%%%%%%%%
18. %%%%%%%%%%%%%
19. dW1 = alpha*delta1*x';
20. W1 = W1 + dW1;
21. dW2 = alpha*delta*y1';
22. W2 = W2 + dW2;
23. end
24. end
Ce code (la fonction BackpropCE) extrait les données d'entraînement, calcule les mises
à jour de poids (dW1 et dW2) en utilisant la règle delta et ajuste les poids du réseau de neurones
en utilisant ces valeurs. Jusqu'à présent, le processus est presque identique à celui de l'exemple
précédent. La différence survient lorsque nous calculons le delta du nœud de sortie comme
e = d - y;
delta = e;
e1 = W2'*delta;
delta1 = y1.*(1-y1).*e1;
L'exécution de ce code produit les valeurs affichées ici. La sortie est très proche de la
sortie correcte, D. Cela prouve que le réseau neuronal a été formé avec succès
d. Comparaison
La seule différence entre la fonction BackpropCE de la section précédente et la fonction
BackpropXOR de la section «Problème XOR» est le calcul du delta du nœud de sortie. Nous
examinerons comment cette différence presque insignifiante affecte les performances
d'apprentissage. Le code suivant montre le fichier CEvsSSE.m qui compare les erreurs
moyennes des deux fonctions.
Script : CEvsSSE.m
1. clear all
2. X = [ 0 0 1;
3. 0 1 1;
4. 1 0 1;
5. 1 1 1;
6. ];
7. D = [ 0
8. 0
9. 1
10. 1
11. ];
12. E1 = zeros(1000, 1);
13. E2 = zeros(1000, 1);
14. W11 = 2*rand(4, 3) - 1; % Cross entropy
15. W12 = 2*rand(1, 4) - 1; %
16. W21 = W11; % Sum of squared error
17. W22 = W12; %
18. for epoch = 1:1000
19. [W11 W12] = BackpropCE(W11, W12, X, D);
20. [W21 W22] = BackpropXOR(W21, W22, X, D);
21. es1 = 0;
22. es2 = 0;
23. N = 4;
24. for k = 1:N
25. x = X(k, :)';
26. d = D(k);
27. v1 = W11*x;
28. y1 = Sigmoid(v1);
29. v = W12*y1;
30. y = Sigmoid(v);
31. es1 = es1 + (d - y)^2;
32. v1 = W21*x;
33. y1 = Sigmoid(v1);
34. v = W22*y1;
35. y = Sigmoid(v);
36. es2 = es2 + (d - y)^2;
37. end
38. E1(epoch) = es1 / N;
39. E2(epoch) = es2 / N;
40. end
41. plot(E1, 'r')
42. hold on
43. plot(E2, 'b:')
44. xlabel('Epoch')
45. ylabel('Average of Training error')
46. legend('Cross Entropy', 'Sum of Squared Error')
𝑒 𝑣𝑖
𝛹 (𝑣𝑖 ) = 𝑀 𝑣
∑𝑖=1 𝑒 𝑖
9. Deeplearning
Il est temps de présenter le DeepLearning. Le Deep Learning étant toujours une extension
du réseau neuronal, la plupart de ce que vous avez lu précédemment est applicable. Par
conséquent, vous n'avez pas beaucoup de concepts supplémentaires à apprendre. En bref, le
Deep Learning est une technique d'apprentissage automatique qui utilise le réseau neuronal
profond. Comme vous le savez, le réseau neuronal profond est le réseau neuronal multicouche
qui contient deux couches cachées ou plus. Bien que cela puisse être d'une simplicité décevante,
c'est la véritable essence du Deep Learning. La figure 5-1 illustre le concept du Deep Learning
et sa relation avec le Machine Learning
𝑣 𝑠𝑖 𝑣 > 0
𝛹(𝑣) = max(𝑉, 0) = {
0 𝑎𝑖𝑙𝑙𝑒𝑢𝑟𝑠
Le code Matlabe de Softmax est donnée en activité.
Le dernier défi est le temps requis pour terminer l’apprentissage quand les données sont
gigantesques. Le nombre de poids augmente géométriquement avec le nombre de couches
cachées, nécessitant ainsi plus de données d'apprentissage. Cela nécessite finalement plus de
calculs. Plus le réseau de neurones effectue de calculs, plus l’apprentissage prend de temps. Ce
problème est une préoccupation sérieuse dans le développement pratique du réseau neuronal.
Si un réseau de neurones profond nécessite un mois de formation (d’apprentissage), il ne peut
être modifié que 20 fois par an. Une étude utile n'est guère possible dans cette situation. Ce
problème a été résolu dans une large mesure par l'introduction de matériel haute performance,
tel que le GPU, et d'algorithmes, tels que la normalisation par lots. Les améliorations mineures
que cette section a introduites sont les pilotes qui ont fait du Deep Learning le héros du Machine
Learning . le Deep Learning surpasse actuellement toutes les techniques auparavant utilisées.
Soit les images suivantes. Chaque carré est pixel, pour le blanc la valeur est 0 et pour le
noir la valeur sert 1. On obtient alors des matrices 5×5. (voir activité 6 )
Considérez le réseau neuronal profond avec les trois couches cachées, comme le montre
la figure suivante. Chaque couche cachée contient 20 neurones, fonction d’activation ReLu
(REctified Linear Unit). Le réseau possède 25 neurones d'entrée pour l'entrée matricielle et cinq
neurones de sortie pour les cinq classes (1, 2, 3, 4, 5). Les neurones de sortie utilisent la fonction
d'activation softmax (car c’est un problème de classification).
où W1, W2, W3 et W4 sont des matrices de pondération des couches d'entrée-caché1, caché1-
caché2, caché2-caché3 et caché3-sorties, respectivement. X et D sont des matrices d'entrée et
de sortie correctes des données d'entraînement. Le code suivant montre le fichier DeepReLU.m,
qui implémente la fonction DeepReLU.
Fonction : DeepReLU
1. function [W1, W2, W3, W4] = DeepReLU(W1, W2, W3, W4, X,
D)
2. alpha = 0.01;
3. N = 5;
4. for k = 1:N
5. x = reshape(X(:, :, k), 25, 1);
6. v1 = W1*x;
7. y1 = ReLU(v1);
8. v2 = W2*y1;
9. y2 = ReLU(v2);
10. v3 = W3*y2;
11. y3 = ReLU(v3);
12. v = W4*y3;
13. y = Softmax(v);
14. d = D(k, :)';
15. %%%%%%%%%%%%
16. e = d - y;
17. delta = e;
18. e3 = W4'*delta;
19. delta3 = (v3 > 0).*e3;
20. e2 = W3'*delta3;
21. delta2 = (v2 > 0).*e2;
22. e1 = W2'*delta2;
23. delta1 = (v1 > 0).*e1;
24. dW4 = alpha*delta*y3';
25. W4 = W4 + dW4;
26. dW3 = alpha*delta3*y2';
27. W3 = W3 + dW3;
28. dW2 = alpha*delta2*y1';
29. W2 = W2 + dW2;
30. dW1 = alpha*delta1*x';
31. W1 = W1 + dW1;
32. end
33. end
Script : TestDeepReLU
1. clear all
2. X = zeros(5, 5, 5);
3. X(:, :, 1) =[...
4. 0 1 1 0 0;
5. 0 0 1 0 0;
6. 0 0 1 0 0;
7. 0 0 1 0 0;
8. 0 1 1 1 0
9. ];
10. X(:, :, 2) = [...
11. 1 1 1 1 0;
12. 0 0 0 0 1;
13. 0 1 1 1 0;
14. 1 0 0 0 0;
15. 1 1 1 1 1
16. ];
17. X(:, :, 3) = [ ...
18. 1 1 1 1 0;
19. 0 0 0 0 1;
20. 0 1 1 1 0;
21. 0 0 0 0 1;
22. 1 1 1 1 0
23. ];
24. X(:, :, 4) = [...
25. 0 0 0 1 0;
26. 0 0 1 1 0;
27. 0 1 0 1 0;
28. 1 1 1 1 1;
29. 0 0 0 1 0
30. ];
31. X(:, :, 5) = [...
32. 1 1 1 1 1;
33. 1 0 0 0 0;
34. 1 1 1 1 0;
35. 0 0 0 0 1;
36. 1 1 1 1 0
37. ];
38. D = [ ...
39. 1 0 0 0 0;
40. 0 1 0 0 0;
41. 0 0 1 0 0;
42. 0 0 0 1 0;
43. 0 0 0 0 1
44. ];
Ce code importe les données d'entraînement, calcule les mises à jour de poids (dW1, dW2,
dW3 et dW4) à l'aide de la règle delta et ajuste le poids du réseau neuronal. Jusqu'à présent, le
processus est identique aux codes précédents. Il ne diffère que par le fait que les nœuds cachés
utilisent la fonction ReLU, à la place de sigmoïde. Bien sûr, l'utilisation d'une fonction
d'activation différente entraîne également une modification de sa dérivée.
Considérons la partie de l'algorithme de rétropropagation, qui ajuste les poids à l'aide de
l'algorithme de rétropropagation. Le code suivant montre l'extrait du calcul delta du fichier
DeepReLU.m. Ce processus commence à partir du delta du nœud de sortie, calcule l'erreur du
nœud (couche) caché et l'utilise pour l'erreur suivante. Il répète les mêmes étapes via delta3,
delta2 et delta1.
e = d - y;
delta = e;e
3 = W4'*delta;
delta3 = (v3 > 0).*e3;
e2 = W3'*delta3;
delta2 = (v2 > 0).*e2;
e1 = W2'*delta2;
delta1 = (v1 > 0).*e1;
Fonction : DroupOut
Couche de convolution
Cette section explique comment fonctionne la couche de convolution, qui sert à
l’extraction d'entités à partir d’images. La couche de convolution génère de nouvelles images
appelées cartes d'entités. La carte des entités accentue les caractéristiques uniques de l'image
d'origine. La couche de convolution fonctionne de manière très différente par rapport aux autres
couches du réseau neuronal. Cette couche n'utilise pas une somme pondérée des connexions.
Au lieu de cela, elle contient des filtres qui convertissent les images. Nous appellerons ces
filtres des filtres convolutifs. Le processus d'entrée de l'image à travers les filtres de convolution
donne la carte des caractéristiques (des entités).
Fig.9 Effet de la couche de convolution
La figure précédente montre le processus effectué par la couche de convolution, où la
marque encerclée * indique l'opération de convolution et la marque φ est la fonction
d'activation. Les icônes carrées en niveaux de gris entre ces opérateurs indiquent les filtres de
convolution. La couche de convolution génère le même nombre de cartes d'entités que les filtres
de convolution. Par conséquent, par exemple, si la couche de convolution contient quatre filtres,
elle génèrera quatre cartes d'entités.
Convolution matricielle
Une image est représentée généralement sur ordinateur comme une matrice. En noir est
blanc, le cas le plus simple, serait de considérer chaque pixel en binaire (noir =1, blanc=0). Le
pixel peut contenir aussi le niveau en gris (méthode utilisée dans les écrans noir et blanc). Les
images en couleurs sont codées en RGB, c’est-à-dire trois matrices (R pour le niveau de la
couleur rouge, G pour le niveau de la couleur verte, B pour le niveau de la couleur bleue), ceci
donne trois valeurs pour chaque pixel.
Nous allons alors considérer l’image comme une matrice. Regardons maintenant la
convolution suivante entre une image de 4×4 pixels et un filtre de 2×2.
L'opération de convolution est la somme des produits des éléments qui se trouvent aux
mêmes positions des deux matrices. Le résultat de 7 dans le calcul précédent est calculé comme
suit:
(1×1) + (1×0) + (4×0) + (6×1) = 7
La convolutions complète donne alors :
Un autre exemple ici
Couche de POOLING
La couche de regroupement (POOLING) réduit la taille de l'image, car elle combine les
pixels voisins d'une certaine zone de l'image en une seule valeur représentative. Afin de mener
les opérations dans la couche de POOLING, nous devons déterminer comment sélectionner les
pixels de POOLING de l'image et comment définir la valeur représentative. Les pixels voisins
sont généralement sélectionnés dans la matrice carrée et le nombre de pixels combinés diffère
d'un problème à l'autre. La valeur représentative est généralement définie comme la moyenne
( mean pooling) ou le maximum (max pooling) des pixels sélectionnés. Le fonctionnement de
la couche de mise en commun est étonnamment simple. Comme il s'agit d'une opération
bidimensionnelle et qu'une explication dans le texte peut créer plus de confusion, passons en
exemple. Considérons l'image d'entrée de 4 × 4 pixels, qui est exprimée par la matrice suivante :
Fig.10 Illustration de l’opération de pooling.
Exemple: MNIST
Nous implémentons un réseau neuronal qui prend l'image d'entrée et reconnaît le chiffre
qu'elle représente. Les données d’apprentissage sont la base de données MNIST, qui contient
70 000 images de nombres manuscrits (écrit à la main). En général, 60 000 images sont utilisées
pour la formation (l’apprentissage) et les 10 000 images restantes sont utilisées pour le test de
validation. Chaque image à chiffres est une image en noir et blanc de 28 x 28 pixels, comme
illustré à la figure suivante.
Fig 11. Base MNIST
Compte tenu du temps de formation (d’apprentissage), cet exemple n'utilise que 10 000
images avec les données de formation et les données de vérification dans un rapport 8 à 2. Par
conséquent, nous avons 8 000 images MNIST pour la formation et 2 000 images pour la
validation des performances du réseau neuronal. Comme vous le savez peut-être maintenant, le
problème MNIST consiste en la classification multiclasse de l'image de 28×28 pixels dans l'une
des dix classes de chiffres de 0 à 9. Ceci dans l’objectif est depermettre une reconnaissance
intelligente.
Prenons un ConvNet (réseau profond avec des convolution ) qui reconnaît les images du
MNIST. L'entrée étant une image en noir et blanc de 28×28 pixels, nous autorisons 784 (=
28x28) noeuds d'entrée. Le réseau d'extraction d'entités contient une seule couche de
convolution avec 20 filtres de convolution de 9×9. La sortie de la couche de convolution passe
par la fonction ReLU, suivie de la couche de regroupement (pooling). La couche de pooling
utilise le processus mean pooling de deux par deux. Le réseau neuronal de classification se
compose d'une seule couche cachée et d'une couche de sortie. Cette couche cachée a 100 nœuds
(neurones) qui utilisent la fonction d'activation ReLU. Puisque nous avons 10 classes à classer,
la couche de sortie est construite avec 10 nœuds. Nous utilisons la fonction d'activation softmax
pour les nœuds de sortie.
La figure suivante montre l'architecture de ce réseau de neurones. Bien qu'il comporte de
nombreuses couches, seules trois d'entre elles contiennent les matrices de poids qui nécessitent
une adaptation; ils sont W1, W5 et Wo dans les blocs carrés. W5 et Wo contiennent les poids
de connexion du réseau neuronal de classification, tandis que W1 est le poids de la couche
de convolution, qui est utilisé par les filtres de convolution pour le traitement d'image.
Fig.12 Architecture du réseau utilisé pour reconnaitre les chiffres.
En pratique ce réseau, après apprentissage, doit être utilisé en série avec une caméra.
Fonction : MnistConv
1. function [W1, W5, Wo] = MnistConv(W1, W5, Wo, X, D)
2. %
3. %
4. alpha = 0.01;
5. beta = 0.95;
6. momentum1 = zeros(size(W1)); % revoir Activité 3
7. momentum5 = zeros(size(W5));
8. momentumo = zeros(size(Wo));
9. N = length(D);
10. bsize = 100;
11. blist = 1:bsize:(N-bsize+1);
12. % One epoch loop
13. %
14. for batch = 1:length(blist)
15. dW1 = zeros(size(W1));
16. dW5 = zeros(size(W5));
17. dWo = zeros(size(Wo));
18. % Mini-batch loop
19. %
20. begin = blist(batch);
21. for k = begin:begin+bsize-1
22. % Forward pass = inference
23. %
24. x = X(:, :, k); % Input, 28x28
25. y1 = Conv(x, W1); % Convolution, 20x20x20
26. y2 = ReLU(y1); %
27. y3 = Pool(y2); % Pool, 10x10x20
28. y4 = reshape(y3, [], 1); % 2000
29. v5 = W5*y4; % ReLU, 360
30. y5 = ReLU(v5); %
31. v = Wo*y5; % Softmax, 10
32. y = Softmax(v); %
33. % One-hot encoding
34. %
35. d = zeros(10, 1);
36. d(sub2ind(size(d), D(k), 1)) = 1;
37. % Backpropagation
38. %
39. e = d - y; % Output layer
40. delta = e;
41. e5 = Wo' * delta; % Hidden(ReLU) layer
42. delta5 = (y5 > 0) .* e5;
43. e4 = W5' * delta5; % Pooling layer
44. e3 = reshape(e4, size(y3));
45. e2 = zeros(size(y2));
46. W3 = ones(size(y2)) / (2*2);
47. for c = 1:20
48. e2(:, :, c) = kron(e3(:, :, c), ones([2 2])) .* W3(:, :, c);
49. end
50. delta2 = (y2 > 0) .* e2; % ReLU layer
51. delta1_x = zeros(size(W1)); % Convolutional layer
52. for c = 1:20
53. delta1_x(:, :, c) = conv2(x(:, :), rot90(delta2(:, :, c), 2),
54. 'valid');
55. end
56. dW1 = dW1 + delta1_x;
57. dW5 = dW5 + delta5*y4';
58. dWo = dWo + delta *y5';
59. end
60. % Update weights
61. %
62. dW1 = dW1 / bsize;
63. dW5 = dW5 / bsize;
64. dWo = dWo / bsize;
65. momentum1 = alpha*dW1 + beta*momentum1;
66. W1 = W1 + momentum1;
67. momentum5 = alpha*dW5 + beta*momentum5;
68. W5 = W5 + momentum5;
69. momentumo = alpha*dWo + beta*momentumo;
70. Wo = Wo + momentumo;
71. end
72. end
Script : TestMinistConv
1. clear all
2. Images = loadMNISTImages('./ t10k-images-idx3-ubyte/t10k-
images.idx3-ubyte');
3. Images = reshape(Images, 28, 28, []);
4. Labels = loadMNISTLabels('./ t10k-labels-idx1-ubyte/t10k-
labels.idx1-ubyte');
5. Labels(Labels == 0) = 10; % 0 --> 10
6. rng(1);
7. % Learning
8. %
9. W1 = 1e-2*randn([9 9 20]);
10. W5 = (2*rand(100, 2000) - 1) * sqrt(6) / sqrt(360 + 2000);
11. Wo = (2*rand( 10, 100) - 1) * sqrt(6) / sqrt( 10 + 100);
12. X = Images(:, :, 1:8000);
13. D = Labels(1:8000);
14. for epoch = 1:3
15. epoch
16. [W1, W5, Wo] = MnistConv(W1, W5, Wo, X, D);
17. end
18. save('MnistConv.mat');
19. % Test
20. %
21. X = Images(:, :, 8001:10000);
22. D = Labels(8001:10000);
23. acc = 0;
24. N = length(D);
25. for k = 1:N
26. x = X(:, :, k); % Input, 28x28
27. y1 = Conv(x, W1); % Convolution, 20x20x20
28. y2 = ReLU(y1); %
29. y3 = Pool(y2); % Pool, 10x10x20
30. y4 = reshape(y3, [], 1); % 2000
31. v5 = W5*y4; % ReLU, 360
32. y5 = ReLU(v5); %
33. v = Wo*y5; % Softmax, 10
34. y = Softmax(v); %
35. [~, i] = max(y);
36. if i == D(k)
37. acc = acc + 1;
38. end
39. end
40. acc = acc / N;
41. fprintf('Accuracy is %f\n', acc);
Script : PlotFeatures
% Ce code sert à visualiser les différentes couche du réseau de
% neurones.
clear all
load('MnistConv.mat')
k = 2;
x = X(:, :, k); % Input, 28x28
y1 = Conv(x, W1); % Convolution, 20x20x20
y2 = ReLU(y1); %
y3 = Pool(y2); % Pool, 10x10x20
y4 = reshape(y3, [], 1); % 2000
v5 = W5*y4; % ReLU, 360
y5 = ReLU(v5); %
v = Wo*y5; % Softmax, 10
y = Softmax(v); %
figure;
display_network(x(:));
title('Input Image')
convFilters = zeros(9*9, 20);
for i = 1:20
filter = W1(:, :, i);
convFilters(:, i) = filter(:);
end
figure
display_network(convFilters);
title('Convolution Filters')
fList = zeros(20*20, 20);
for i = 1:20
feature = y1(:, :, i);
fList(:, i) = feature(:);
end
figure
display_network(fList);
title('Features [Convolution]')
fList = zeros(20*20, 20);
for i = 1:20
feature = y2(:, :, i);
fList(:, i) = feature(:);
end
figure
display_network(fList);
title('Features [Convolution + ReLU]')
fList = zeros(10*10, 20);
for i = 1:20
feature = y3(:, :, i);
fList(:, i) = feature(:);
end
figure
display_network(fList);
title('Features [Convolution + ReLU + MeanPool]')
Conclusion