Bibliotecas: Classe da Rede Neural MLP

 

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

 

A grade funciona de forma estranha.

Durante o processo de aprendizado, o erro primeiro diminui e depois começa a aumentar.

É assim que ela foi projetada? Ou estou fazendo algo errado?

 

Resultado do caso de teste:

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) Exemplo para intervalo de dados 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) 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) 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) Exemplo de intervalo de dados de entrada de -1 a 1.

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

 
supercoder2006:

Olá, Yury,

Como posso criar um Expert Advisor usando essa classe MLP?

Obrigado.

Alguém pode criar um Expert Advisor simples usando o código simples?
 

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

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

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?

Arquivos anexados:
 
Veja as fotos
Arquivos anexados:
example1.jpg  67 kb
example2.jpg  39 kb
 

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.

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