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?
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.
Merhaba Yury,
Bu MLP sınıfını kullanarak bir Uzman Danışmanı nasıl oluşturabilirim?
Teşekkürler.
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
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
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?
Ç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.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
MLP sinir ağı sınıfı:
CNetMLP sınıfı çok katmanlı bir perseptron (MLP) uygular.
Author: Yury Kulikov