Bibliothèque: Classe de réseau neuronal MLP

 

Classe de réseau neuronal MLP:

La classe CNetMLP met en œuvre un perseptron multicouche (MLP).

Author: Yury Kulikov

 

La grille fonctionne de manière étrange.

Au cours du processus d'apprentissage, l'erreur diminue d'abord, puis commence à augmenter.

Est-ce la façon dont elle est conçue ? Ou est-ce que je fais quelque chose de mal ?

 

Résultat du cas de test :

2011.12.25 12:42:52 TestMLPs(GBPUSD,H1) Entry=0, 0 Exit=0 Check=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrée=0, 1 Sortie=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrée=1, 0 Sortie=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrée=1, 1 Sortie=0 Check=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.375 Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Exemple pour des données d'entrée comprises entre 0 et 1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Input=-1, -1 Output=0 Check=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=-1, 1 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrée=1, -1 Sortie=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 1 Exit=0 Check=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.9375 Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Exemple pour une plage de données d'entrée de -1 à 1.

Est-ce que c'est comme ça que ça devrait être ? (La sortie est 0,0,0,0,0,0 et une énorme erreur).

 

Bonjour Yury,

Comment puis-je créer un Expert Advisor en utilisant cette classe MLP ?

Merci de votre réponse.

 
supercoder2006:

Bonjour Yury,

Comment puis-je créer un Expert Advisor en utilisant cette classe MLP ?

Merci d'avance.

Est-ce que quelqu'un peut faire un Expert Advisor simple en utilisant le même code ?
 

Peut-être que je fais quelque chose de mal ou que le code ne fonctionne pas correctement.

Je veux apprendre au NS la table de multiplication et compter 2x3, je fais ceci :

#property copyright "Yurich"
//+------------------------------------------------------------------+
#include <class_NetMLP.mqh>

void OnStart(){
double vector[2];   // Vecteur d'entrée
int snn[]={2,2,1};    // Structure du réseau
double out[1];      // Tableau pour les réponses du réseau

double inpdata[];// Tableau des données d'apprentissage en entrée
double outdata[];// Tableau des données d'entraînement en sortie

   CNetMLP *net;
   int epoch=1000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   
   ArrayResize(inpdata,20);
   ArrayResize(outdata,10);
   
   for(int i=0;i<10;i++){
      for(int j=0;j<10;j++){
         inpdata[j*2] = (i+1)/10.0;
         inpdata[j*2+1] = (j+1)/10.0;
         outdata[j] = inpdata[j*2] * inpdata[j*2+1];
// Print("inpdata[",j*2,"]=",DoubleToString(inpdata[j*2])," / inpdata[",j*2+1,"]=",DoubleToString(inpdata[j*2+1])) ;
      }
      net.Learn(10,inpdata,outdata,epoch,1.0 e-8);
      vector[0] = 0.2;
      vector[1] = 0.3;
      net.Calculate(vector,out);
      Print("MSE=",net.mse," , out =",out[0]*100);
   }
   
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
}
//+------------------------------------------------------------------+

dans le journal j'ai :

2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    1824 bytes of leaked memory
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    3 objects of type CLayerMLP left
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    1 object of type CNetMLP left
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    4 undeleted objects left
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=3.215934174267907 e-005  Epoch=1001
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=3.215934174267907 e-005 , out =23.81042803092551
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=2.506540371444645 e-006 , out =22.233366741152
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.524148111498897 e-006 , out =20.42036901380543
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.519171222235065 e-006 , out =18.89110154263913
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.047462369320528 e-006 , out =16.63410153653344
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=9.477321159986828 e-007 , out =14.24605748950336
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=6.585902193183645 e-007 , out =11.66913117122246
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.237858920539329 e-007 , out =8.906822741170629
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.540333890146069 e-007 , out =6.033412338430783
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.26424262746638 e-007 , out =2.942888766617119
 
IgorM:

Peut-être que je fais quelque chose de mal ou que le code ne fonctionne pas correctement.

Je veux apprendre au NS la table de multiplication et compter 2x3, je fais cela :

