Librerie: Rete neurale MLP di classe

 

Rete neurale MLP di classe:

La classe CNetMLP implementa un perseptron multistrato (MLP).

Author: Yury Kulikov

 

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?

 

Risultato del caso di 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) Entrata=0, 1 Uscita=0 Controllo=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrata=1, 0 Uscita=0 Controllo=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrata=1, 1 Uscita=0 Controllo=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.375 Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Esempio per dati di ingresso da 0 a 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) Ingresso=-1, 1 Uscita=0 Controllo=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrata=1, -1 Uscita=0 Controllo=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entrata=1, 1 Uscita=0 Controllo=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.9375 Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Esempio per un intervallo di dati in ingresso da -1 a 1.

È 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.

 
supercoder2006:

Ciao Yury,

Come posso creare un Expert Advisor utilizzando questa classe MLP?

Grazie.

Qualcuno può creare un semplice Expert Advisor utilizzando il codice smaple?
 

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
 
IgorM:

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
 
Yurich:

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?

 
si prega di vedere le immagini
File:
example1.jpg  67 kb
example2.jpg  39 kb
 

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.

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