我建立了一個有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預測','手動預測','真實值');