(34) ニューラルネットでsin関数を近似(その2)

投稿者: | 2014/09/20

2,489 views

この記事は最終更新から 1815日 が経過しています。

(33) ニューラルネットでsin関数を近似 では、3層(1-3-1)のニューラルネットワークにsin関数を学習させてみた。

今回は下表の3種類のネットワーク構成で比較してみた。

1 3層 [I 1] – [H 3] – [O 1]
2 3層 [I 1] – [H 5] – [O 1]
3 4層 [I 1] – [H 5] – [H 3] – [O 1] 水色

nnet_sin_2
隠れ層のユニット数が多い方が、学習開始直後の学習進捗が速いようだ。
問題が簡単なためか、50エポック辺りからは差がわからない。

pkg load nnet
rand('state', 0)
randn('state', 0)

% 学習データを作成
data_IN  = [ -pi*2 : 0.1 : pi*2 ];
data_OUT = sin(data_IN);
Rx2      = [min(data_IN), max(data_IN)];

% 3層ニューラルネットワーク(#1)を作成
S01 = [3 1];
NNet01 = newff( Rx2, S01 );
NNet01.trainParam.epochs = 60;

% 3層ニューラルネットワーク(#2)を作成
S02 = [5 1];
NNet02 = newff( Rx2, S02 );
NNet02.trainParam.epochs = 60;

% 4層ニューラルネットワークを作成
S03 = [5 3 1];
NNet03 = newff( Rx2, S03 );
NNet03.trainParam.epochs = 60;

% 学習を実行
VV.P = data_IN;
VV.T = data_OUT;

% net1
NNet01 = train( NNet01, data_IN, data_OUT, [], [], VV );
res01  = sim( NNet01, data_IN );

% net2
NNet02 = train( NNet02, data_IN, data_OUT, [], [], VV );
res02  = sim( NNet02, data_IN );

% net3
NNet03 = train( NNet03, data_IN, data_OUT, [], [], VV );
res03  = sim( NNet03, data_IN );

plot(data_IN, res01,    'b','LineWidth',2',    ...
     data_IN, res02,    'g','LineWidth',2',    ...
     data_IN, res03,    'c','LineWidth',2,
     data_IN, data_OUT, 'r','LineWidth',2' );

不明点
仕様上は train戻り値は 4個あるはず。3番目のout はおそらく出力値のこと。
もしこれが取得できれば、上記プログラムの sim は不要になるはずだ。
しかし、現状の trainは 戻り値を 1個 しか返さない… なぜだ?

[net,tr,out,E] = train(MLPnet,mInputN,mOutput,[],[],VV);

この辺が Unmaintained packages ということなのだろうか…


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です