天天看點

Matlab 自己根據BP網絡的權值和閥值算出來的值為何和調用sim得到的不一樣?

我建立了一個有1個隐層(10個神經元) 輸入向量11 輸出向量11 隐層輸出層轉移函數分别**‘tansig’,‘purelin’** 的簡單BP神經網絡用來拟合y = sinx

為了弄清楚其拟合結果的計算公式 将這個net訓練後 我根據其權值和閥值

根據 y0_by_hand = purelin( w2 * tansig(w1*x0+b1) + b2) 這個式子

得到手動求出的預測值。

然後和 y0 = sim(net,x0) 對比

發現y0和y0_by_hand的值不相同

這是為何呢?

是式子寫錯了 還是 庫函數sim的式子不是最初定義的 y=f2(W2*f1(W1p+b1)+b2)

麻煩了解的前輩們幫忙回答一下 謝過

clc, clear
P = rand(1,50)*2*pi;  %訓練集
T = sin(P);        %預測集
[p,ps_input] = mapminmax(P,0,1);  %歸一化
[t,ps_out] = mapminmax(T,0,1);
net = newff(p,t,10,{'tansig','purelin'},'trainlm');  %1個隐層 10個神經元  輸入向量1*1  輸出向量1*1 隐層輸出層轉移函數分别'tansig','purelin' 

net = train(net,p,t); 

 %% 用工具箱函數進行預測
 
x0 = 0:0.01:2*pi;  
x0 = mapminmax('apply',x0,ps_input);
y0 = sim(net,x0);
y0 = mapminmax('reverse',y0,ps_out);

%% 手動預測
w1 = net.iw{1};  %輸入層和隐層連接配接權   10*1
w2 = net.lw{2,1}; %隐層和輸出層連接配接權  1*10
b1 = net.b{1};  %隐層閥值向量    10*1
b2 = net.b{2}; %輸出層閥值向量   1*1

%% 結果: 手動計算結果不等于庫函數的結果?
y0_by_hand =   purelin(w2*tansig(w1*x0+b1)+b2);  
y0_by_hand =  mapminmax('reverse',y0_by_hand,ps_out);

x0 = mapminmax('reverse',x0,ps_input);
plot(x0,y0,'-r',x0,y0_by_hand,'-b',x0,sin(x0),'-k');
legend('sim預測','手動預測','真實值');

 



           
Matlab 自己根據BP網絡的權值和閥值算出來的值為何和調用sim得到的不一樣?

繼續閱讀