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?
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!
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
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
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?
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
MLP Neuronales Netz Klasse:
Autor: Yury Kulikov