神經網路3,主要是一些用matlab自帶函式來完成神經網路的例子。matlab自帶的函式,都是經過優化,而且函式的實現過程是被封裝好了點。效能也是非常的優良了。可是自己寫出來的bp神經網路可能就不能達到那樣的效果。要想在fpga上實現,或者要知道內部的運**況,還是要自己寫才行。
這個是自己寫的bp神經網路(網上下的)。
clear all
clcinputnums=3; %輸入層節點
outputnums=3; %輸出層節點
hidenums=10; %隱層節點數
maxcount=20000; %最大迭代次數
samplenum=10; %乙個計數器,無意義
precision=0.001; %預設精度
yyy=1.3; %yyy是幫助網路加速走出平坦區
alpha=0.01; %學習率設定值
a=0.5; %bp優化演算法的乙個設定值,對上組訓練的調整值按比例修改 字串9
error=zeros(1,maxcount+1); %error陣列初始化;目的是預分配記憶體空間
errorp=zeros(1,samplenum); %同上
v=rand(inputnums,hidenums); %3*10;v初始化為乙個3*10的隨機歸一矩陣; v表輸入層到隱層的權值
deltv=zeros(inputnums,hidenums); %3*10;記憶體空間預分配
dv=zeros(inputnums,hidenums); %3*10;
w=rand(hidenums,outputnums); %10*3;同v
deltw=zeros(hidenums,outputnums);%10*3
dw=zeros(hidenums,outputnums); %10*3
%samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255]; %3*3;指定輸入值3*3(實為3個向量)
%expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11]; %3*3;期望輸出值3*3(實為3個向量),有導師的監督學
samplelist=[0.8,0.8,-0.8;0.8,-0.8,0.8;-0.8,0.8,0.8;-0.8,0.8,0.8;-0.8,-0.8,-0.8;-0.8,0.8,-0.8;0.8,-0.8,-0.8;0.8,0.8,0.8;-0.8,0.8,0.8;-0.8,0.8,-0.8];
expectlist=[0.5,0.5,0.1; 0.5,0.1,0.5; 0.1,0.5,0.5; 0.1,0.5,0.5; 0.1,0.1,0.1 ; 0.1,0.5,0.1; 0.5,0.1,0.1; 0.5,0.5,0.5; 0.1,0.5,0.5; 0.1,0.5,0.1];
count=1;
while (count<=maxcount) %結束條件1迭代20000次
c=1;
while (c<=samplenum)
for k=1:outputnums
d(k)=expectlist(c,k); %獲得期望輸出的向量,d(1:3)表示乙個期望向量內 的值
endfor i=1:inputnums
x(i)=samplelist(c,i); %獲得輸入的向量(資料),x(1:3)表乙個訓練向量
end%for ward();
for j=1:hidenums
net=0.0;
for i=1:inputnums
net=net+x(i)*v(i,j);%輸入層到隱層的加權和∑x(i)v(i)
endy(j)=1/(1+exp(-net)); %輸出層處理f(x)=1/(1+exp(-x))單極性sigmiod函式
endfor k=1:outputnums
net=0.0;
for j=1:hidenums
net=net+y(j)*w(j,k);
endif count>=2&&error(count)-error(count+1)<=0.0001
o(k)=1/(1+exp(-net)/yyy); %平坦區加大學習率
else
o(k)=1/(1+exp(-net)); %同上
endend
%bpe rror(c)反饋/修改;
errortmp=0.0;
for k=1:outputnums
errortmp=errortmp+(d(k)-o(k))^2; %第一組訓練後的誤差計算
enderrorp(c)=0.5*errortmp; %誤差e=∑(d(k)-o(k))^2 * 1/2
%end
%bac kward();
for k=1:outputnums
yitao(k)=(d(k)-o(k))*o(k)*(1-o(k)); %輸入層誤差偏導 字串5
endfor j=1:hidenums
tem=0.0;
for k=1:outputnums
tem=tem+yitao(k)*w(j,k); %為了求隱層偏導,而計算的∑
endyitay(j)=tem*y(j)*(1-y(j)); %隱層偏導
end%調整各層權值
for j=1:hidenums
for k=1:outputnums
deltw(j,k)=alpha*yitao(k)*y(j); %權值w的調整量deltw(已乘學習率)
w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%權值調整,這裡的dw=dletw(t-1),實際是對bp演算法的乙個
dw(j,k)=deltw(j,k); %改進措施--增加動量專案的是提高訓練速度
end
endfor i=1:inputnums
for j=1:hidenums
deltv(i,j)=alpha*yitay(j)*x(i); %同上deltw
v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);
dv(i,j)=deltv(i,j);
endend
c=c+1;
end%第二個while結束;表示一次bp訓練結束
double tmp;
tmp=0.0;
for i=1:samplenum
tmp=tmp+errorp(i)*errorp(i);%誤差求和
endtmp=tmp/c;
error(count)=sqrt(tmp);%誤差求均方根,即精度
if (error(count)
error(maxcount+1)=error(maxcount);
p=1:count;
pp=p/50; %方便顯示用的
plot(pp,error(p),'-'); %顯示誤差
xce=[0.7,-0.9,0.8];
for j=1:hidenums
net=0.0;
for i=1:inputnums
net=net+xce(i)*v(i,j);%輸入層到隱層的加權和∑x(i)v(i)
endy(j)=1/(1+exp(-net)); %輸出層處理f(x)=1/(1+exp(-x))單極性sigmiod函式
endfor k=1:outputnums
net=0.0;
for j=1:hidenums
net=net+y(j)*w(j,k);
endo(k)=1/(1+exp(-net));
endo
這個只是我其中乙個,測試過程的matlab例項。其實在很多的**裡面,都描述了,bp神經網路的不足。有麻痺現象,就是反饋的資料變的很小了(反饋的調整加權值)和收斂到區域性最小值就不在收斂了。
%if count>=200 && count <400 %也沒有很大的效果
% alpha=1;
% elseif count>=400 && count <1000
% alpha=7;
%elseif count>=1000
% alpha=10;
%else
% alpha=0.08;
%end
alpha 是學習速率嘛:如果學習率高的話,可以做到快速收斂,有可能也會引起收斂到區域性最小值時的**。所以,可以考慮,前期學習率大,讓它快速收斂,然後後期學習率小些,避免在最小值附近**,無法收斂。
% if y(j) <=0.01
% y(j)=0.01;
% elseif y(j) >=0.99
% y(j)=0.99;
% else
% y(j)=y(j);
% end
這一段,關於這2段是放在程式的什麼地方嘛。自己感覺一下吧。其實這一段程式是為了防止,反饋係數變的很小,如果反饋基本為0的話,調整很多次也不會有效果了。所以,我把資料限定一下,(這個好像是函式限定)。不好意思,不怎麼記得了。找不到了。
無論是自己的除錯,修改。還是看很多改進的**。最終我都沒有除錯出乙個比較好的結果。改進的效果也不是很明顯。沒有最終版本。
關於計畫的fpga實現,不好意思。matlab程式,測試了很多,還有很多沒測試,改進的。所以還沒有輪到那一步。後來就沒有時間和精力了。也沒有完成。好幾個月前了。
我能力有限,但是我努力的分享,努力的學習。希望能更多的幫助各位。也希望各位能夠努力。
FPGA 機器學習之BP神經網路2
來個小例子講述一下,過程。apf 是0.9 af是0.1 為什麼用0.9,用0.1 主要是因為1和0.在計算過程中,會有計算隱患 可能遇到0,就計算不下去等情況 a0 1 1.78 a0 2 1.14 也就是第一組資料。輸出a2 0.9 最後我們要進行多次的迭代和優化,優化的呢?就是w1,和w2.使...
FPGA 機器學習之BP神經網路3
上一遍寫到了,公式,或者是一下關於bp神經網路的內容的語言描述。下面就要開始,進行深度點的分析。clcclear p 1 0.1 1 t 0.96 0.577 0.0729 0.377 0.641 0.66 0.461 0.1336 0.201 0.434 0.5 0.393 0.1647 0.09...
FPGA 機器學習之BP神經網路2
來個小例子講述一下,過程。apf 是0.9 af是0.1 為什麼用0.9,用0.1 主要是因為1和0.在計算過程中,會有計算隱患 可能遇到0,就計算不下去等情況 a0 1 1.78 a0 2 1.14 也就是第一組資料。輸出a2 0.9 最後我們要進行多次的迭代和優化,優化的呢?就是w1,和w2.使...