Miyazawa’s Pukiwiki
MATLAB Note/Neural Network Toolbox
はすでに存在します。
開始行:
#access
#analog
-目次
#contents
--&pgid(,MATLAB Note/Neural Network Toolbox/SOM(自己組織...
--&pgid(,MATLAB Note/Neural Network Toolbox/その他のネッ...
**構造体net [#x858b288]
-ニューラルネットワークの構造と学習ルールを決定するための...
--[[基本概念と用語の説明(ニューロンモデルとネットワーク...
--[[netパラメータの詳細(ネットワークオブジェクトリファレ...
--[[関数の機能別リスト(リファレンス):http://www.mathwor...
--[[アドバンスドトピックス ネットワークのカスタマイズ:htt...
-具体的なパラメータの一覧は、以下の通りです。~
~
[[Architecture(アーキテクチャ) :http://www.mathworks.com/...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.numInputs|ネットワークが入力として受け取るベクトル集...
|net.numLayers|ネットワークがもつ層の数|0または正の整数|
|net.biasConnect(i)|i 番目の層のバイアスの有無|1 (有り)ま...
|net.inputConnect(i,j)|j 番目の入力層から i 番目の層への...
|net.layerConnect(i,j)|j 番目の層から i 番目の層への重み...
|net.outputConnect(i)|i 番目の層からのネットワーク出力の...
|net.targetConnect(i)|i 番目の層に関連するターゲット(教...
|net.numOutputs|ネットワークのもつ出力数 ( = sum(net.out...
|net.numTargets|ネットワークのもつターゲット数 ( = sum(n...
|net.numInputDelays|シミュレートにおいて与える必要がある...
|net.numLayerDelays|シミュレートに対して与える必要がある...
※引数を指定するプロパティは、引数なしでまとめて呼び出す...
~
-~
[[Subobject Structure(サブオブジェクト構造体) :http://www...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.inputs{i}|i 番目の入力層のプロパティ構造体|以下([[...
|net.inputs{i}.range|i 番目の入力層の要素の範囲|入力要素...
|net.inputs{i}.size|i 番目の入力層の要素数|0または正の整数|
|net.inputs{i}.userdata|i 番目の入力層に関するカスタマイ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.layers{i}|i 番目の層のプロパティ構造体|以下([[参照:...
|net.layers{i}.dimensions|i 番目の層のノードの次元(SOM用...
|net.layers{i}.distanceFcn|i 番目の層のニューロン間の距離...
|net.layers{i}.distances|i 番目の層のニューロン間の距離(...
|net.layers{i}.initFcn|i 番目の層の初期化関数(ネットワー...
|net.layers{i}.netInputFcn|i 番目の層のネット入力の計算用...
|net.layers{i}.positions|i 番目の層内のニューロンの位置(...
|net.layers{i}.size|i 番目の層のニューロン数|0または正の...
|net.topologyFcn|層のニューロンの位置計算用関数(SOM用)|...
|net.layers{i}.transferFcn|i 番目の層の出力計算用の伝達関...
|net.layers{i}.userdata|i 番目の層に関するカスタマイズ情...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.outputs{i}|i 番目の層の出力のプロパティ構造体|以下(...
|net.outputs{i}.size|i 番目の層の出力の要素数( = i 番目...
|net.outputs{i}.userdata|i 番目の層の出力に関するカスタマ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.targets{i}|i 番目の層のターゲットのプロパティ構造体|...
|net.targets{i}.size|i 番目の層のターゲット内の要素数( =...
|net.targets{i}.userdata|i 番目の層のターゲットに関するカ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.biases{i}|i 番目の層のバイアスのプロパティ構造体|以...
|net.biases{i}.initFcn|i 番目の層のバイアスの初期化関数(...
|net.biases{i}.learn|訓練および適応中に i 番目のバイアス...
|net.biases{i}.learnFcn|i 番目の層のバイアス更新用関数(...
|net.biases{i}.learnParam|i 番目の層のバイアス更新関数の...
|net.biases{i}.size|i 番目の層のバイアスのサイズ( = i 番...
|net.biases{i}.userdata|i 番目の層のバイアスに関するカス...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.inputWeights{i,j}|j 番目の入力層から i 番目の層への...
|net.inputWeights{i,j}.delays|j 番目の入力層と i 番目の層...
|net.inputWeights{i,j}.initFcn|j 番目の入力層から i 番目...
|net.inputWeights{i,j}.learn|j 番目の入力層から i 番目の...
|net.inputWeights{i,j}.learnFcn|j 番目の入力層から i 番目...
|net.inputWeights{i,j}.learnParam|j 番目の入力層から i 番...
|net.inputWeights{i,j}.size| j 番目の入力層から i 番目の...
|net.inputWeights{i,j}.userdata|(i,j) 番目の入力重みに関...
|net.inputWeights{i,j}.weightFcn|j 番目の入力層から i 番...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.layerWeights{i,j}|j 番目の層から i 番目の層への重み...
|net.layerWeights{i,j}.delays|省略、net.inputWeightsと同...
|net.layerWeights{i,j}.initFcn|省略、net.inputWeightsと同...
|net.layerWeights{i,j}.learn|省略、net.inputWeightsと同じ||
|net.layerWeights{i,j}.learnFcn|省略、net.inputWeightsと...
|net.layerWeights{i,j}.learnParam|省略、net.inputWeights...
|net.layerWeights{i,j}.size|省略、net.inputWeightsと同じ||
|net.layerWeights{i,j}.userdata|省略、net.inputWeightsと...
|net.layerWeights{i,j}.weightFcn|省略、net.inputWeightsと...
~
-~
[[Functions(関数) :http://dl.cybernet.co.jp/matlab/suppor...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.adaptFcn|ネットワークの逐次型学習(適応)に用いる関...
|net.initFcn|ネットワークの初期化に用いる関数|任意の関数...
|net.performFcn|ネットワークのパフォーマンス測定に用いる...
|net.trainFcn|ネットワークのバッチ型学習(訓練)に用いる...
~
-~
[[Parameters(パラメータ) :http://dl.cybernet.co.jp/matlab...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.adaptParam|net.adaptFcnで指定した適応関数のパラメー...
|net.initParam|net.initFcnで指定した初期化関数のパラメー...
|net.performParam|net.performFcnで指定したパフォーマンス...
|net.trainParam|net.trainFcnで指定した訓練関数のパラメー...
~
-~
[[Weight and Bias Values(重みとバイアスの値) :http://dl.c...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.IW{i,j}| j 番目の入力層から i 番目の層への重み|対応...
|net.LW{i,j}| j 番目の層から i 番目の層への重み|対応する...
|net.b{i}| i 番目の層に対するバイアス|対応する層のサイズ...
~
-~
[[Other(その他) :http://dl.cybernet.co.jp/matlab/support/...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.userdata|ネットワークオブジェクトにカスタマイズの情...
**パーセプトロン [#g4a833cc]
-リファレンス
--[[パーセプトロン:http://www.mathworks.com/access/helpde...
--[[多層ネットワーク(バックプロパゲーション):http://www...
--[[複数ニューロンをもつ単層:http://dl.cybernet.co.jp/mat...
--[[複数ニューロンをもつ多層:http://dl.cybernet.co.jp/mat...
***簡単な例 [#n56ad851]
-[[参考:http://dl.cybernet.co.jp/matlab/support/manual/r1...
-例えば、以下のような2カテゴリの入力値(入力ベクトル)の...
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-上図の入力値は以下のようにして作成しました。~
#geshi(matlab){{
%入力ベクトル(学習データ)を設定
p = [ 2 2 1 0 0 1 -1 -2 -2
-1 2 -1 2 -2 1 2 1 0 ] %1列が1データセット
%以下のように表記してもいいです。
p = [[2;-1] [2;2] [1;-1] [0;2] [0;-2] [1;1] [-1;2] [-2;1...
%ターゲットベクトル(教師データ、カテゴリラベル)を設定
t = [ 0 1 0 1 0 1 1 0 0 ] %各列が入力ベクトル...
%入力ベクトルをプロット
pt0 = p( : , find(t==0) ) %ターゲット(カテゴリ)が0の...
pt1 = p( : , find(t==1) ) %ターゲット(カテゴリ)が1の...
plot(pt0(1,:),pt0(2,:),'ob', pt1(1,:),pt1(2,:),'or'); ax...
%関数 PLOTPV を使えば、自動的にターゲット別の入力ベクト...
plotpv(p,t);
}}
-パーセプトロンの訓練は、以下のようにします(上のコードに...
#geshi(matlab){{
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp([-2 2;-2 +2],1);
%ネットワークの訓練
net.trainParam.epochs = 1; %訓練回数(epochsを1にすると...
net = train(net,p,t); %ネットワークの訓練を開始す...
%訓練結果を確認
a = sim(net,p) %訓練後のネットワークの各入...
error = [a - t] %出力がターゲットベクトルと...
%訓練結果(識別境界)をプロット
figure(1); %figure1ウインドウに描画する
plotpv(p,t);
hold on %上のプロット(入力ベクトル...
linehandle=plotpc(net.IW{1},net.b{1}); %分類境界をプロ...
hold off
}}
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-ターゲット(カテゴリ)0の入力値(2,-1)が、ターゲット1に...
--これはerrorの値が「 1 0 0 0 0 0 0 0 0 」と出力されてい...
--そのため、epochs = 1 では(入力ベクトルを1回ずつ与えた...
-したがって、続けて学習を行います(上のコードに続けて実行...
#geshi(matlab){{
net.trainParam.epochs = 10; %epochs(訓練回数)を10に設...
net = train(net,p,t); %ネットワークの追加訓練を開...
%訓練結果を確認
a = sim(net,p)
error = [a - t]
%訓練結果(識別境界)をプロット
figure(2);
plotpv(p,t);
hold on
linehandle=plotpc(net.IW{1},net.b{1});
hold off
}}
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-完全に識別できていることが分かります。
--訓練の経過メッセージとして、以下が出力されたはずです。~
TRAINC, Epoch 0/10~
TRAINC, Epoch 4/10~
TRAINC, Performance goal met.~
--これはepochsを10に指定したけれど、4epochsで収束したため...
--入力ベクトルが線形分離可能でなければ、パーセプトロンの...
-訓練を終えたネットワークに対して新規のベクトルを提示して...
a = sim(net, [[-2;-2] [1;2]]) %新規の入力ベクトル(-2,-...
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-ベクトル(-2,-2)がカテゴリ0(○)、ベクトル(1,2)がカテ...
~
-おまけ 複数ニューロンのパーセプトロン
--2つ以上のニューロンを持つパーセプトロンに、異なるターゲ...
--以下のコードを実行してください(新規に実行します)。~
#geshi(matlab){{
%入力ベクトル(学習データ)を設定
p = [[2;-1] [2;2] [1;-1] [0;2] [0;-2] [1;1] [-1;2] [-2;1...
%ターゲットベクトル(教師データ、カテゴリラベル)を設定
t = [ 0 1 0 1 0 1 1 0 0
0 0 0 1 0 0 1 1 1 ] %各列が入力ベクトル...
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp([-2 2;-2 +2],2);
%ネットワークの訓練
net.trainParam.epochs = 10; %訓練回数
net = train(net,p,t); %ネットワークの訓練...
%訓練結果を確認
a = sim(net,p)
error = [a - t]
%訓練結果(識別境界)をプロット
figure(1);
plotpv(p,t);
hold on
linehandle=plotpc(net.IW{1},net.b{1});
hold off
}}
--結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
***一層のパーセプトロン [#u1504e58]
-入力層ノード2個、出力層ノード1個の単層パーセプトロンに、...
--すなわち、次のような関係です。
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/PP_...
-入力値とターゲット(期待する出力、教師情報)を定義します。
#geshi(matlab){{
%入力ベクトルを設定
p = [ 0 1 0 1
0 0 1 1 ] %1列が1デー...
%ターゲットベクトルを設定
t = [ 0 0 0 1 ] %各列が入力...
%ターゲット別の入力ベクトルをプロット
plotpv(p,t);
}}
-まずは、新規にネットワークオブジェクトを宣言します。
#geshi(matlab){{
net = network(1,1,[1],[1],[0],[1],[1]);
}}
--新規ネットワークは、関数[[NETWORK:http://dl.cybernet.co...
--引数の詳細は、以下の通りです。パーセプトロンのデフォル...
~
|BGCOLOR(white):引数|BGCOLOR(white):対応するプロパティ(...
|1|net.numInputs = 1|入力数(入力層の数) = 1|
|1|net.numLayers = 1|層の数 = 1|
|[1]|net.biasConnect( biasConnect(1) ) = [1]|出力層(第...
|[1]|net.inputConnect( inputConnect(1,1) ) = [1]|出力層...
|[0]|net.layerConnect( layerConnect(1,:) ) = [0]|出力層...
|[1]|net.outputConnect( outputConnect(1) ) = [1]|ネット...
|[1]|net.targetConnect( targetConnect(1) ) = [1]|ネット...
~
--これ以外のパラメータには値が代入されません。そのため、...
~
-続いて、パーセプトロン固有のプロパティを設定します。~
#geshi(matlab){{
% 1番目の入力層の要素の範囲
net.inputs{1}.range = [0 1;0 1]; %入力層のノードは2つ(1...
% 1番目の層(出力層)のニューロン数
net.layers{1}.size = 1; %出力層のノードは1つ
% 出力計算用の伝達関数
net.layers{1}.transferFcn = 'hardlim'; %ハードリミ...
% ネットワークのパフォーマンス測定関数
net.performFcn = 'mae'; %MAE(平均絶...
% 1番目の入力層から出力層への重み行列学習関数
net.inputWeights{1,1}.learnFcn = 'learnp'; %LEARNP(パ...
% 出力層のバイアス更新用関数
net.biases{1}.learnFcn = 'learnp'; %LEARNP(パ...
% 適応関数(逐次型学習で使用)
net.adaptFcn = 'trains'; %TRAINS(継...
% 訓練関数(バッチ型学習と逐次型学習で使用)
net.trainFcn = 'trainc'; %TRAINC(周...
% 初期化関数
net.initFcn = 'initlay'; %ネットワー...
net.layers{1}.initFcn = 'initwb'; %出力層の初...
net.biases{1}.initFcn = 'initzero'; %出力層のバ...
net.inputWeights{1,1}.initFcn = 'initzero'; %出力層の重...
%初期化を実行
net = init(net);
}}
--「''伝達関数(transferFcn)''」とは、ネットワークの各ノ...
--「''学習関数(leranFcn)''」とは、ネットワークの各ノー...
--「''適応関数(adaptFcn)''」とは、逐次型学習を行なう関...
--「''訓練関数(trainFcn)''」とは、バッチ型学習を行なう...
-これでネットワークの初期設定が終わりました。構造体netの...
#geshi(matlab){{
net
}}
とすることで確認できます。
--ここまでと同様の処理(ネットワークオブジェクトを宣言 ~...
#geshi(matlab){{
newp([0 1;0 1], 1); %パーセプトロンネットワークを作...
}}
とすることでも実現できます。
--入力ベクトルのサイズ(特徴量の数、最大値・最小値)が不...
#geshi(matlab){{
% 入力ベクトルのサイズ(size(p)の1番目の要素が行数、すな...
vectorsize = size(p);
% ネットワークに入力する入力層の要素の範囲を格納する配列...
vectorlength = [];
for count = 1 : 1 : vectorsize(1)
vectorlength = [vectorlength ; min(p(count,:)) max(p...
end
net = newp(vectorlength, 1);
}}
-続いて、学習(重みとバイアスの更新)を行います。
--逐次型の適応学習(ADAPT)か、バッチ型の訓練学習(TRAIN...
--パーセプトロンにおける逐次型とバッチ型の学習に関しては...
-~
#geshi(matlab){{
%ネットワークを逐次型で学習させる(適応)
net.adaptParam.passes = 40; %適応関数TRAINSのパラメータ...
net = adapt(net,p,t); %入力ベクトルに対して重みと...
}}
--関数[[ADAPT:http://dl.cybernet.co.jp/matlab/support/man...
---パーセプトロンのプロパティ設定の際に、適応関数(net.ad...
---&color(red){「連続列全体を通るパス」とは、入力ベクトル...
---適応関数 trains の各ステップの処理のところでプロット命...
-~
#geshi(matlab){{
%ネットワークをバッチ型で学習させる(訓練)
net.trainParam.epochs = 10; %訓練関数TRAINCのパラメータ
%(入力ベクトルを10エポック...
net = train(net,p,t); %学習を開始する
%(入力ベクトルに対して重み...
}}
--関数[[TRAIN:http://dl.cybernet.co.jp/matlab/support/man...
---パーセプトロンのプロパティ設定の際に、訓練関数(net.tr...
---エポックとは、入力ベクトルセット全てを1回とした訓練回...
-&color(red){パフォーマンスの評価と学習の収束について};
~
~
-最後に、学習済みネットワークに入力ベクトルを与え、出力結...
#geshi(matlab){{
%訓練結果を確認
a = sim(net,p) %訓練後のネットワークの各入力ベ...
error = [a - t] %出力がターゲットベクトルと一致...
length(find(error == 0)) / length(t) %正解率を求める
%訓練結果(識別境界)をプロット
figure(1); %figure1ウインドウに描画する
plotpv(p,t);
hold on %上のプロット(入力ベクトル)を...
linehandle=plotpc(net.IW{1},net.b{1}); %分類境界をプロ...
hold off
}}
-訓練関数について
--&color(red){上記のネットワークは、毎回結果が同じ?};
--&color(red){TRAINRを使うと結果がランダムに変わる};
-&pgid(,MATLAB Note/Neural Network Toolbox/多層ネットワー...
***補記 [#k5365376]
-入力ベクトルの特徴量数、サイズが未知の場合
#geshi(matlab){{
%入力ベクトルを指定
p = [ 1 0 0 1 0 0
0 0 0 1 0 1
0 1 1 0 0 0
0 0 0 0 1 0
1 0 1 0 0 1 ]'
%ターゲット(教師データ)を指定
t = [ 1
1
0
0
1 ]'
% 入力ベクトルのサイズを調べる(size(p)の1番目の要素が行...
vectorsize = size(p);
% ネットワークに入力する入力層の要素の範囲を格納する配列...
vectorlength = [];
for count = 1 : 1 : vectorsize(1)
vectorlength = [vectorlength ; min(p(count,:)) max(p...
end
vectorlength
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp(vectorlength, 1);
}}
-正解率を求めるには
#geshi(matlab){{
length(find(error == 0)) / length(t)
}}
--20071228 追記 : 正解率は 1.00 までいくと過学習のようで...
***二層のパーセプトロン [#l2a21f55]
-多層ネットワークは、線形分離可能な問題しか解けない単層パ...
-単層パーセプトロンでは、XOR構造を学習させることはできま...
-そのため、以下のような入力層ノード2個、中間層ノード2個、...
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/PP_...
-入力値とターゲット(期待する出力、教師情報)を定義します。
#geshi(matlab){{
p = [ 0 1 0 1
0 0 1 1 ]
t = [ 1 0 0 1 ]
}}
-新規にネットワークオブジェクトを宣言して、パーセプトロン...
#geshi(matlab){{
s = [2 1] %[1番目の層のニューロンの数 2番目...
Nl = length(s); %ニューロンの数ベクトル s の列数(...
% ネットワークアーキテクチャ
net = network(1,Nl); %入力層の数1、層の数2 で新...
net.biasConnect = ones(Nl,1); %各層のバイアスの有無(全...
net.inputConnect(1,1) = 1; %第1入力層から1層目(中間...
net.layerConnect = [ 0 0
1 0 ]; %1層目(中間層)から2層目...
net.outputConnect(Nl) = 1; %Nl番目の層(出力層)のネ...
net.targetConnect(Nl) = 1; %Nl番目の層(出力層)のタ...
% 1番目の入力層の要素の範囲
net.inputs{1}.range = [0 1;0 1]; %入力層のノードは2つ(1...
% 1番目の層(出力層)のニューロン数、出力計算用の伝達関数
tf = {'tansig' 'purelin'} %1層目(中間層)=TANSIG、2...
for count = 1 : Nl
net.layers{count}.size = s(count); %count番目...
net.layers{count}.transferFcn = tf{count}; %count番目...
end
% ネットワークのパフォーマンス測定関数
net.performFcn = 'mae' %MAE(平均絶対誤差)
% 1番目の入力層から 1 番目の層(中間層)への重み行列学習...
net.inputWeights{1,1}.learnFcn = 'learnp'; %LEARNP(パ...
% 層どうしの重み行列学習関数、バイアス更新用関数
for count = 1 : 2
net.layerWeights{count,:}.learnFcn = 'learnp'; %count...
net.biases{count}.learnFcn = 'learnp'; %count...
end
% 訓練関数(バッチ型学習と逐次型学習で使用)
net.trainfcn = 'trainlm' %TRAINLM (Levenberg-Marquard...
% 初期化関数
net.initFcn = 'initlay';
for count = 1 : Nl
net.layers{count}.initFcn = 'initnw';
end
net = init(net); %初期化を実行
}}
--逐次型学習関数(net.adaptFcn)は指定していないため、バ...
--訓練関数として、[[TRAINLM:http://dl.cybernet.co.jp/matl...
--バックプロパゲーションの伝達関数は、非線形微分可能な出...
---単層パーセプトロンで使用していた[[ハードリミット伝達関...
---ここでは、中間層に[[正接シグモイド伝達関数:http://dl.c...
-続いて、学習(重みとバイアスの更新)を行います。
#geshi(matlab){{
%ネットワークをバッチ型で学習させる(訓練)
net.trainParam.epochs = 30; %入力ベクトルを30エポック繰...
net = train(net,p,t); %学習開始(入力ベクトルに対...
}}
-最後に、学習済みネットワークに入力ベクトルを与え、出力結...
#geshi(matlab){{
%結果をプロット
p %入力ベクトル
t %ターゲットベクトル
a = sim(net,p) %ネットワークの出力
}}
--XOR構造を学習できていることが分かります。
-&color(red){学習を終えたネットワークの各ノードの重みは、...
終了行:
#access
#analog
-目次
#contents
--&pgid(,MATLAB Note/Neural Network Toolbox/SOM(自己組織...
--&pgid(,MATLAB Note/Neural Network Toolbox/その他のネッ...
**構造体net [#x858b288]
-ニューラルネットワークの構造と学習ルールを決定するための...
--[[基本概念と用語の説明(ニューロンモデルとネットワーク...
--[[netパラメータの詳細(ネットワークオブジェクトリファレ...
--[[関数の機能別リスト(リファレンス):http://www.mathwor...
--[[アドバンスドトピックス ネットワークのカスタマイズ:htt...
-具体的なパラメータの一覧は、以下の通りです。~
~
[[Architecture(アーキテクチャ) :http://www.mathworks.com/...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.numInputs|ネットワークが入力として受け取るベクトル集...
|net.numLayers|ネットワークがもつ層の数|0または正の整数|
|net.biasConnect(i)|i 番目の層のバイアスの有無|1 (有り)ま...
|net.inputConnect(i,j)|j 番目の入力層から i 番目の層への...
|net.layerConnect(i,j)|j 番目の層から i 番目の層への重み...
|net.outputConnect(i)|i 番目の層からのネットワーク出力の...
|net.targetConnect(i)|i 番目の層に関連するターゲット(教...
|net.numOutputs|ネットワークのもつ出力数 ( = sum(net.out...
|net.numTargets|ネットワークのもつターゲット数 ( = sum(n...
|net.numInputDelays|シミュレートにおいて与える必要がある...
|net.numLayerDelays|シミュレートに対して与える必要がある...
※引数を指定するプロパティは、引数なしでまとめて呼び出す...
~
-~
[[Subobject Structure(サブオブジェクト構造体) :http://www...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.inputs{i}|i 番目の入力層のプロパティ構造体|以下([[...
|net.inputs{i}.range|i 番目の入力層の要素の範囲|入力要素...
|net.inputs{i}.size|i 番目の入力層の要素数|0または正の整数|
|net.inputs{i}.userdata|i 番目の入力層に関するカスタマイ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.layers{i}|i 番目の層のプロパティ構造体|以下([[参照:...
|net.layers{i}.dimensions|i 番目の層のノードの次元(SOM用...
|net.layers{i}.distanceFcn|i 番目の層のニューロン間の距離...
|net.layers{i}.distances|i 番目の層のニューロン間の距離(...
|net.layers{i}.initFcn|i 番目の層の初期化関数(ネットワー...
|net.layers{i}.netInputFcn|i 番目の層のネット入力の計算用...
|net.layers{i}.positions|i 番目の層内のニューロンの位置(...
|net.layers{i}.size|i 番目の層のニューロン数|0または正の...
|net.topologyFcn|層のニューロンの位置計算用関数(SOM用)|...
|net.layers{i}.transferFcn|i 番目の層の出力計算用の伝達関...
|net.layers{i}.userdata|i 番目の層に関するカスタマイズ情...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.outputs{i}|i 番目の層の出力のプロパティ構造体|以下(...
|net.outputs{i}.size|i 番目の層の出力の要素数( = i 番目...
|net.outputs{i}.userdata|i 番目の層の出力に関するカスタマ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.targets{i}|i 番目の層のターゲットのプロパティ構造体|...
|net.targets{i}.size|i 番目の層のターゲット内の要素数( =...
|net.targets{i}.userdata|i 番目の層のターゲットに関するカ...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.biases{i}|i 番目の層のバイアスのプロパティ構造体|以...
|net.biases{i}.initFcn|i 番目の層のバイアスの初期化関数(...
|net.biases{i}.learn|訓練および適応中に i 番目のバイアス...
|net.biases{i}.learnFcn|i 番目の層のバイアス更新用関数(...
|net.biases{i}.learnParam|i 番目の層のバイアス更新関数の...
|net.biases{i}.size|i 番目の層のバイアスのサイズ( = i 番...
|net.biases{i}.userdata|i 番目の層のバイアスに関するカス...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.inputWeights{i,j}|j 番目の入力層から i 番目の層への...
|net.inputWeights{i,j}.delays|j 番目の入力層と i 番目の層...
|net.inputWeights{i,j}.initFcn|j 番目の入力層から i 番目...
|net.inputWeights{i,j}.learn|j 番目の入力層から i 番目の...
|net.inputWeights{i,j}.learnFcn|j 番目の入力層から i 番目...
|net.inputWeights{i,j}.learnParam|j 番目の入力層から i 番...
|net.inputWeights{i,j}.size| j 番目の入力層から i 番目の...
|net.inputWeights{i,j}.userdata|(i,j) 番目の入力重みに関...
|net.inputWeights{i,j}.weightFcn|j 番目の入力層から i 番...
~
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.layerWeights{i,j}|j 番目の層から i 番目の層への重み...
|net.layerWeights{i,j}.delays|省略、net.inputWeightsと同...
|net.layerWeights{i,j}.initFcn|省略、net.inputWeightsと同...
|net.layerWeights{i,j}.learn|省略、net.inputWeightsと同じ||
|net.layerWeights{i,j}.learnFcn|省略、net.inputWeightsと...
|net.layerWeights{i,j}.learnParam|省略、net.inputWeights...
|net.layerWeights{i,j}.size|省略、net.inputWeightsと同じ||
|net.layerWeights{i,j}.userdata|省略、net.inputWeightsと...
|net.layerWeights{i,j}.weightFcn|省略、net.inputWeightsと...
~
-~
[[Functions(関数) :http://dl.cybernet.co.jp/matlab/suppor...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.adaptFcn|ネットワークの逐次型学習(適応)に用いる関...
|net.initFcn|ネットワークの初期化に用いる関数|任意の関数...
|net.performFcn|ネットワークのパフォーマンス測定に用いる...
|net.trainFcn|ネットワークのバッチ型学習(訓練)に用いる...
~
-~
[[Parameters(パラメータ) :http://dl.cybernet.co.jp/matlab...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.adaptParam|net.adaptFcnで指定した適応関数のパラメー...
|net.initParam|net.initFcnで指定した初期化関数のパラメー...
|net.performParam|net.performFcnで指定したパフォーマンス...
|net.trainParam|net.trainFcnで指定した訓練関数のパラメー...
~
-~
[[Weight and Bias Values(重みとバイアスの値) :http://dl.c...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.IW{i,j}| j 番目の入力層から i 番目の層への重み|対応...
|net.LW{i,j}| j 番目の層から i 番目の層への重み|対応する...
|net.b{i}| i 番目の層に対するバイアス|対応する層のサイズ...
~
-~
[[Other(その他) :http://dl.cybernet.co.jp/matlab/support/...
|BGCOLOR(white):名前 |BGCOLOR(white):内容 |BGCOLOR(white)...
|net.userdata|ネットワークオブジェクトにカスタマイズの情...
**パーセプトロン [#g4a833cc]
-リファレンス
--[[パーセプトロン:http://www.mathworks.com/access/helpde...
--[[多層ネットワーク(バックプロパゲーション):http://www...
--[[複数ニューロンをもつ単層:http://dl.cybernet.co.jp/mat...
--[[複数ニューロンをもつ多層:http://dl.cybernet.co.jp/mat...
***簡単な例 [#n56ad851]
-[[参考:http://dl.cybernet.co.jp/matlab/support/manual/r1...
-例えば、以下のような2カテゴリの入力値(入力ベクトル)の...
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-上図の入力値は以下のようにして作成しました。~
#geshi(matlab){{
%入力ベクトル(学習データ)を設定
p = [ 2 2 1 0 0 1 -1 -2 -2
-1 2 -1 2 -2 1 2 1 0 ] %1列が1データセット
%以下のように表記してもいいです。
p = [[2;-1] [2;2] [1;-1] [0;2] [0;-2] [1;1] [-1;2] [-2;1...
%ターゲットベクトル(教師データ、カテゴリラベル)を設定
t = [ 0 1 0 1 0 1 1 0 0 ] %各列が入力ベクトル...
%入力ベクトルをプロット
pt0 = p( : , find(t==0) ) %ターゲット(カテゴリ)が0の...
pt1 = p( : , find(t==1) ) %ターゲット(カテゴリ)が1の...
plot(pt0(1,:),pt0(2,:),'ob', pt1(1,:),pt1(2,:),'or'); ax...
%関数 PLOTPV を使えば、自動的にターゲット別の入力ベクト...
plotpv(p,t);
}}
-パーセプトロンの訓練は、以下のようにします(上のコードに...
#geshi(matlab){{
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp([-2 2;-2 +2],1);
%ネットワークの訓練
net.trainParam.epochs = 1; %訓練回数(epochsを1にすると...
net = train(net,p,t); %ネットワークの訓練を開始す...
%訓練結果を確認
a = sim(net,p) %訓練後のネットワークの各入...
error = [a - t] %出力がターゲットベクトルと...
%訓練結果(識別境界)をプロット
figure(1); %figure1ウインドウに描画する
plotpv(p,t);
hold on %上のプロット(入力ベクトル...
linehandle=plotpc(net.IW{1},net.b{1}); %分類境界をプロ...
hold off
}}
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-ターゲット(カテゴリ)0の入力値(2,-1)が、ターゲット1に...
--これはerrorの値が「 1 0 0 0 0 0 0 0 0 」と出力されてい...
--そのため、epochs = 1 では(入力ベクトルを1回ずつ与えた...
-したがって、続けて学習を行います(上のコードに続けて実行...
#geshi(matlab){{
net.trainParam.epochs = 10; %epochs(訓練回数)を10に設...
net = train(net,p,t); %ネットワークの追加訓練を開...
%訓練結果を確認
a = sim(net,p)
error = [a - t]
%訓練結果(識別境界)をプロット
figure(2);
plotpv(p,t);
hold on
linehandle=plotpc(net.IW{1},net.b{1});
hold off
}}
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-完全に識別できていることが分かります。
--訓練の経過メッセージとして、以下が出力されたはずです。~
TRAINC, Epoch 0/10~
TRAINC, Epoch 4/10~
TRAINC, Performance goal met.~
--これはepochsを10に指定したけれど、4epochsで収束したため...
--入力ベクトルが線形分離可能でなければ、パーセプトロンの...
-訓練を終えたネットワークに対して新規のベクトルを提示して...
a = sim(net, [[-2;-2] [1;2]]) %新規の入力ベクトル(-2,-...
-結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
-ベクトル(-2,-2)がカテゴリ0(○)、ベクトル(1,2)がカテ...
~
-おまけ 複数ニューロンのパーセプトロン
--2つ以上のニューロンを持つパーセプトロンに、異なるターゲ...
--以下のコードを実行してください(新規に実行します)。~
#geshi(matlab){{
%入力ベクトル(学習データ)を設定
p = [[2;-1] [2;2] [1;-1] [0;2] [0;-2] [1;1] [-1;2] [-2;1...
%ターゲットベクトル(教師データ、カテゴリラベル)を設定
t = [ 0 1 0 1 0 1 1 0 0
0 0 0 1 0 0 1 1 1 ] %各列が入力ベクトル...
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp([-2 2;-2 +2],2);
%ネットワークの訓練
net.trainParam.epochs = 10; %訓練回数
net = train(net,p,t); %ネットワークの訓練...
%訓練結果を確認
a = sim(net,p)
error = [a - t]
%訓練結果(識別境界)をプロット
figure(1);
plotpv(p,t);
hold on
linehandle=plotpc(net.IW{1},net.b{1});
hold off
}}
--結果は以下のようになります。~
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/per...
***一層のパーセプトロン [#u1504e58]
-入力層ノード2個、出力層ノード1個の単層パーセプトロンに、...
--すなわち、次のような関係です。
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/PP_...
-入力値とターゲット(期待する出力、教師情報)を定義します。
#geshi(matlab){{
%入力ベクトルを設定
p = [ 0 1 0 1
0 0 1 1 ] %1列が1デー...
%ターゲットベクトルを設定
t = [ 0 0 0 1 ] %各列が入力...
%ターゲット別の入力ベクトルをプロット
plotpv(p,t);
}}
-まずは、新規にネットワークオブジェクトを宣言します。
#geshi(matlab){{
net = network(1,1,[1],[1],[0],[1],[1]);
}}
--新規ネットワークは、関数[[NETWORK:http://dl.cybernet.co...
--引数の詳細は、以下の通りです。パーセプトロンのデフォル...
~
|BGCOLOR(white):引数|BGCOLOR(white):対応するプロパティ(...
|1|net.numInputs = 1|入力数(入力層の数) = 1|
|1|net.numLayers = 1|層の数 = 1|
|[1]|net.biasConnect( biasConnect(1) ) = [1]|出力層(第...
|[1]|net.inputConnect( inputConnect(1,1) ) = [1]|出力層...
|[0]|net.layerConnect( layerConnect(1,:) ) = [0]|出力層...
|[1]|net.outputConnect( outputConnect(1) ) = [1]|ネット...
|[1]|net.targetConnect( targetConnect(1) ) = [1]|ネット...
~
--これ以外のパラメータには値が代入されません。そのため、...
~
-続いて、パーセプトロン固有のプロパティを設定します。~
#geshi(matlab){{
% 1番目の入力層の要素の範囲
net.inputs{1}.range = [0 1;0 1]; %入力層のノードは2つ(1...
% 1番目の層(出力層)のニューロン数
net.layers{1}.size = 1; %出力層のノードは1つ
% 出力計算用の伝達関数
net.layers{1}.transferFcn = 'hardlim'; %ハードリミ...
% ネットワークのパフォーマンス測定関数
net.performFcn = 'mae'; %MAE(平均絶...
% 1番目の入力層から出力層への重み行列学習関数
net.inputWeights{1,1}.learnFcn = 'learnp'; %LEARNP(パ...
% 出力層のバイアス更新用関数
net.biases{1}.learnFcn = 'learnp'; %LEARNP(パ...
% 適応関数(逐次型学習で使用)
net.adaptFcn = 'trains'; %TRAINS(継...
% 訓練関数(バッチ型学習と逐次型学習で使用)
net.trainFcn = 'trainc'; %TRAINC(周...
% 初期化関数
net.initFcn = 'initlay'; %ネットワー...
net.layers{1}.initFcn = 'initwb'; %出力層の初...
net.biases{1}.initFcn = 'initzero'; %出力層のバ...
net.inputWeights{1,1}.initFcn = 'initzero'; %出力層の重...
%初期化を実行
net = init(net);
}}
--「''伝達関数(transferFcn)''」とは、ネットワークの各ノ...
--「''学習関数(leranFcn)''」とは、ネットワークの各ノー...
--「''適応関数(adaptFcn)''」とは、逐次型学習を行なう関...
--「''訓練関数(trainFcn)''」とは、バッチ型学習を行なう...
-これでネットワークの初期設定が終わりました。構造体netの...
#geshi(matlab){{
net
}}
とすることで確認できます。
--ここまでと同様の処理(ネットワークオブジェクトを宣言 ~...
#geshi(matlab){{
newp([0 1;0 1], 1); %パーセプトロンネットワークを作...
}}
とすることでも実現できます。
--入力ベクトルのサイズ(特徴量の数、最大値・最小値)が不...
#geshi(matlab){{
% 入力ベクトルのサイズ(size(p)の1番目の要素が行数、すな...
vectorsize = size(p);
% ネットワークに入力する入力層の要素の範囲を格納する配列...
vectorlength = [];
for count = 1 : 1 : vectorsize(1)
vectorlength = [vectorlength ; min(p(count,:)) max(p...
end
net = newp(vectorlength, 1);
}}
-続いて、学習(重みとバイアスの更新)を行います。
--逐次型の適応学習(ADAPT)か、バッチ型の訓練学習(TRAIN...
--パーセプトロンにおける逐次型とバッチ型の学習に関しては...
-~
#geshi(matlab){{
%ネットワークを逐次型で学習させる(適応)
net.adaptParam.passes = 40; %適応関数TRAINSのパラメータ...
net = adapt(net,p,t); %入力ベクトルに対して重みと...
}}
--関数[[ADAPT:http://dl.cybernet.co.jp/matlab/support/man...
---パーセプトロンのプロパティ設定の際に、適応関数(net.ad...
---&color(red){「連続列全体を通るパス」とは、入力ベクトル...
---適応関数 trains の各ステップの処理のところでプロット命...
-~
#geshi(matlab){{
%ネットワークをバッチ型で学習させる(訓練)
net.trainParam.epochs = 10; %訓練関数TRAINCのパラメータ
%(入力ベクトルを10エポック...
net = train(net,p,t); %学習を開始する
%(入力ベクトルに対して重み...
}}
--関数[[TRAIN:http://dl.cybernet.co.jp/matlab/support/man...
---パーセプトロンのプロパティ設定の際に、訓練関数(net.tr...
---エポックとは、入力ベクトルセット全てを1回とした訓練回...
-&color(red){パフォーマンスの評価と学習の収束について};
~
~
-最後に、学習済みネットワークに入力ベクトルを与え、出力結...
#geshi(matlab){{
%訓練結果を確認
a = sim(net,p) %訓練後のネットワークの各入力ベ...
error = [a - t] %出力がターゲットベクトルと一致...
length(find(error == 0)) / length(t) %正解率を求める
%訓練結果(識別境界)をプロット
figure(1); %figure1ウインドウに描画する
plotpv(p,t);
hold on %上のプロット(入力ベクトル)を...
linehandle=plotpc(net.IW{1},net.b{1}); %分類境界をプロ...
hold off
}}
-訓練関数について
--&color(red){上記のネットワークは、毎回結果が同じ?};
--&color(red){TRAINRを使うと結果がランダムに変わる};
-&pgid(,MATLAB Note/Neural Network Toolbox/多層ネットワー...
***補記 [#k5365376]
-入力ベクトルの特徴量数、サイズが未知の場合
#geshi(matlab){{
%入力ベクトルを指定
p = [ 1 0 0 1 0 0
0 0 0 1 0 1
0 1 1 0 0 0
0 0 0 0 1 0
1 0 1 0 0 1 ]'
%ターゲット(教師データ)を指定
t = [ 1
1
0
0
1 ]'
% 入力ベクトルのサイズを調べる(size(p)の1番目の要素が行...
vectorsize = size(p);
% ネットワークに入力する入力層の要素の範囲を格納する配列...
vectorlength = [];
for count = 1 : 1 : vectorsize(1)
vectorlength = [vectorlength ; min(p(count,:)) max(p...
end
vectorlength
%ネットワークの生成
%2要素(X軸サイズ-2~2、Y軸サイズ-2~2)からなる入力ベク...
net = newp(vectorlength, 1);
}}
-正解率を求めるには
#geshi(matlab){{
length(find(error == 0)) / length(t)
}}
--20071228 追記 : 正解率は 1.00 までいくと過学習のようで...
***二層のパーセプトロン [#l2a21f55]
-多層ネットワークは、線形分離可能な問題しか解けない単層パ...
-単層パーセプトロンでは、XOR構造を学習させることはできま...
-そのため、以下のような入力層ノード2個、中間層ノード2個、...
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/PP_...
-入力値とターゲット(期待する出力、教師情報)を定義します。
#geshi(matlab){{
p = [ 0 1 0 1
0 0 1 1 ]
t = [ 1 0 0 1 ]
}}
-新規にネットワークオブジェクトを宣言して、パーセプトロン...
#geshi(matlab){{
s = [2 1] %[1番目の層のニューロンの数 2番目...
Nl = length(s); %ニューロンの数ベクトル s の列数(...
% ネットワークアーキテクチャ
net = network(1,Nl); %入力層の数1、層の数2 で新...
net.biasConnect = ones(Nl,1); %各層のバイアスの有無(全...
net.inputConnect(1,1) = 1; %第1入力層から1層目(中間...
net.layerConnect = [ 0 0
1 0 ]; %1層目(中間層)から2層目...
net.outputConnect(Nl) = 1; %Nl番目の層(出力層)のネ...
net.targetConnect(Nl) = 1; %Nl番目の層(出力層)のタ...
% 1番目の入力層の要素の範囲
net.inputs{1}.range = [0 1;0 1]; %入力層のノードは2つ(1...
% 1番目の層(出力層)のニューロン数、出力計算用の伝達関数
tf = {'tansig' 'purelin'} %1層目(中間層)=TANSIG、2...
for count = 1 : Nl
net.layers{count}.size = s(count); %count番目...
net.layers{count}.transferFcn = tf{count}; %count番目...
end
% ネットワークのパフォーマンス測定関数
net.performFcn = 'mae' %MAE(平均絶対誤差)
% 1番目の入力層から 1 番目の層(中間層)への重み行列学習...
net.inputWeights{1,1}.learnFcn = 'learnp'; %LEARNP(パ...
% 層どうしの重み行列学習関数、バイアス更新用関数
for count = 1 : 2
net.layerWeights{count,:}.learnFcn = 'learnp'; %count...
net.biases{count}.learnFcn = 'learnp'; %count...
end
% 訓練関数(バッチ型学習と逐次型学習で使用)
net.trainfcn = 'trainlm' %TRAINLM (Levenberg-Marquard...
% 初期化関数
net.initFcn = 'initlay';
for count = 1 : Nl
net.layers{count}.initFcn = 'initnw';
end
net = init(net); %初期化を実行
}}
--逐次型学習関数(net.adaptFcn)は指定していないため、バ...
--訓練関数として、[[TRAINLM:http://dl.cybernet.co.jp/matl...
--バックプロパゲーションの伝達関数は、非線形微分可能な出...
---単層パーセプトロンで使用していた[[ハードリミット伝達関...
---ここでは、中間層に[[正接シグモイド伝達関数:http://dl.c...
-続いて、学習(重みとバイアスの更新)を行います。
#geshi(matlab){{
%ネットワークをバッチ型で学習させる(訓練)
net.trainParam.epochs = 30; %入力ベクトルを30エポック繰...
net = train(net,p,t); %学習開始(入力ベクトルに対...
}}
-最後に、学習済みネットワークに入力ベクトルを与え、出力結...
#geshi(matlab){{
%結果をプロット
p %入力ベクトル
t %ターゲットベクトル
a = sim(net,p) %ネットワークの出力
}}
--XOR構造を学習できていることが分かります。
-&color(red){学習を終えたネットワークの各ノードの重みは、...
ページ名:
既存のページ名で編集する