私は MATLAB の初心者です。C のオンライン逆伝播 (BP) コードを検証したいと考えています。コードが同じネットワーク設定でまったく同じかどうかをテストする必要があります。ネットワーク設定はオリジナルBP(XOR問題用)2入力、2隠しノード、1出力です。使用される学習率設定は 0.01、モメンタム 0.95 で、停止基準は 0.01、パフォーマンス メジャーは sse です。エポックは1です(ネットワーク設定がCとまったく同じであることを確認するために、順方向伝播から逆方向伝播までの正確な計算を確認したいため)ここに私のコードがあります:
clear all;clc
input = [0 0; 0 1; 1 0; 1 1]';
target = [0 1 1 0]; % p = [-1 -1 2 2; 0 5 0 5]; % t = [-1 -1 1 1];
state0 = 1367;
rand('state',state0)
net = newff(input,target,2,{},'traingd');
net.divideFcn = '';
%set max epoh, goal, learning rate, show stp
net.trainParam.epochs =1;
net.trainParam.goal = 0.01;
net.performFcn ='sse';
net.trainParam.lr = 0.01;
net.adaptFcn=' ';
net.trainParam.show = 100;
net.trainparam.mc = 0.95;
net.layers{1}.transferFcn = 'logsig';
net.layers{2}.transferFcn = 'logsig';
wih = net.IW{1,1};
wihb= net.b{1,1};
who = net.LW{2,1};
whob = net.b{2,1};
%Train
net = train(net,input,target); %adapt
y= sim(net,input);
e=target-y;
perf = sse(e)
実行後、y(1)が0.818483286935909であることがわかりました.0.609299823823181である手動カウントとは異なります(計算で再確認==>
for i=1:size(input,2)
hidden(1) = logsig( wih (1)*input(1) + wih(2)*input(2) + wihb(1) );
hidden(2) = logsig( wih (3)*input(1) + wih(4)*input(2) + wihb(2) );
out(i) = logsig( hidden(1)*who(1) + hidden(2)*who(2) + whob(1) );end )
私の質問は: 1) 元の MATLAB は traingd を使用していますか? 2) 本当に net = train(net,input,target); とは何ですか? y= シム (ネット、入力); 手動計算では、train と sim を使用して 0.818483286935909 ではなく 0.609299823823181 が得られました。
3) 上記の matlab コードと比較して、C での私の粗雑な順伝播との違いは何ですか?
助けてください。