Partie 1 - Developpez.net

Transcription

Partie 1 - Developpez.net
Reconnaissance des Formes et Méthodes Neuronales (RCP208)
TP N o 4
Ce TP comporte deux parties : les perceptrons multicouches (suite du TP3) et les cartes
topologiques (introduction de la toolbox Matlab).
Partie 1
Dans cette partie, nous allons utiliser les réseaux de neurones de type perceptron multicouches
(PMC) sur un problème réel de classification, il s’agit des Iris de Fisher.
Les données : les Iris de Fisher correspondent à 150 fleurs décrites par 4 variables quantitatives : longueur du sépale, largeur du sépale, longueur du pétal et largeur du pétal.
Les 150 fleurs sont réparties en 3 différentes espèces : iris setosa, iris versicolor et iris virginica
Chaque classe est composée de 50 fleurs. La classe setosa est linéairement séparable des deux
autres, alors que versicolor et virginica ne le sont pas.
Le fichier iris don.mat contient les vecteurs d’entrée en dimension 4 décrivant les 150 iris. Le
fichier iris cls.mat contient les classes des 150 iris.
Pour lire ces fichiers faire :
load -ascii iris don.mat
load -ascii iris cls.mat
Codage des sorties : Le codage classique des sorties désirées pour la classification utilise
un neurone de sortie par classe, avec une valeur désirée haute pour le neurone de la classe
correcte, et une valeur désirée faible pour les autres classes.
Nous allons utiliser le codage suivant :
classe 1 → (1 0 0)
classe 2 → (0 1 0)
classe 3 → (0 0 1)
Vous pouvez générer la matrice de sortie en utilisant les instructions Matlab suivantes :
>>
>>
>>
>>
iris
iris
iris
iris
output=zeros(150,3);
output(find(iris cls==1),1)=1;
output(find(iris cls==2),2)=1 ;
output(find(iris cls==3),3)=1;
Rappels : cas d’un PMC avec une couche cachée
1. Initialisation : définir une architecture et initialiser les poids
Net = mlp(nin, nhidden, nout,outfunc);
• nin : nombre de neurones en entrée.
• nhidden : nombre de neurones cachés.
• nout : nombre de neurones en sortie.
• outfunc : fonction d’activation pour la couche de sortie
outfunc = ’linear’, ’logistic’ ou ’softmax’
→ help mlp pour plus de détails.
1
2. Cycle d’apprentissage
[Net, options] = netopt(Net, options, x, t, alg);
alg = ’scg’ ,’conjgrad’ ou ’quasinew’ (algorithme d’optimisation)
→ help netopt pour plus de détails..
3. Tester le réseau
Ycal = mlpfwd(Net, X);
La fonction mlpfwd permet de calculer la sortie Ycal calculée par le réseau Net pour
l’entrée X. Supposons que Yt est la sortie désirée pour l’entrée X. On peut alors avoir une
idée de la qualité de notre apprentissage en comparant Yt à Ycal.
Travail à faire
Notre objectif est de comprendre l’influence des différents paramètres sur la qualité de l’apprentissage.
Nous allons faire plusieurs apprentissages en faisant varier ces divers paramètres.
1. Première expérience
• Utiliser les 130 premières iris pour l’apprentissage et les autres pour le test.
• Utiliser 3 neurones cachés.
• Pour un problème de classification, il vaut mieux utiliser des fonctions d’activation
non linéaires à la couche de sortie. Utiliser la fonction ’softmax’.
• Faire 100 cycles d’apprentissage (options(14)=100)
2. Autres expériences
• Faire varier le nombre de points dans l’ensemble d’apprentissage.
• Faire varier le nombre de neurones cachés.
• Faire varier le nombre de cycles d’apprentissage.
• Utiliser deux ou trois variables seulement.
Pour chacune de ces experiences,
• évaluer l’erreur de classification au moyen de la matrice de confusion.
• Identifier les instances mal classées.
Par exemple, vous pouvez utiliser les instructions Matlab suivantes :
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
Ycalculee=mlpfwd(Net,iris input);
classe t=iris cls;
[max y classe y]=max(Ycalculee’);
classe y=classe y’;
exemples mal classes=find(classe t∼=classe y);
NetClass=zeros(150,3);
NetClass(find(classe y==1),1)=1;
NetClass(find(classe y==2),2)=1;
NetClass(find(classe y==3),3)=1;
conffig(NetClass,iris output)
2
3. Utilisation d’un perceptron sans couche cachée
Utilisez un perceptron sans couche cachée pour séparer la classe setosa des deux autres
classes. Pour cela, utilisez la commande Matlab help sur les fonctions Netlab suivantes :
glm, glmtrain et glmfwd
Partie 2 : les cartes topologiques
Nous utilisons la toolbox Matlab développé par l’équipe de Kohonen.
-
Allez à : http://www.cis.hut.fi/somtoolbox/
Cliquez sur Download
Chargez somtoolbox2 Mar 17 2005.zip
Faire unzip somtoolbox2 Mar 17 2005.zip
Vous avez alors un repertoire somtoolbox contenant les fonctions du logiciel
Charger aussi la documentation : Both PS and PDF (zipped)
Approximation de fonctions de densité
• Données : utilisez les instructions suivantes pour générer Data1
>> n=300
>> D = rand(n,2);
>> save Data1 D
• Apprentissage : utilisez les données Data1 pour vérifier visuellement si les référents de
la carte topologique obtenue par apprentissage approximent la densité de probabilité de
ces données. Pour cela, exécuter les instruction suivantes une à une pour comprendre les
différentes étapes de l’apprentissage.
>> clear all
>> close all
>> addpath somtoolbox
>> load Data1
Définition de la Structure des Données
>> sData = som data struct(D,’name’,’donnees1’);
>> %Tapez sData pour voir les différents champs de cette structure
>> %Tapez help som data struct pour plus de détails
Initialisation de la structure de la carte topologique
>> msize = [6 6];
>> insize = size(sData.data,2);
>> lattice = ’rect’;% ’rect’ ou ’hexa’
>> shape = ’sheet’;
>> sMap = som map struct(insize,’msize’,msize, lattice, shape);
Initialisation des poids de la carte topologique
>> sMap = som randinit(sData, sMap); % ou sMap = som lininit(sData, sMap)
Visualisation des données et de la carte initiale.
>> figure
>> plot(D(:,1),D(:,2),’b+’);
>> hold on
>> som grid(sMap,’Coord’,sMap.codebook)
>> axis on
>> title(’Donnees et structure de la grille’);
3
Entraı̂nement de la carte : Phase 1 (Auto organisation)
>> figure
>> epochs = 50;
>> radius ini = 5;
>> radius fin = 1;
>> Neigh = ’gaussian’;
>> tr lev = 3;
>> [sMap,sT] = som batchtrain(sMap, sData,’trainlen’,epochs, . . .
>> ’radius ini’,radius ini,’radius fin’,radius fin, ’neigh’,Neigh,’tracking’,tr lev);
>> xlabel(’AUTO ORGANISATION’)
>> [qe auto,te auto]=som quality(sMap,sData);
>> figure
>> plot(D(:,1),D(:,2),’b+’)
>> hold on
>> som grid(sMap,’Coord’,sMap.codebook), hold off, axis on
>> title(’Apres apprentissage en 2 phases : phase auto organisation’);
Entraı̂nement de la carte : Phase 2 (Convergence)
>> epochs = 100;
>> radius ini = 1;
>> radius fin = 0.1;
>> figure
>> [sMap,sT] = som batchtrain(sMap, sData,’trainlen’,epochs, . . .
>> ’radius ini’,radius ini,’radius fin’,radius fin, ’neigh’,Neigh,’tracking’,tr lev);
>> xlabel(’CONVERGENCE’)
>> [qe conv,te conv]=som quality(sMap,sData)
>> figure
>> plot(D(:,1),D(:,2),’b+’)
>> hold on
>> som grid(sMap,’Coord’,sMap.codebook), hold off, axis on
>> title(’Apres apprentissage en 2 phases : phase de convergence’);
>> hold on
>> [Bmus, Qerrors] = som bmus(sMap, sData);
Que fait la boucle suivante?
>> for neur=1:msize(1)*msize(2)
>> exemples captes = find(Bmus == neur);
>> plot(D(exemples captes,1),D(exemples captes,2),’r+’)
>> hold on
>> plot(sMap.codebook(neur,1),sMap.codebook(neur,2),’go’)
>> pause
>> plot(D(exemples captes,1),D(exemples captes,2),’b+’)
>> plot(sMap.codebook(neur,1),sMap.codebook(neur,2),’mo’)
>> end
4