La griglia funziona in modo strano.
Durante il processo di apprendimento, l'errore prima diminuisce, poi inizia ad aumentare.
È questo il modo in cui è stata progettata? O sto facendo qualcosa di sbagliato?
È così che dovrebbe essere? (L'output è 0,0,0,0,0 e un errore enorme).
Ciao Yury,
Come posso creare un Expert Advisor utilizzando questa classe MLP?
Grazie.
Forse sto facendo qualcosa di sbagliato o il codice non funziona correttamente
Voglio insegnare ai NS la tabella delle moltiplicazioni e a contare 2x3, faccio così:
#property copyright "Yurich" //+------------------------------------------------------------------+ #include <class_NetMLP.mqh> void OnStart(){ double vector[2]; // Vettore di ingresso int snn[]={2,2,1}; // Struttura della rete double out[1]; // Array per le risposte della rete double inpdata[];// Array di dati di addestramento in ingresso double outdata[];// Array di dati di addestramento in uscita 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]; // Stampa("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); } //+------------------------------------------------------------------+
nel log ho:
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
Forse sto facendo qualcosa di sbagliato o il codice non funziona correttamente
Se voglio insegnare al NS la tabella delle moltiplicazioni e il conteggio 2x3, faccio così:
In effetti, si addestra la rete con 10 esempi. Se si vogliono passare tutti i 100 esempi alla rete, è necessario togliere l'addestramento dal ciclo di preparazione dei dati. È importante anche stabilire il numero di neuroni e il criterio di interruzione dell'addestramento: 1000 epoche sono troppo poche.
#include <class_NetMLP.mqh> void OnStart() { double vector[2]; // Vettore di ingresso int snn[]={2,2,1}; // Struttura della rete double out[1]; // Array per le risposte della rete double inpdata[]; // Array di dati di addestramento in ingresso double outdata[]; // Array di dati di addestramento in uscita // creazione della rete CNetMLP *net; int epoch=1000000; int AFT=0; net=new CNetMLP(ArraySize(snn),snn,2,AFT); // preparazione dei dati per la formazione 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; } // formazione della rete net.Learn(100,inpdata,outdata,epoch,1.0 e-8); Print("MSE=",net.mse," Epoch=",net.epoch); // controllo della rete 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)); } // eliminazione della rete 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 effetti, si sta addestrando la rete con 10 esempi. Se si desidera trasmettere alla rete tutti i 100 esempi, è necessario escludere l'addestramento dal ciclo di preparazione dei dati. È anche importante determinare il numero di neuroni e il criterio di interruzione dell'addestramento: 1000 epoche sono troppo poche.
Grazie, l'ho capito, sperimenterò ancora un po' con il tuo codice.
Solo una richiesta:
CNetMLP *net=new CNetMLP(numero di strati, array di strutture di rete, dimensione del vettore di input, tipo di funzione di attivazione: 0 - sigmoide, 1 - tangente iperbolica).
fare in questo modo: CNetMLP *net=new CNetMLP(array di strutture di rete, tipo di funzione di attivazione: 0 - sigmoide, 1 - tangente iperbolica).
In altre parole, il vostro codice calcolerà i parametri "numero di strati" e "dimensione del vettore di input" dall'array di struttura della rete da solo; a mio parere, questo aggiungerà chiarezza e leggibilità al codice.
Ciao Yuri,
zunächst einmal vielen Dank für dieses Stück Code teilt die Gemeinschaft.
Ich habe Ihren Code ein Fachberater zu bauen Diagrammwerte 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 .... può aiutarmi a risolvere questo problema?
Confrontando i risultati dell'addestramento della tabella di moltiplicazione, la vostra rete perde notevolmente. Su ALGLIB la rete 2,5,1 per 100 epoche di addestramento(https://www.mql5.com/ru/forum/8265/page2) dà risposte migliori della vostra con 1000000 epoche. Anche la velocità di calcolo di 10000000000 epoche non è piacevole.
A quanto pare il metodo di apprendimento non è molto efficiente. Ma comunque - grazie per il vostro lavoro, è più facile da capire in un piccolo codice che in ALGLIB. Ma dobbiamo ancora fare un passo avanti.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Rete neurale MLP di classe:
La classe CNetMLP implementa un perseptron multistrato (MLP).
Author: Yury Kulikov