En fait, vous entraînez le réseau avec 10 exemples. Si vous souhaitez transmettre les 100 exemples au réseau, vous devez retirer l'entraînement du cycle de préparation des données. Il est également important de déterminer le nombre de neurones et le critère d'arrêt de l'entraînement - 1000 époques est trop court.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // Vecteur d'entrée
   int snn[]={2,2,1};  // Structure du réseau
   double out[1];      // Tableau pour les réponses du réseau
   double inpdata[];   // Tableau des données d'apprentissage en entrée
   double outdata[];   // Tableau des données d'entraînement en sortie
   // création d'un réseau
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // préparation des données pour la formation
   ArrayResize(inpdata,200);
   ArrayResize(outdata,100);
   int m=0, k=0;
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         inpdata[m++]=i/10.0;
         inpdata[m++]=j/10.0;
         outdata[k++]=(i*j)/100.0;
      }
   // formation au réseau
   net.Learn(100,inpdata,outdata,epoch,1.0 e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // vérification du réseau
   for(int i=1; i<=10; i++)
   {
       vector[0]=i/10.0;
       vector[1]=i/10.0;
       net.Calculate(vector,out);
       Print(i,"*",i,"=",DoubleToString(out[0]*100,1));
   }
   // suppression du réseau
   delete net;
}
2012.10.08 13:46:59     test_nn (EURUSD,M15)    MSE=4.22005256254196 e-005  Epoch=1000001
2012.10.08 13:46:59     test_nn (EURUSD,M15)    1*1=1.3
2012.10.08 13:46:59     test_nn (EURUSD,M15)    2*2=3.4
2012.10.08 13:46:59     test_nn (EURUSD,M15)    3*3=7.6
2012.10.08 13:46:59     test_nn (EURUSD,M15)    4*4=14.8
2012.10.08 13:46:59     test_nn (EURUSD,M15)    5*5=25.0
2012.10.08 13:46:59     test_nn (EURUSD,M15)    6*6=37.2
2012.10.08 13:46:59     test_nn (EURUSD,M15)    7*7=50.2
2012.10.08 13:46:59     test_nn (EURUSD,M15)    8*8=64.3
2012.10.08 13:46:59     test_nn (EURUSD,M15)    9*9=82.2
2012.10.08 13:46:59     test_nn (EURUSD,M15)    10*10=96.9
 
Yurich:

En fait, vous entraînez le réseau avec 10 exemples. Si vous souhaitez transmettre les 100 exemples au réseau, vous devez retirer l'entraînement du cycle de préparation des données. Il est également important de déterminer le nombre de neurones et le critère d'arrêt de la formation - 1000 époques est trop court.

Merci, j'ai compris, je vais expérimenter votre code un peu plus.

Une seule demande :

CNetMLP *net=new CNetMLP(nombre de couches, tableau de structure du réseau, taille du vecteur d'entrée, type de fonction d'activation : 0 - sigmoïde, 1 - tangente hyperbolique).

faites-le de cette façon : CNetMLP *net=new CNetMLP(network structure array, activation function type : 0 - sigmoïde, 1 - tangente hyperbolique).

Votre code calculera les paramètres "nombre de couches" et "taille du vecteur d'entrée" à partir du tableau de structure du réseau, ce qui, à mon avis, améliorera la clarté et la lisibilité du code.

 

Bonjour Yuri,

Merci beaucoup pour cet article, le code est une source d'inspiration pour la communauté.

J'ai trouvé dans ce code un outil pour construire des diagrammes, mais il semble qu'il y ait un problème dans le fichier class_netmlp.mqh.

sobald ich versuchte, 3 zu verwenden oder mehrere Eingangswerte ist der Ausgang nicht ganz richtig mehr scheint .... Vous pouvez m'aider à résoudre ce problème ?

Dossiers :
 
voir les photos
Dossiers :
example1.jpg  67 kb
example2.jpg  39 kb
 

En comparant les résultats de l'apprentissage des tables de multiplication, votre réseau est nettement moins performant. Sur ALGLIB, le réseau 2,5,1 pour 100 époques d'apprentissage(https://www.mql5.com/ru/forum/8265/page2) donne de meilleures réponses que le vôtre avec 1000000 époques. La vitesse de calcul de 10000000000 epochs n'est pas très satisfaisante non plus.

Apparemment, la méthode d'apprentissage n'est pas très efficace. Mais tout de même - merci pour votre travail, il est plus facile à comprendre dans un petit code que dans ALGLIB. Mais nous devons encore progresser.

Библиотеки: ALGLIB - библиотека численного анализа
Библиотеки: ALGLIB - библиотека численного анализа
  • 2012.10.12
  • www.mql5.com
Форум алго-трейдеров MQL5