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] | 水色 |
隠れ層のユニット数が多い方が、学習開始直後の学習進捗が速いようだ。
問題が簡単なためか、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 ということなのだろうか…