Kütüphaneler: MLP sinir ağı sınıfı

 

MLP sinir ağı sınıfı:

CNetMLP sınıfı çok katmanlı bir perseptron (MLP) uygular.

Author: Yury Kulikov

 

Izgara garip bir şekilde çalışıyor.

Öğrenme süreci sırasında hata önce azalıyor, sonra artmaya başlıyor.

Bu şekilde mi tasarlandı? Yoksa yanlış bir şey mi yapıyorum?

 

Test senaryosu sonucu:

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'dan 1'e kadar giriş veri aralığı için örnek
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'den 1'e kadar giriş veri aralığı için örnek.

Böyle mi olması gerekiyor? (Çıktı 0,0,0,0,0 ve büyük bir hata).

 

Merhaba Yury,

Bu MLP sınıfını kullanarak bir Uzman Danışmanı nasıl oluşturabilirim?

Teşekkürler.

 
supercoder2006:

Merhaba Yury,

Bu MLP sınıfını kullanarak bir Uzman Danışmanı nasıl oluşturabilirim?

Teşekkürler.

Birisi smaple kodunu kullanarak basit bir Uzman Danışman yapabilir mi?
 

Belki bir şeyleri yanlış yapıyorum ya da kod doğru çalışmıyor

NS'ye çarpım tablosunu ve 2x3 saymayı öğretmek istiyorum, bunu yapıyorum:

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

void OnStart(){
double vector[2];   // Girdi vektörü
int snn[]={2,2,1};    // Ağ yapısı
double out[1];      // Ağ yanıtları için dizi

double inpdata[];// Girdi eğitim verileri dizisi
double outdata[];// Çıktı eğitim verileri dizisi

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

günlükte var:

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:

Belki bir şeyleri yanlış yapıyorum ya da kod doğru çalışmıyor

NS'ye çarpım tablosunu ve 2x3 saymayı öğretmek istiyorum, bunu yapıyorum:

Aslında ağı 10 örnekle eğitiyorsunuz. Eğer 100 örneğin tamamını ağa aktarmak istiyorsanız, eğitimi veri hazırlama döngüsünden çıkarmanız gerekir. Nöron sayısını ve eğitimi durdurma kriterini belirlemek de önemlidir - 1000 epok çok kısadır.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // Girdi vektörü
   int snn[]={2,2,1};  // Ağ yapısı
   double out[1];      // Ağ yanıtları için dizi
   double inpdata[];   // Girdi eğitim verileri dizisi
   double outdata[];   // Çıktı eğitim verileri dizisi
   // ağ oluşturma
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // eğitim için veri hazırlama
   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;
      }
   // ağ eğitimi
   net.Learn(100,inpdata,outdata,epoch,1.0 e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // ağ kontrolü
   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));
   }
   // ağı silme
   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:

Aslında, ağı 10 örnekle eğitiyorsunuz. Eğer 100 örneğin tamamını ağa aktarmak istiyorsanız, eğitimi veri hazırlama döngüsünden çıkarmanız gerekir. Nöron sayısını ve eğitimi durdurma kriterini belirlemek de önemlidir - 1000 epok çok kısa.

teşekkürler, anladım, kodunuzla biraz daha deney yapacağım

Sadece bir istek:

CNetMLP *net=new CNetMLP(katman sayısı, ağ yapısı dizisi, girdi vektörü boyutu, aktivasyon fonksiyonu tipi: 0 - sigmoid, 1 - hiperbolik tanjant).

bunu şu şekilde yapın: CNetMLP *net=new CNetMLP(ağ yapısı dizisi, aktivasyon fonksiyonu tipi: 0 - sigmoid, 1 - hiperbolik tanjant).

yani kodunuz "katman sayısı" ve "giriş vektörü boyutu" parametrelerini ağ yapısı dizisinden kendisi hesaplayacaktır, bence bu kodun netliğini ve okunabilirliğini artıracaktır.

 

Merhaba Yuri,

zunächst einmal vielen Dank für dieses Stück Code teilt die Gemeinschaft.

Kodunuzu bir Fachberater ile Diagrammwerte oluşturmaya çalıştım, ancak class_netmlp.mqh dosyasında bir hata var.

3'ü veya daha fazla Eingangswerte'i kullanmayı denediğimde, bu başlangıç tam olarak doğru değil .... bu sorunu çözmede yardımcı olabilir misiniz?

Dosyalar:
 
lütfen resimlere bakın
Dosyalar:
example1.jpg  67 kb
example2.jpg  39 kb
 

Çarpım tablosu eğitiminin sonuçları karşılaştırıldığında, ağınız belirgin bir şekilde kaybediyor. ALGLIB'de 100 epoch eğitim için 2,5,1 ağı(https://www.mql5.com/ru/forum/8265/page2) 1000000 epoch ile sizinkinden daha iyi cevaplar veriyor. 10000000000 epoklarını hesaplama hızı da memnun edici değil.

Görünüşe göre öğrenme yöntemi çok verimli değil. Ama yine de - çalışmanız için teşekkürler, küçük kodlarda anlaşılması ALGLIB'den daha kolay. Ama o zaman hala oraya gitmemiz gerekiyor.

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