Bibliotheken: MLP Neuronales Netz Klasse

 

MLP Neuronales Netz Klasse:

CNetMLP bietet Multilayer-Perceptron (MLP).

Autor: Yury Kulikov

 

Das Gitter funktioniert seltsam.

Während des Lernprozesses nimmt der Fehler erst ab und dann zu.

Ist das die Art und Weise, wie es konzipiert ist? Oder mache ich etwas falsch?

 

Ergebnis des Testfalls:

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) Entry=0, 1 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 0 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 1 Exit=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) Beispiel für Eingabedatenbereich von 0 bis 1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Eingabe=-1, -1 Ausgabe=0 Prüfung=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Eingabe=-1, 1 Ausstieg=0 Prüfung=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) 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) Beispiel für einen Eingangsdatenbereich von -1 bis 1.

Sollte es so sein? (Die Ausgabe ist 0,0,0,0,0,0 und ein großer Fehler).

 

Hallo Yury,

wie kann ich einen Expert Advisor mit dieser MLP-Klasse erstellen?

Danke.

 
supercoder2006:

Hallo Yury,

Wie kann ich einen Expert Advisor mit dieser MLP-Klasse erstellen?

Danke!

Kann jemand einen einfachen Expert Advisor mit dem Smaple Code erstellen?
 

Vielleicht mache ich etwas falsch oder der Code funktioniert nicht richtig

Ich möchte dem NS das Einmaleins beibringen und 2x3 zählen, das mache ich so:

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

void OnStart(){
double vector[2];   // Eingangsvektor
int snn[]={2,2,1};    // Netzstruktur
double out[1];      // Array für Netzwerkantworten

double inpdata[];// Array mit Eingabe-Trainingsdaten
double outdata[];// Array der ausgegebenen Trainingsdaten

   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);
}
//+------------------------------------------------------------------+

Im Protokoll habe ich:

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:

Vielleicht mache ich etwas falsch oder der Code funktioniert nicht richtig

Ich möchte dem NS die Multiplikationstabelle beibringen und 2x3 zählen, das mache ich:

Eigentlich trainiert man das Netz mit 10 Beispielen. Wenn Sie alle 100 Beispiele an das Netz weitergeben wollen, müssen Sie das Training aus dem Datenaufbereitungszyklus herausnehmen. Es ist auch wichtig, die Anzahl der Neuronen und das Kriterium für das Beenden des Trainings zu bestimmen - 1000 Epochen sind zu kurz.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // Eingangsvektor
   int snn[]={2,2,1};  // Netzstruktur
   double out[1];      // Array für Netzwerkantworten
   double inpdata[];   // Array mit Eingabe-Trainingsdaten
   double outdata[];   // Array der ausgegebenen Trainingsdaten
   // Erstellung des Netzes
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // Vorbereitung der Daten für die Ausbildung
   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;
      }
   // Netzausbildung
   net.Learn(100,inpdata,outdata,epoch,1.0 e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // Netzwerkprüfung
   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));
   }
   // Löschen des Netzes
   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:

In der Tat trainieren Sie das Netz mit 10 Beispielen. Wenn Sie alle 100 Beispiele an das Netz weitergeben wollen, müssen Sie das Training aus dem Datenvorbereitungszyklus herausnehmen. Es ist auch wichtig, die Anzahl der Neuronen und das Kriterium für das Beenden des Trainings zu bestimmen - 1000 Epochen sind zu kurz.

Danke, ich habe es herausgefunden, ich werde mit Ihrem Code noch etwas experimentieren

Nur eine Anfrage:

CNetMLP *net=new CNetMLP(number of layers, network structure array, input vector size, activation function type: 0 - sigmoid, 1 - hyperbolic tangent).

machen Sie es so: CNetMLP *net=new CNetMLP(network structure array, activation function type: 0 - sigmoid, 1 - hyperbolic tangent).

d.h. Ihr Code wird die Parameter "Anzahl der Schichten" und "Größe des Eingabevektors" aus dem Netzstruktur-Array selbst berechnen, was imho die Klarheit und Lesbarkeit des Codes erhöht.

 

Hallo Juri,

zunächst einmal vielen Dank für dieses Stück Code teilt die Gemeinschaft.

Ich habe Ihrem Code einen Fachberater zum bauen von Diagrammwerten vorherzusagen, aber es scheint, dass es ein Fehler in der class_netmlp.mqh ist.

sobald ich versuchte, 3 zu verwenden oder mehrere Eingangswerte ist der Ausgang nicht ganz richtig mehr scheint .... Können Sie mir bei diesem Problem Festsetzung helfen?

Dateien:
 
Bitte sehen Sie die Bilder
Dateien:
example1.jpg  67 kb
example2.jpg  39 kb
 

Vergleicht man die Ergebnisse des Multiplikationstabellen-Trainings, so verliert Ihr Netz deutlich. Auf ALGLIB gibt das Netzwerk 2,5,1 für 100 Epochen Training(https://www.mql5.com/ru/forum/8265/page2) bessere Antworten als Ihres mit 1000000 Epochen. Auch die Geschwindigkeit der Berechnung von 10000000000 epochs ist nicht erfreulich.

Offenbar ist die Lernmethode nicht sehr effizient. Aber trotzdem - danke für deine Arbeit, sie ist in kleinem Code leichter zu verstehen als in ALGLIB. Aber da müssen wir uns noch hinbewegen.

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