グリッドは奇妙な動きをする。
学習プロセスの間、誤差はまず減少し、次に増加し始める。
そういう設計になっているのでしょうか?それとも私が何か間違っているのでしょうか?
これでいいのでしょうか?(出力は0,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例すべてをネットワークに渡したいのであれば、データ準備サイクルからトレーニングを外す必要がある。また、ニューロンの数と学習を停止する基準を決定することも重要です。
ありがとうございます、わかりました。
リクエストは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?
乗算表トレーニングの結果を比較すると、あなたのネットワークは明らかに負けている。ALGLIBでは、100エポック学習したネットワーク2,5,1(https://www.mql5.com/ru/forum/8265/page2)の 方が、1000000エポック学習したあなたのネットワークよりも良い答えを出している。100000000エポックの計算速度も満足できるものではない。
どうやら学習方法があまり効率的でないようだ。ALGLIBよりも小さなコードで理解しやすい。でも、まだまだ先に進む必要がある。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
MLPニューラルネットワーククラス:
作者: Yury Kulikov