É assim que deve ser? (A saída é 0,0,0,0,0,0,0,0 e um erro enorme).
Olá, Yury,
Como posso criar um Expert Advisor usando essa classe MLP?
Obrigado.
Olá, Yury,
Como posso criar um Expert Advisor usando essa classe MLP?
Obrigado.
Talvez eu esteja fazendo algo errado ou o código não esteja funcionando corretamente
Quero ensinar ao NS a tabuada e contar 2x3, e faço isso:
#property copyright "Yurich" //+------------------------------------------------------------------+ #include <class_NetMLP.mqh> void OnStart(){ double vector[2]; // Vetor de entrada int snn[]={2,2,1}; // Estrutura da rede double out[1]; // Matriz para respostas de rede double inpdata[];// Matriz de dados de treinamento de entrada double outdata[];// Matriz de dados de treinamento de saída 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); } //+------------------------------------------------------------------+
No registro, tenho:
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
Talvez eu esteja fazendo algo errado ou o código não esteja funcionando corretamente
Quero ensinar ao NS a tabuada e contar 2x3, eu faço isso:
Na verdade, você treina a rede com 10 exemplos. Se você quiser passar todos os 100 exemplos para a rede, precisará retirar o treinamento do ciclo de preparação de dados. Também é importante determinar o número de neurônios e o critério para interromper o treinamento - 1000 épocas é muito pouco.
#include <class_NetMLP.mqh> void OnStart() { double vector[2]; // Vetor de entrada int snn[]={2,2,1}; // Estrutura da rede double out[1]; // Matriz para respostas de rede double inpdata[]; // Matriz de dados de treinamento de entrada double outdata[]; // Matriz de dados de treinamento de saída // criação de rede CNetMLP *net; int epoch=1000000; int AFT=0; net=new CNetMLP(ArraySize(snn),snn,2,AFT); // preparação de dados para treinamento 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; } // treinamento de rede net.Learn(100,inpdata,outdata,epoch,1.0 e-8); Print("MSE=",net.mse," Epoch=",net.epoch); // verificação de rede 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)); } // exclusão da rede 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
Na verdade, você está treinando a rede com 10 exemplos. Se quiser passar todos os 100 exemplos para a rede, precisará retirar o treinamento do ciclo de preparação de dados. Também é importante determinar o número de neurônios e o critério para interromper o treinamento - 1000 épocas é muito pouco.
Obrigado, já descobri, vou experimentar seu código mais um pouco
Apenas uma solicitação:
CNetMLP *net=new CNetMLP(número de camadas, matriz de estrutura de rede, tamanho do vetor de entrada, tipo de função de ativação: 0 - sigmoide, 1 - tangente hiperbólica).
faça da seguinte forma: CNetMLP *net=new CNetMLP(matriz de estrutura de rede, tipo de função de ativação: 0 - sigmoide, 1 - tangente hiperbólica).
Ou seja, seu código calculará os parâmetros "número de camadas" e "tamanho do vetor de entrada" a partir da matriz de estrutura de rede por si só, o que, na minha opinião, aumentará a clareza e a legibilidade do código.
Olá, Yuri,
Muito obrigado por este artigo, o código foi criado pela Gemeinschaft.
Eu tinha o código de um Fachberater para criar diagramas, mas parece que há um erro no class_netmlp.mqh.
Se eu tiver tentado usar 3 ou mais Eingangswerte, o início não será muito mais rico do que isso. .... Você pode me ajudar com esse problema?
Comparando os resultados do treinamento da tabela de multiplicação, sua rede perde visivelmente. No ALGLIB, a rede 2,5,1 para 100 épocas de treinamento(https://www.mql5.com/ru/forum/8265/page2) dá respostas melhores do que a sua com 1000000 épocas. A velocidade de computação de 10000000000 épocas também não é agradável.
Aparentemente, o método de aprendizado não é muito eficiente. Ainda assim, obrigado por seu trabalho, pois é mais fácil de entender em um código pequeno do que no ALGLIB. Mas ainda precisamos avançar.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Classe da Rede Neural MLP:
CNetMLP fornece um perceptron multicamadas (MLP).
A característica desta classe é que o vetor de entrada e a estrutura da rede são separados, isto é, as descrições do vetor e da estrutura de entrada da rede não estão ligados entre si.
O tamanho do vetor de entrada pode ter qualquer valor dentro dos limites razoáveis. Os dados de entrada devem ser normalizados, isto é, os dados devem estar dentro do intervalo de -1.. 1 ou 0.. 1. Várias funções de ativação são aplicadas para a rede de acordo com o tipo dos dados usados: a tangente hiperbólica deve ser usada para um intervalo de dados de -1..1, enquanto que o sigmóide é usado para o intervalo de dados de 0..1.
A rede tem uma estrutura de camada por camada, com uma transmissão direta de sinais. Tne estrutura de rede é descrita por um array unidimensional, onde o valor do elemento do array determina o número de neurónios na camada apropriada. O número de camadas e neurônios não é limitada. A rede pode consistir de um único neurónio.
Autor: Yury Kulikov