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?
¿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.
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
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
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?
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í.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Clase de Red Neuronal MLP:
Autor: Yury Kulikov