2

次のコードを実行すると

     input=[0 0; 0 1; 1 0; 1 1];  % OR example

     input=transpose(input);
     target=[0;1;1;1];

     target=transpose(target);

     net=newff(input,target,5,{'logsig','logsig'});

     net=train(net,input,target);

     result=sim(net,input);

     % result is like this

     %0.5000 1.000 1.000 1.000

     %but want my output as 

     %0 1 1 1

ネットワークのパフォーマンスを見ると0.125です。しかし、私はそれを0.0001にしたい。目標を 1e-30 に下げようとしても、パフォーマンスは低下せず、代わりに向上します。このネットワークのパフォーマンスを改善するための解決策を教えてください。これはサンプル コードにすぎません。この助けを借りて、419 の入力と 2 つの出力を持つ大規模なネットワークを構築する必要があります。

私の疑いを晴らしてください。

前もって感謝します。

4

1 に答える 1

3

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]

于 2013-07-29T17:24:38.780 に答える