我是MATLAB新手,我想驗證在C中的在線反傳(BP)代碼。我需要測試代碼是否與完全相同的網絡設置相同。網絡設置是原始BP(針對異或問題)2個輸入,2個隱藏節點和1個輸出。使用的學習速率設置爲0.01,動量爲0.95,停止標準爲0.01,性能測量爲sse。曆元爲1(因爲我想檢查從正向傳播到向後傳播準確計算,以便驗證網絡恰好設置一樣C) 這裏是我的代碼:在神經網絡中發生了什麼神經網絡中的反向傳播在Matlab中反向傳播
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 = sim(net,input);使用train和sim進行手動計算導致0.609299823823181而不是0.818483286935909。
3)與上面的matlab代碼相比,C中的粗前向傳播有什麼不同?
請幫助我。
感謝Niclas,我看過適應函數,我猜newff函數初始化不同的權重(在newff init和reinit激活函數期間)2)我也相信使用批量訓練進行traingd。 (1)*輸入(1)+ wih(2)*輸入(2)+ wihb(1));但是當我檢查i = 1:size(輸入,2) hidden(1)= logsig(wih (2)= logig(wih(3)* input(1)+ wih(4)* input(2)+ wihb(2)); (1)* who(1)+ hidden(2)* who(2)+ whob(1)); end)3)C代碼如下 –