Bibliotecas: Clase de Red Neuronal MLP

 

Clase de Red Neuronal MLP:

CNetMLP proporciona un perceptrón multicapa (MLP).

Autor: Yury Kulikov

 

La rejilla funciona de forma extraña.

Durante el proceso de aprendizaje, el error primero disminuye y luego empieza a aumentar.

¿Es así como está diseñada? ¿O estoy haciendo algo mal?

 

Resultado del caso de prueba:

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) Ejemplo para el rango de datos de entrada de 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) Entrada=-1, 1 Salida=0 Comprobación=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) Ejemplo para el rango de datos de entrada de -1 a 1.

¿Es así como debería ser? (La salida es 0,0,0,0,0 y un error enorme).

 

Hola Yury,

¿Cómo puedo hacer un Asesor Experto utilizando esta clase MLP?

Gracias.

 
supercoder2006:

Hola Yury,

¿Cómo puedo hacer un Asesor Experto utilizando esta clase MLP?

Gracias.

¿Puede alguien hacer un simple Asesor Experto utilizando el código smaple?
 

Tal vez estoy haciendo algo mal o el código no funciona correctamente

Quiero enseñar a los NS la tabla de multiplicar y contar 2x3, hago esto

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

void OnStart(){
double vector[2];   // Vector de entrada
int snn[]={2,2,1};    // Estructura de la red
double out[1];      // Matriz para respuestas de red

double inpdata[];// Matriz de datos de entrenamiento de entrada
double outdata[];// Matriz de datos de entrenamiento de salida

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

en el registro tengo:

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:

Quizás estoy haciendo algo mal o el código no funciona correctamente

Quiero enseñar a la NS la tabla de multiplicar y contar 2x3, hago esto:

De hecho, entrenas la red con 10 ejemplos. Si quieres pasar los 100 ejemplos a la red, necesitas sacar el entrenamiento del ciclo de preparación de datos. También es importante determinar el número de neuronas y el criterio para detener el entrenamiento - 1000 epochs es demasiado corto.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // Vector de entrada
   int snn[]={2,2,1};  // Estructura de la red
   double out[1];      // Matriz para respuestas de red
   double inpdata[];   // Matriz de datos de entrenamiento de entrada
   double outdata[];   // Matriz de datos de entrenamiento de salida
   // creación de redes
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // preparar los datos para el entrenamiento
   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;
      }
   // formación de redes
   net.Learn(100,inpdata,outdata,epoch,1.0 e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // comprobación de la red
   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));
   }
   // supresión de la red
   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:

De hecho, está entrenando la red con 10 ejemplos. Si quieres pasar los 100 ejemplos a la red, tienes que sacar el entrenamiento del ciclo de preparación de datos. También es importante determinar el número de neuronas y el criterio para detener el entrenamiento - 1000 epochs es demasiado corto.

gracias, ya lo he entendido, experimentaré con tu código un poco más

Sólo una petición:

CNetMLP *net=new CNetMLP(número de capas, matriz de estructura de red, tamaño del vector de entrada, tipo de función de activación: 0 - sigmoide, 1 - tangente hiperbólica).

hazlo así: CNetMLP *net=nuevo CNetMLP(matriz de estructura de red, tipo de función de activación: 0 - sigmoide, 1 - tangente hiperbólica).

es decir, tu código calculará los parámetros "número de capas" y "tamaño del vector de entrada" a partir de la matriz de estructura de red por sí mismo, en mi opinión añadirá claridad y legibilidad al código.

 

Hola 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 .... ¿puedes ayudarme con este problema?

Archivos adjuntos:
 
ver las fotos
Archivos adjuntos:
example1.jpg  67 kb
example2.jpg  39 kb
 

Comparando los resultados del entrenamiento con tablas de multiplicar tu red pierde notablemente. En ALGLIB la red 2,5,1 para 100 epochs de entrenamiento(https://www.mql5.com/ru/forum/8265/page2) da mejores respuestas que la tuya con 1000000 epochs. La velocidad de cálculo de 10000000000 epochs tampoco es agradable.

Aparentemente el método de aprendizaje no es muy eficiente. Pero aún así - gracias por su trabajo, es más fácil de entender en código pequeño que en ALGLIB. Pero entonces todavía tenemos que avanzar allí.

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