ライブラリ: MLPニューラルネットワーククラス

 

MLPニューラルネットワーククラス:

CNetMLPは多層パーセプトロン(multilayer perceptron、MLP)を提供します。

作者: 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,0と大きなエラー)。

 

こんにちは、ユーリィ、

このMLPクラスを使ってエキスパートアドバイザーを作成する方法を教えてください。

ありがとうございます。

 
supercoder2006:

こんにちは、ユーリー、

このMLPクラスを使ってエキスパートアドバイザーを作成する方法を教えてください。

ありがとうございます。

単純なExpert Advisorを 作ることはできますか?
 

多分、私は何か間違ったことをしているか、コードが正しく動作していないのでしょう。

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例すべてをネットワークに渡したいのであれば、データ準備サイクルからトレーニングを外す必要がある。また、ニューロンの数と学習を停止する基準を決定することも重要です。

ありがとうございます、わかりました。

リクエストは1つだけです:

CNetMLP *net=new CNetMLP(number of layers, network structure array,input vector size, activation function type: 0 - sigmoid, 1 - hyperbolic tangent).

CNetMLP *net=new CNetMLP(network structure array, activation function type: 0 - sigmoid, 1 - hyperbolic tangent).

つまり、あなたのコードは、パラメータ「層数」と「入力ベクトルサイズ」をネットワーク構造配列から計算します。

 

こんにちは、ユーリ、

このコードを書いてくれてありがとう。

私はダイアグラムを作成するためにあなたのコードを使用していましたが、class_netmlp.mqhに問題があるようです。

しかし、3つのファイルを使用したり、複数のファイルを使用したりしようとしたのですが、うまくいきませんでした。können Sie mir dieses Problem Festsetzung helpen?

ファイル:
 
写真をご覧ください
ファイル:
example1.jpg  67 kb
example2.jpg  39 kb
 

乗算表トレーニングの結果を比較すると、あなたのネットワークは明らかに負けている。ALGLIBでは、100エポック学習したネットワーク2,5,1(https://www.mql5.com/ru/forum/8265/page2)の 方が、1000000エポック学習したあなたのネットワークよりも良い答えを出している。100000000エポックの計算速度も満足できるものではない。

どうやら学習方法があまり効率的でないようだ。ALGLIBよりも小さなコードで理解しやすい。でも、まだまだ先に進む必要がある。

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