그리드가 이상하게 작동합니다.
학습 과정에서 오류가 먼저 감소했다가 다시 증가하기 시작합니다.
원래 그렇게 설계된 건가요? 아니면 제가 뭔가 잘못하고 있는 걸까요?
이렇게 해야 하나요? (출력은 0,0,0,0,0,0이며 큰 오류가 발생합니다).
안녕하세요 유리님,
이 MLP 클래스를 사용하여 전문가 어드바이저를 만들려면 어떻게 해야 하나요?
감사합니다.
안녕하세요, 유리입니다,
이 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
내가 뭔가 잘못하고 있거나 코드가 제대로 작동하지 않을 수 있습니다.
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
실제로는 10개의 예시로 네트워크를 훈련하고 있습니다. 100개의 예시를 모두 네트워크에 전달하려면 데이터 준비 주기에서 훈련을 제외해야 합니다. 뉴런의 수와 훈련 중단 기준을 결정하는 것도 중요합니다. 1000 에포크는 너무 짧습니다.
고마워요, 알아 냈어요, 코드를 좀 더 실험 해 보겠습니다.
요청은 하나뿐입니다:
CNetMLP * net = 새로운 CNetMLP(레이어 수, 네트워크 구조 배열, 입력 벡터 크기, 활성화 함수 유형: 0-시그모이드, 1-쌍곡선 탄젠트).
이렇게 하면 됩니다: CNetMLP *net=new CNetMLP(네트워크 구조 배열, 활성화 함수 유형: 0-시그모이드, 1-쌍곡선 탄젠트).
즉, 코드가 네트워크 구조 배열에서 "레이어 수"와 "입력 벡터 크기"라는 매개 변수를 자체적으로 계산하므로 코드의 명확성과 가독성이 향상됩니다.
안녕하세요 유리,
먼저이 코드 공유에 대해 다시 한 번 감사드립니다.
나는 당신의 코드에 다이어그램을 작성하는 방법을 제안했지만 class_netmlp.mqh의 오류 인 것 같습니다.
3을 사용하거나 여러 개의 입력 값을 사용하려고하면 출구가 제대로 작동하지 않는 것 같습니다 ..... 이 문제 해결을 도와 주실 수 있습니까?
곱셈 테이블 훈련 결과를 비교하면 네트워크의 손실이 눈에 띄게 줄어듭니다. ALGLIB에서 100개의 에포크를 훈련한 2,5,1 네트워크(https://www.mql5.com/ru/forum/8265/page2)는 1000000개의 에포크를 사용한 네트워크보다 더 나은 답을 제공합니다. 10000000000 에포크의 계산 속도도 만족스럽지 않습니다.
분명히 학습 방법은 그다지 효율적이지 않습니다. 그러나 여전히-작업에 감사드립니다. ALGLIB보다 작은 코드로 이해하기가 더 쉽습니다. 그러나 우리는 여전히 그곳으로 이동해야합니다.
MLP 신경망 클래스:
CNetMLP 클래스는 다층 퍼셉트론(MLP)을 구현합니다.
Author: Yury Kulikov