上一篇文章中用BP神經網絡解決了一個簡單的分類問題,接着我又嘗試着試驗了一下用BP神經網絡去逼近正弦函數。網絡的結果設計如下圖所示。

網絡中設定輸入層與輸出層均為一個神經元,并且考慮到正弦函數的值域分布情況,我這一次在輸出層中的激活函數并沒有使用以前常用的sigmod函數,而是采用了線性函數y = x
具體實作代碼如下所示
clc,clear
Data = -3:0.01:3;
xsize = size(Data);
datasize = xsize(2);
Value = zeros(1,datasize);
for i = 1:datasize
Value(i) = sin(Data(i));
end
hidesize = 10;
W1 = rand(hidesize,1);%輸入層與隐含層之間的權重
B1 = rand(hidesize,1);%隐含層神經元的門檻值
W2 = rand(1,hidesize);%隐含層與輸出層之間的權重
B2 = rand(1,1);%輸入層神經元的門檻值
yita = 0.005;
loop = 5000;
E = zeros(1,loop);%誤差随疊代次數的變化
Y = zeros(1,datasize);%模型輸出的結果
for loopi = 1:loop
tempsume = 0;
for i = 1:datasize
x = Data(i);%輸入層輸入資料
hidein = x*W1-B1;%隐含層的輸入資料
hideout = zeros(hidesize,1);%隐含層的輸出資料
for j = 1:hidesize
hideout(j) = sigmod(hidein(j));
end
y = W2*hideout-B2;%輸出
Y(i) = y;
e = y-Value(i);%誤差
%回報,修改參數
dB2 = -1*yita*e;
dW2 = e*yita*hideout';
dB1 = zeros(hidesize,1);
for j = 1:hidesize
dB1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*(-1)*e*yita;
end
dW1 = zeros(hidesize,1);
for j = 1:hidesize
dW1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*x*e*yita;
end
W1 = W1-dW1;
B1 = B1-dB1;
W2 = W2-dW2;
B2 = B2-dB2;
tempsume = tempsume + abs(e);
end
E(loopi) = tempsume;
if mod(loopi,100)==0
loopi
end
end
當疊代次數為500次時,逼近效果如下所示
而當疊代次數為5000次時的逼近效果如下圖所示,我們可以看到此時的效果已經很好了。
而總誤差随疊代次數的變化曲線則如下圖所示
--------------------------------------補充----------------------------------------------
有些同志說MATLAB提示沒有sigmod函數。這個sigmod函數其實就是那個常用的激活函數
在MATLAB中建一個這樣的函數就可以了
function [ y ] = sigmod( x )
% 激活函數Sigmod,用于神經網絡
y = 1/(1+exp(-x));
end
如有不當之處,歡迎通過QQ進行深入交流,同時也歡迎通過微信打賞的方式對部落客進行支援。