前言
- 最近在學(xué)習(xí)深度學(xué)習(xí),在編寫Auto Encoder提取隱含層的輸出值時(shí)發(fā)現(xiàn),使用MATLAB中自帶的sim函數(shù)計(jì)算得到的神經(jīng)網(wǎng)絡(luò)輸出值與自己手工計(jì)算的前向傳播輸出值不符合。
- 經(jīng)過查閱后發(fā)現(xiàn)在舊版本中的newff函數(shù),神經(jīng)網(wǎng)絡(luò)輸入值的歸一化以及輸出值的反歸一化是編程者自己寫的,而新版本的newff函數(shù) MATLAB則會(huì)自動(dòng)幫我們完成歸一化與反歸一化。這意味著,如果手工計(jì)算用新版本newff函數(shù)訓(xùn)練出來的BP神經(jīng)網(wǎng)絡(luò),則需要進(jìn)行手工的歸一化與反歸一化。
clear
clc
% 輸入數(shù)據(jù)
X = [1 2 3;2 3 4;3 4 5;4 5 6];
% X = [1 2 3;
% 2 3 4;
% 3 4 5;
% 4 5 6];
% 期望歸一化到[-1, 1]區(qū)間中,即
% normX = [-1 0 1;
% -1 0 1;
% -1 0 1;
% -1 0 1];
Y = X;
% 創(chuàng)建一個(gè)4個(gè)輸入神經(jīng)元,2個(gè)隱含層神經(jīng)元,4個(gè)輸出神經(jīng)元的BP神經(jīng)網(wǎng)絡(luò)
net = newff(X, Y, 2); % 新版本newff函數(shù)
% net = newff(minmax(X), [2 4], {'tansig', 'purelin'}); % 舊版本newff函數(shù)
% 設(shè)置訓(xùn)練數(shù)據(jù)集占原有數(shù)據(jù)集的百分比
net.divideParam.trainRatio = 1;
% 訓(xùn)練
net = train(net, X, X);
% 仿真,看結(jié)果
net(X)
% 歸一化到[-1 1]區(qū)間,
[normX, PS] = mapminmax(X);
% 為了測(cè)試我們拿第一個(gè)數(shù)據(jù)進(jìn)行手工前向計(jì)算
x = normX(:, 1);
% 計(jì)算隱含層輸出值
z1 = netsum(net.iw{1} * x, net.b{1})
a1 = tansig(z1)
% 計(jì)算輸出層輸出值
z2 = netsum(net.lw{2} * a1, net.b{2})
a2 = purelin(z2)
% 反歸一化
y = mapminmax('reverse', a2, PS);
disp(y);
disp(Y(:, 1));
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。