Question

Je code un perceptron pour apprendre à catégoriser le genre dans les images de visages.Je suis très très nouveau sur MATLAB, j'ai donc besoin de beaucoup d'aide.J'ai quelques questions:

  1. J'essaie de coder une fonction :

    function [y] = testset(x,w)  
    %y = sign(sigma(x*w-threshold))
    

    où y est les résultats prédits, x est l'ensemble de formation/test présenté sous la forme d'une très grande matrice et w est le poids sur l'équation.La partie après le % c'est ce que j'essaie d'écrire, mais je ne sais pas comment l'écrire dans le code MATLAB.Des idées là-bas ?

  2. J'essaie de coder une deuxième fonction :

    function [err] = testerror(x,w,y)  
    %err = sigma(max(0,-w*x*y))
    

    w, x et y ont les mêmes valeurs que celles indiquées ci-dessus, et err est ma fonction d'erreur, que j'essaie de minimiser à travers les étapes du perceptron.

  3. J'essaie de créer une étape dans mon perceptron pour réduire le pourcentage d'erreur en utilisant la descente de gradient sur mon équation d'origine.Est-ce que quelqu'un sait comment incrémenter w en utilisant la descente de gradient afin de minimiser la fonction d'erreur à l'aide d'une instruction if then ?

Je peux mettre en ligne le code que j'ai jusqu'à présent si cela peut vous aider à répondre à ces questions.

Merci!

modifier--------------------------

OK, donc je travaille toujours sur le code pour cela et j'aimerais le mettre en ligne lorsque j'aurai quelque chose de plus complet.Ma plus grande question en ce moment est la suivante :

J'ai la fonction suivante :

function [y] = testset(x,w)  
y = sign(sum(x*w-threshold))

Maintenant, je sais que je suis censé mettre un seuil, mais je n'arrive pas à comprendre ce que je suis censé mettre comme seuil !des idées là-bas ?

modifier----------------------------
c'est ce que j'ai jusqu'à présent.Des modifications doivent encore y être apportées, mais j'apprécierais des commentaires, notamment concernant la structure, et des conseils pour effectuer les modifications qui doivent être apportées !

function [y] = Perceptron_Aviva(X,w)
y = sign(sum(X*w-1));
end

function [err] = testerror(X,w,y)
    err = sum(max(0,-w*X*y));
end

%function [w] = perceptron(X,Y,w_init)
%w = w_init;
%end

%------------------------------

% input samples
X = X_train;

% output class [-1,+1];
Y = y_train;

% init weigth vector
w_init = zeros(size(X,1));
w = w_init;


%---------------------------------------------
loopcounter = 0

while abs(err) > 0.1 && loopcounter < 100

    for j=1:size(X,1)

        approx_y(j) = Perceptron_Aviva(X(j),w(j))

        err = testerror(X(j),w(j),approx_y(j))

        if err > 0 %wrong (structure is correct, test is wrong)
            w(j) = w(j) - 0.1 %wrong
        elseif err < 0 %wrong
            w(j) = w(j) + 0.1 %wrong
        end

       % -----------
       % if sign(w'*X(:,j)) ~= Y(j) %wrong decision?
       %      w = w + X(:,j) * Y(j);   %then add (or subtract) this point to w
    end
Était-ce utile?

La solution

tu peux lire ceci question Je l'ai fait il y a quelque temps.

J'utilise un code matlab et une fonction perceptron

function [w] = perceptron(X,Y,w_init)

w = w_init;
for iteration = 1 : 100  %<- in practice, use some stopping criterion!
  for ii = 1 : size(X,2)         %cycle through training set
    if sign(w'*X(:,ii)) ~= Y(ii) %wrong decision?
      w = w + X(:,ii) * Y(ii);   %then add (or subtract) this point to w
    end
  end
  sum(sign(w'*X)~=Y)/size(X,2)   %show misclassification rate
end

et il est appelé depuis le code (@Itamar Katz) comme (données aléatoires) :

% input samples
X1=[rand(1,100);rand(1,100);ones(1,100)];   % class '+1'
X2=[rand(1,100);1+rand(1,100);ones(1,100)]; % class '-1'
X=[X1,X2];

% output class [-1,+1];
Y=[-ones(1,100),ones(1,100)];

% init weigth vector
w=[.5 .5 .5]';

% call perceptron
wtag=perceptron(X,Y,w);
% predict
ytag=wtag'*X;


% plot prediction over origianl data
figure;hold on
plot(X1(1,:),X1(2,:),'b.')
plot(X2(1,:),X2(2,:),'r.')

plot(X(1,ytag<0),X(2,ytag<0),'bo')
plot(X(1,ytag>0),X(2,ytag>0),'ro')
legend('class -1','class +1','pred -1','pred +1')

Je suppose que cela peut vous donner une idée pour créer les fonctions que vous avez décrites.A l'erreur comparer le résultat attendu avec le résultat réel (classe)

Autres conseils

Supposons que votre ensemble de données soit X, les points de données et Y, les étiquettes des classes.

f=newp(X,Y)

crée un perceptron.

Si vous souhaitez créer un MLP alors :

f=newff(X,Y,NN)

où NN est l'architecture du réseau, c'est-à-direun tableau qui désigne le nombre de neurones à chaque couche cachée.Par exemple

NN=[5 3 2]

correspondra à un réseau avec 5 neurones sur les premières couches, 3 sur la deuxième et 2 sur la troisième couche cachée.

Eh bien, ce que vous appelez seuil est le biais dans la nomenclature de l'apprentissage automatique.Cela doit être laissé en entrée à l'utilisateur car il est utilisé pendant la formation.

De plus, je me demande pourquoi vous n'utilisez pas les fonctions Matlab intégrées.c'est-à-dire newp ou newff.par exemple.

ff=newp(X,Y)

Ensuite, vous pouvez définir les propriétés de l'objet ff pour effectuer votre travail de sélection de la descente de dégradé, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top