1

私は matlabニューラル ネットワーク ツールボックスをいじっていましたが、予期しないことがいくつかありました。私の問題は特に、隠れ層がなく、1 つの入力と tansig 伝達関数しかない分類ネットワークにあります。したがって、この分類器は、学習した入力の重みとバイアスによって定義されるある時点で 1D データセットを分割することを期待しています。

まず、与えられた入力 x に対する出力 y を計算する式は、y = f(x*w + b) であり、w は入力の重み、b はバイアスであると考えました。ネットワークの出力を計算するための正しい式は何ですか?

また、データセット全体を特定の値 (+77) だけ変換すると、バイアスや重みに大きな影響があると予想しました。しかし、そうではないようです。データセットの翻訳がバイアスと重みにあまり影響しないのはなぜですか?

これは私のコードです:

% Generate data
p1 = randn(1, 1000);
t1(1:1000) = 1;
p2 = 3 + randn(1, 1000);
t2(1:1000) = -1;
% view data
figure, hist([p1', p2'], 100)

P = [p1 p2];
T = [t1 t2];

% train network without hidden layer
net1 = newff(P, T, [], {'tansig'}, 'trainlm');
[net1,tr] = train(net1, P, T);

% display weight and bias
w = net1.IW{1,1};
b = net1.b{1,1};
disp(w) % -6.8971
disp(b) % -0.2280

% make label decision
class_correct = 0;
outputs = net1(P);
for i = 1:length(outputs)
    % choose between -1 and 1
    if outputs(i) > 0
       outputs(i) = 1;
    else
       outputs(i) = -1;
    end
    % compare
    if T(i) == outputs(i)
        class_correct = class_correct + 1;
    end
end
% Calculate the correct classification rate (CCR)
CCR = (class_correct * 100) / length(outputs);
fprintf('CCR: %f \n', CCR);
% plot the errors
errors = gsubtract(T, outputs);
figure, plot(errors)

% I expect these to be equal and near 1
net1(0)              % 0.9521
tansig(0*w + b)     % -0.4680

% I expect these to be equal and near -1
net1(4)              % -0.9991
tansig(4*w + b)     % -1




% translate the dataset by +77
P2 = P + 77;

% train network without hidden layer
net2 = newff(P2, T, [], {'tansig'}, 'trainlm');
[net2,tr] = train(net2, P2, T);

% display weight and bias
w2 = net2.IW{1,1};
b2 = net2.b{1,1};
disp(w2) % -5.1132
disp(b2) % -0.1556

異なる平均を持つ正規分布を持つ 2 つの母集団で構成される人工データセットを生成しました。これらの母集団をヒストグラムにプロットし、それを使用してネットワークをトレーニングしました。データセット全体の正しく分類されたインスタンスのパーセンテージである正しい分類率を計算します。これは約 92% であるため、分類器が機能していることがわかります。

しかし、私は net1(x) と tansig(x*w + b) が同じ出力を与えると思っていましたが、そうではありません。トレーニング済みネットワークの出力を計算するための正しい式は何ですか?

また、net1 がトレーニングされているデータセットの翻訳バージョン (+77) で net2 がトレーニングされているため、net1 と net2 の重みやバイアスが異なると予想しました。データセットの翻訳がバイアスと重みにあまり影響しないのはなぜですか?

4

1 に答える 1

2

まず、コードは既定の MATLAB 入力前処理をそのまま残します。これは次の方法で確認できます。

net2.inputs{1}

あなたのコードを入れたとき、私はこれを得ました:

    Neural Network Input
              name: 'Input'
    feedbackOutput: []
       processFcns: {'fixunknowns', removeconstantrows,
                    mapminmax}
     processParams: {1x3 cell array of 2 params}
   processSettings: {1x3 cell array of 3 settings}
    processedRange: [1x2 double]
     processedSize: 1
             range: [1x2 double]
              size: 1
          userdata: (your custom info)

processFncsに設定されている重要な部分mapminmax。ドキュメントによると、mapminmax「行の最小値と最大値を [-1 1] にマッピングして行列を処理します」。そのため、入力を任意に「シフト」(再サンプリング)しても効果がありませんでした。

「出力を計算する」とは、ネットワークのパフォーマンスをチェックすることを意味すると思います。これを行うには、最初にデータセットでネットワークをシミュレートし (「参考文献」を参照doc nnet/sim)、関数で「正確性」をチェックしperformます。トレーニング時と同じコスト関数を使用します。

% get predictions
[Y] = sim(net2,T);
% see how well we did
perf = perform(net2,T,Y);

ブームシュッカルーカ。それが役立つことを願っています。

于 2013-06-08T08:26:11.613 に答える