MATLAB ソリューション
問題は、選択した隠れ層と出力層のメンバーシップ関数 、logsig
および選択した入力とターゲットの範囲 にあります[0, 1]
。MATLAB にアクセスして と入力logsig(0)
すると、 の答えが得られます0.5
。基本的に、隠れ層と出力層の両方で を使用することにより、ケース ( の入力)logsig
に対して非表示層から非常に少数の数値を取得することになり、これにより のネットワーク出力が得られます。これには 2 つの方法があります。False
[0 0]
logsig(0) = 0.5
最初の方法
出力層に使用purelin
し、使用している既存のトレーニング例を複製して、いくつかのトレーニング例を追加します。これにより、出力が隠れ層の出力の線形結合になることが保証されます。
input = repmat(input, 1, 5); % make more input data
target = repmat(target, 1, 5); % make more target data
net = newff(input, target, 5, {'logsig', 'purelin'}); % note the output tf 'purelin'
% Proceed as before.
非表示層に渡す[0 0]
と、非表示層から非常に小さな数値が得られ、これらの小さな数値の線形結合により、 に近い値が得られます0
。
2番目の方法
すべての入力とターゲットを[-1, 1]
範囲ではなく範囲にスケーリングし[0, 1]
ます。これにより、基本的に、トレーニング関数がlogsig
以前のように上半分だけではなく、in トレーニングの全範囲を使用できるようになります。ここで、上記と同様に、トレーニング用の追加データを作成する必要があります。
input = [-1 -1; -1 1; 1 -1; 1 1]'; % note the apostrophe (') takes the transpose of the matrix
target = [-1 1 1 1]; % no transpose needed
input = repmat(input, 1, 5); % make more input data
target = repmat(target, 1, 5); % make more target data
net = newff(input, target, 5, {'logsig', 'logsig'}); % note the output tf 'logsig'
% Proceed as before.
これらの方法の両方で、私が探していた結果が得られました。
注:一般に、データをコピーするだけでは、データ セットのサイズを大きくすることはできません。この場合、データセットにはOR回路への可能な入力の全母集団が含まれているため、うまくいくと思います。一般に、オーバーフィッティングが発生する可能性があるため、コピーするだけでなく、それ以上のことを行う必要があります。何をしなければならないかは、使用しているデータの種類によって異なります。たとえば、画像認識を行っている場合、画像に歪みを追加できます。パーツを拡大したり、画像を歪めたりすることはできますが、ランダム ノイズは追加できません。アイデアは、「実生活」の例をエミュレートすることです。
Octave Solution (より直感的なようです)
基本的に無料でオープンソースの MATLAB バージョンである Octave をお持ちの場合は、nnet
以下のパッケージを使用して目的のネットワークを生成できます。nnet
パッケージは、各入力の範囲の行列を定義する以前の (廃止された) MATLAB 構文 ( Pr
) を使用し、次に各層のノード数のベクトル( ) を使用することに注意してくださいSs
。
Pr = [0 1; 0 1];
Ss = [2 5 1];
net = newff(Pr, Ss, {'purelin', 'logsig', 'purelin'});
net = train(net, input, target);
result = sim(net, input)
元の入力ベクトルとターゲット ベクトルを[0 1]
範囲内で使用したところ、結果は、期待していたものに[-1.7e-16, 1, 1, 1]
非常に近いものになりました。[0 1 1 1]