라이브러리: MLP 신경망 클래스

 

MLP 신경망 클래스:

CNetMLP 클래스는 다층 퍼셉트론(MLP)을 구현합니다.

Author: Yury Kulikov

 

그리드가 이상하게 작동합니다.

학습 과정에서 오류가 먼저 감소했다가 다시 증가하기 시작합니다.

원래 그렇게 설계된 건가요? 아니면 제가 뭔가 잘못하고 있는 걸까요?

 

테스트 케이스 결과:

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) 입력 데이터 범위 0~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) 입력 데이터 범위는 -1에서 1까지입니다.

이렇게 해야 하나요? (출력은 0,0,0,0,0,0이며 큰 오류가 발생합니다).

 

안녕하세요 유리님,

이 MLP 클래스를 사용하여 전문가 어드바이저를 만들려면 어떻게 해야 하나요?

감사합니다.

 
supercoder2006:

안녕하세요, 유리입니다,

이 MLP 클래스를 사용하여 전문가 어드바이저를 만들려면 어떻게 해야 하나요?

고마워요.

누군가 스매플 코드를 사용하여 간단한 전문가 어드바이저를 만들 수 있나요?
 

내가 뭔가 잘못하고 있거나 코드가 제대로 작동하지 않을 수 있습니다.

NS에게 구구단을 가르치고 2x3을 세고 싶습니다:

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

void OnStart(){
double vector[2];   // 입력 벡터
int snn[]={2,2,1};    // 네트워크 구조
double out[1];      // 네트워크 응답을 위한 배열

double inpdata[];// 입력 학습 데이터의 배열
double outdata[];// 출력 학습 데이터의 배열

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

제가 가지고 있는 로그에서요:

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:

내가 뭔가 잘못하고 있거나 코드가 제대로 작동하지 않을 수 있습니다.

NS에게 구구단을 가르치고 2x3을 계산하고 싶습니다:

실제로는 10개의 예제로 네트워크를 훈련시킵니다. 100개의 예제를 모두 네트워크에 전달하려면 데이터 준비 주기에서 훈련을 제외해야 합니다. 뉴런의 수와 훈련 중단 기준을 결정하는 것도 중요합니다. 1000 에포크는 너무 짧습니다.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // 입력 벡터
   int snn[]={2,2,1};  // 네트워크 구조
   double out[1];      // 네트워크 응답을 위한 배열
   double inpdata[];   // 입력 학습 데이터의 배열
   double outdata[];   // 출력 학습 데이터의 배열
   // 네트워크 생성
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // 교육용 데이터 준비하기
   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;
      }
   // 네트워크 교육
   net.Learn(100,inpdata,outdata,epoch,1.0 e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // 네트워크 확인
   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));
   }
   // 네트워크 삭제
   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:

실제로는 10개의 예시로 네트워크를 훈련하고 있습니다. 100개의 예시를 모두 네트워크에 전달하려면 데이터 준비 주기에서 훈련을 제외해야 합니다. 뉴런의 수와 훈련 중단 기준을 결정하는 것도 중요합니다. 1000 에포크는 너무 짧습니다.

고마워요, 알아 냈어요, 코드를 좀 더 실험 해 보겠습니다.

요청은 하나뿐입니다:

CNetMLP * net = 새로운 CNetMLP(레이어 수, 네트워크 구조 배열, 입력 벡터 크기, 활성화 함수 유형: 0-시그모이드, 1-쌍곡선 탄젠트).

이렇게 하면 됩니다: CNetMLP *net=new CNetMLP(네트워크 구조 배열, 활성화 함수 유형: 0-시그모이드, 1-쌍곡선 탄젠트).

즉, 코드가 네트워크 구조 배열에서 "레이어 수"와 "입력 벡터 크기"라는 매개 변수를 자체적으로 계산하므로 코드의 명확성과 가독성이 향상됩니다.

 

안녕하세요 유리,

먼저이 코드 공유에 대해 다시 한 번 감사드립니다.

나는 당신의 코드에 다이어그램을 작성하는 방법을 제안했지만 class_netmlp.mqh의 오류 인 것 같습니다.

3을 사용하거나 여러 개의 입력 값을 사용하려고하면 출구가 제대로 작동하지 않는 것 같습니다 ..... 이 문제 해결을 도와 주실 수 있습니까?

파일:
 
사진을 참조하세요.
파일:
example1.jpg  67 kb
example2.jpg  39 kb
 

곱셈 테이블 훈련 결과를 비교하면 네트워크의 손실이 눈에 띄게 줄어듭니다. ALGLIB에서 100개의 에포크를 훈련한 2,5,1 네트워크(https://www.mql5.com/ru/forum/8265/page2)는 1000000개의 에포크를 사용한 네트워크보다 더 나은 답을 제공합니다. 10000000000 에포크의 계산 속도도 만족스럽지 않습니다.

분명히 학습 방법은 그다지 효율적이지 않습니다. 그러나 여전히-작업에 감사드립니다. ALGLIB보다 작은 코드로 이해하기가 더 쉽습니다. 그러나 우리는 여전히 그곳으로 이동해야합니다.

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