2011-10-17 4 views
5

J'ai fait Neural Network dans MATLAB avec newff (...). Lorsque vous l'entraînez avec les mêmes entrées et sorties, les résultats de l'entraînement sont différents sur différentes courses. Je comprends que cela se passe parce que les poids sont différents à chaque fois que je le lance. Ma question est de savoir comment faire en sorte que les poids initiaux soient les mêmes chaque fois que j'entraîne mon NN afin que je puisse obtenir les mêmes résultats. De même, est-il possible de sauvegarder des poids de la formation n ° 1 et de l'utiliser pour la formation n ° 2, et comment?Neural Networks dans MATLAB, poids initiaux

Tnx

+1

Voulez-vous former en fait le réseau de neurones? Si vous utilisez les mêmes poids sur chaque cycle d'entraînement (c'est-à-dire que les poids ne changent pas), alors vous n'avez aucun moyen d'entraîner le réseau de neurones ... quel est donc votre objectif? – Kiril

+0

Oui, je veux former le NN. Dans mon fichier .m, je crée, forme et simule NN. Mais la meilleure performance de la formation du réseau que je reçois quand je l'exécute pour la troisième fois.Donc, mon idée était de sauvegarder les poids de la deuxième course et de les utiliser comme poids initial la prochaine fois (donc je n'ai pas besoin de l'exécuter 3 fois de suite). – user999507

Répondre

6

Pour generate reproducible results, vous devez régler manuellement le générateur de nombres aléatoires à la même semence/état au début du code. Cela peut se faire dans un number of ways (selon la version de Matlab vous avez):

L'ancien style:

rand('twister',1234) 

Le style mis à jour:

RandStream.setGlobalStream(RandStream('mt19937ar','Seed',1234)); 

Un new function a été introduit dans R2011a cela simplifie le dernier appel:

rng(1234,'twister') 

La syntaxe d'atter est l'approche recommandée.

2

En note, et pas une réponse directe, il y a quelque chose qui s'appelle Nguyen Widrow initialization and it's already implemented in Matlab's Neural Net toolbox. D'après mon expérience, cela fonctionne plutôt bien et aide le réseau neuronal à converger plus rapidement. J'ai trouvé que cela rend également les résultats plus cohérents aussi. Je recommande de l'utiliser ainsi que la graine aléatoire fixe selon Amro's post.

+0

Chris a raison, vérifiez soigneusement quel type d'initialisation des poids est utilisé par défaut, car dans les dernières versions de MATLAB, la valeur par défaut n'est PAS une initialisation aléatoire, mais l'algorithme d'initialisation de Nguyen Widrow. –

-1
If you really want to have the weights before and after the training of NN you can use these codes : 

for n1=4:8 
    wb1=rand(n1,n_input); 
    wb2=rand(n_output,n1); 
    bb1=rand(n1,1); 
    bb2=rand(n_output,1); 

    wb=[wb1(:);wb2(:);bb1;bb2]'; 

    xlswrite(['weight' num2str(n1) '.xlsx'],wb,'Sheet1',num2str(n1)); 

end 


if n1==4 
     wb = xlsread(['weight' num2str(n1) '.xlsx']); 
     i1 = n1*n_input; 
     i2 = n_output*n1; 
     i3 = n1; 
     i4 = n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==5 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==6 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==7 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 

    elseif n1==8 
     wb=xlsread(['weight' num2str(n1) '.xlsx']); 
     i1=n1*n_input; 
     i2=n_output*n1; 
     i3=n1; 
     i4=n_output; 

     f1=wb(1:i1); 
     f2=wb(i1+1:i1+i2); 
     f3=wb(i1+i2+1:i1+i2+i3); 
     f4=wb(i1+i2+i3+1:i1+i2+i3+i4); 

     wb1=reshape(f1,n1,n_input); 
     wb2=reshape(f2,n_output,n1); 
     bb1=reshape(f3,n1,1); 
     bb2=reshape(f4,n_output,1); 
    end 

    net = newff(inputs,targets,4,{'tansig','purelin'},'trainlm'); 
    n.IW{1,1}=wb1; 
    n.LW{2,1}=wb2; 
    n.b{1}=bb1; 
    n.b{2}=bb2; 


And after training for saving the network you want : 

[net tr] = train(net,inputs,targets); 

wb11=n.IW{1,1}; 
    wb22=n.LW{2,1}; 
    bb11=n.b{1}; 
    bb22=n.b{2}; 

    wbzz=[wb11(:);wb22(:);bb11;bb22]'; 

    xlswrite('weight.xlsx',wbzz,'Sheet1'); 
2

différents Matlab Neural les résultats de la boîte à outils des réseaux est à cause de deux raisons: 1-aléatoire division de données d'initialisation de poids 2-aléatoire

Pour différentes fonctions d'utilisation du problème de la division de données « divideblock » ou « divideint » au lieu de " dividerand » comme ceci:

net.dividefcn='divideblock; net.divideparam.trainratio=.7; net.divideparam.valratio=.15; net.divideparam.testratio=.15;

Pour le problème d'initialisation de poids aléatoire, Il semble (je ne suis pas sûr) que toutes les fonctions d'initialisation de Matlab ("initzero", "initlay", "initwb", "initnw") sont presque aléatoires. Vous devriez donc forcer ces fonctions à produire des résultats similaires par appel.

RandStream.setGlobalStream (RandStream ('mrg32k3a','Seed', 1234));

Et puis utilisez l'un d'entre eux:

net.initFcn='initlay'; net.layers{i}.initFcn='initnw';

+0

commencé à formater votre code, perdu patience ;-) S'il vous plaît modifier et supprimer les backtics vous-même – kleopatra

+0

Qu'est-ce que Backticks? –

Questions connexes