FPGA機器學習之BP神經網路4

2022-08-03 09:39:10 字數 4709 閱讀 5039

神經網路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.使...