2016-10-18 4 views
1

Matlabツールボックスでトレーニングされたニューラルネットワークを10層で手動でシミュレートしようとしました。このinfoによれば、入力を範囲[-1,1]にスケーリングする必要があります(出力は[0,1]に正規化され、[-1,1]から縮尺する必要があります)。私はMatlabのsim関数と比較して、この図に示すように出力の巨大な歪みがあります。上のプロットは手動シミュレーションであり、下の方はMatlabのsim関数です。ここに私の簡単なコードがあります。手動でMatlabニューラルネットワークをシミュレート

clear all; 
% x = [0;0;0;0;0;0;0;1;0;0.111;0]; 
load etp_input; 
% t = [0.45]; 
load etp_target; 
load ETp01.mat; 
iw = ETp01.IW{1,1}; 
lw1 = ETp01.LW{2,1}; 
lw2 = ETp01.LW{3,2}; 
lw3 = ETp01.LW{4,3}; 
lw4 = ETp01.LW{5,4}; 
lw5 = ETp01.LW{6,5}; 
lw6 = ETp01.LW{7,6}; 
lw7 = ETp01.LW{8,7}; 
lw8 = ETp01.LW{9,8}; 
lw9 = ETp01.LW{10,9}; 
b1 = ETp01.b{1}; 
b2 = ETp01.b{2}; 
b3 = ETp01.b{3}; 
b4 = ETp01.b{4}; 
b5 = ETp01.b{5}; 
b6 = ETp01.b{6}; 
b7 = ETp01.b{7}; 
b8 = ETp01.b{8}; 
b9 = ETp01.b{9}; 
b10 = ETp01.b{10}; 
for i=1:365 
    x = etp_input(:,i+19*365)*2-1; 
    xs = etp_input(:,i+19*365); 
    y1 = tansig(iw*x + b1); 
    y2 = tansig(lw1*y1 + b2); 
    y3 = tansig(lw2*y2 + b3); 
    y4 = tansig(lw3*y3 + b4); 
    y5 = tansig(lw4*y4 + b5); 
    y6 = tansig(lw5*y5 + b6); 
    y7 = tansig(lw6*y6 + b7); 
    y8 = tansig(lw7*y7 + b8); 
    y9 = tansig(lw8*y8 + b9); 
    y10 = purelin(lw9*y9 + b10); 
    outManual(i) = (y10+1)/2; 
    outSim(i) = sim(ETp01,xs); 
end 
subplot(2,1,1); 
plot(outManual); 
subplot(2,1,2); 
plot(outSim); 

私は365 for-loopを行う理由のため、毎年データセットを用意しています。それで、私はここで何が欠けているのですか?私は年間データセットがたくさんあり、それらは無作為に出力の異なる歪みを与えました(上記のコードは第19セットのデータを使用しています)。どんな助けもありがとう。これはコードの一部ですので、私が提供する必要がある情報については、私に知らせてください。皆さん、ありがとうございました。 :D:D:D

編集:

  • 私はネットワークを作成し、マットファイル内のネットワークオブジェクトを保存するためにnntoolを使用しています。完全なコードは上記で更新されています。
  • ここにはMatlabのnetwork viewがあります。
+0

あなたはNNをMATLABでどのように作成しますか?[mcve]を投稿しようとしてください。また、違いはそれほど悪くはありません。 –

+0

私はコードを更新し、ポストにネットワークの写真を追加しました。ありがとう。 –

+0

'a1、a2、a3、a4 ...'はお勧めできません。私は3Dマトリックスやセル配列を使用することをお勧めします... –

答えて

0

解決策が見つかりました。私が使ったスケーリングは正しいアイデアですが、私の入力は同じ範囲を持ちません(最後の2つの要素は[0,0.777]にあり、最初の9つの要素は[0、1]です)。だから私は別々にそれらをスケールする必要があります。 (Matlabのmapminmax関数を参照してください)。ありがとうstackoverflow ...:D

関連する問題