Le Perceptron est un réseau de neurone sans couche cachée.
On se propose d'implémenter un perceptron multiclasses avec pour fonction d'activation $g$ la fonction seuil (la sortie vaut 1 si la valeur d'activation est du même signe que la sortie attendue, 0 sinon). Le perceptron est représenté par une matrice $w$ de taille $k \times (d+1)$ avec $k$ le nombre de classes du problème et $d$ la dimension des données en entrée. Les valeurs de $w$ sont initialisées aléatoirement. Le pas d'apprentissage $\alpha$ est choisi arbitrairement entre 0 et 1.
La règle d'apprentissage est: $$ w_i^{t+1} = w_i^t+\alpha(y_t-y)x_i $$ avec $y_t$ la sortie attendue et $y$ la sortie calculée
Coder le perceptron à l'aide des fonctionnalités suivantes
Vous disposez également d'un code à trous à compléter en bas de page.
Un travail équivalent est demandé pour apprendre un réseau multicouches. Le réseau devra avoir une unique couche cachée contenant $nc$ neurones. La fonction d'activation $g$ sera la fonction sigmoïde. Il est représenté par 2 matrices, $w$ et $w2$ de dimensions respectives $k \times nc$ et $nc \times (d+1)$ On notera que l'ajout d'une seule couche peut se faire en doublant simplement chaque étape (ex : le calcul de la sortie, c'est le calcul de la sortie de la couche cachée en utilisant les entrées x, puis le calcul de la sortie de la couche de sortie en utilisant le résultat intermédiaire comme entrée).
Compte-rendu 1
Le code obtenu est à envoyer en l'état par mail à G. Loosli à la fin des 2h de TP. Il devra être commenté et sera évalué pour moitié de la note finale. Le travail par binôme est possible.
Compte-rendu 2
Le code terminé est à envoyer par mail à G. Loosli au plus tard le 6 janvier 2013, accompagné d'un compte rendu illustrant l'effet des différents paramètres du MLP. La pertinence de vos observations ainsi que la variété de vos expérimentations seront prises en compte dans l'évaluation. Pour cette partie, il est possible d'utiliser des données différentes. Par ailleurs, cette partie doit être rendue individuellement.
% usage : tp_nr_atrou(n,nt)
function tp_nr_atrou(n,nt)
close all;
% générer les données
x = rand(n,2)*2-1;
y = ones(n,1);
y(x(:,1)<0) = 2;
y(x(:,2)>0.2) = 3;
y(x(:,2)<-0.5) = 4;
xt = rand(nt,2)*2-1;
yt = ones(nt,1);
yt(xt(:,1)<0) = 2;
yt(xt(:,2)>0.2) = 3;
yt(xt(:,2)<-0.5) = 4;
figure;
% train perceptron
w = perceptron(x,y,max(y),0.1,20*n);
% test perceptron
pred = testPerceptron(xt,w);
perf = 100*length(find(pred==yt))/nt
plotPerceptron(xt,yt,4,w)
figure;
% train MLP
[w,w2] = trainMLP(x,y,max(y),0.02,50*n,12);
% test MLP
pred = testMLP(xt,w,w2);
% perf = 100*length(find(pred==yt))/nt
% plotMLP(xt,yt,4,w,w2);
end
function w = perceptron(x,y,k,alpha,tmax)
if size(y,2)==1 % representer les etiquettes sous forme de matrice
yt = zeros(k,size(y,1)); % une ligne par classe
for i=1:k
yt(i,y==i) = 1;
end
end
w = 0; % initialiser aléatoirement tout le réseau (à faire)
t = 0;
while t<tmax
i = ceil(size(x,1)*rand(1)); % selectionner un point au hasard
p = [x(i,:),1]; % passer le point dans la couche d'entrée
u = zeros(1,k); % appliquer la fonction d'activation pour tous les neurones de sortie (à faire)
delta = zeros(length(p),k); % calculer delta (a faire)
w = zeros(k,length(p)); % mettre à jour le réseau (à faire)
t = t+1;
if mod(t,2000)==0 % afficher une fois tous les 2000 points
plotPerceptron(x,y,k,w);
drawnow;
end
end
end
function pred = testPerceptron(xt,w)
sortie = zeros(length(xt),1); % calculer la sortie pour tous les points (à faire)
[val, pred] = max(sortie,[],2);
end
function plotPerceptron(x,y,k,w)
hold off;
[X,Y] = meshgrid(linspace(min(x(:,1)),max(x(:,1)),100),linspace(min(x(:,2)),max(x(:,2)),100));
pred = testPerceptron([reshape(X,10000,1),reshape(Y,10000,1)],w);
contourf(X,Y,reshape(pred,100,100));
hold on;
colormap('gray');
contour(X,Y,reshape(pred,100,100),[0,0],'r');
color = 'brgymck';
for i=1:k
plot(x(y==i,1),x(y==i,2),[color(i),'+']);
end
end
function [w,w2] = trainMLP(x,y,k,alpha,tmax,nbNC)
% tout faire!
w=0;
w2=0;
end
function pred = testMLP(xt,w,w2)
% tout faire!
pred=0;
end
function plotMLP(x,y,k,w,w2)
hold off;
[X,Y] = meshgrid(linspace(min(x(:,1)),max(x(:,1)),100),linspace(min(x(:,2)),max(x(:,2)),100));
pred = testMLP([reshape(X,10000,1),reshape(Y,10000,1)],w,w2);
contourf(X,Y,reshape(pred,100,100));
hold on;
colormap('gray');
contour(X,Y,reshape(pred,100,100),[0,0],'r');
color = 'brgymck';
for i=1:k
plot(x(y==i,1),x(y==i,2),[color(i),'+']);
end
end