BP神經網絡分類器的設計


 

 

1.BP神經網絡訓練過程論述
  BP網絡結構有3層:輸入層、隱含層、輸出層,如圖1所示。

ip_image002[3]

1 三層BP網絡結構
  3BP神經網絡學習訓練過程主要由4部分組成:輸入模式順傳播(輸入模式由輸入層經隱含層向輸出層傳播計算)、輸出誤差逆傳播(輸出的誤差由輸出層經隱含層傳向輸入層)、循環記憶訓練(模式順序傳播與誤差逆傳播的計算過程反復交替循環進行)和學習結果判別(判定全局誤差是否趨向極小值)。

  下面具體介紹和分析用梯度下降法訓練BP神經網絡,在第1次輸入樣品(1=12……N)進行訓練時各個
  參數的表達及計算方法。
  (1)確定參數。

  1. 輸入向量為X=[x1x2xn]Tn—輸入層單元個數);
  2. 輸出向量Y=[y1y2yq]Tq—輸出層單元個數);
  3. 希望輸出向量O=[o1o2oq]T
  4. 隱含層輸出向量B=[b1b2bp]Tp—隱含層單元個數);
  5. 初始化輸入層至隱含層的連接權值Wj=[wj1wj2wjtwjn]Tj=12p
  6. 初始化隱含層至輸出層的連接權值Wk=[wk1wk2wkjwkp]Tk=12q
      

2)輸入模式順序傳播。

這一過程主要是利用輸入模式求出它對應的實際輸出。

  1. 計算隱含層各神經元的激活值lip_image011[4]
                lip_image013[4]j=1,2,3…p

lip_image015[6]為隱含層單元的閾值

lip_image017[4]為輸出層至隱含層的連接權

  1. 激活函數用S型函數,即:

              lip_image019[4]

這里之所以選S型函數為BP神經網絡神經元的激活函數,是因為它是連續可微分的,而且更接近於生物神經元的信號輸出形式。

 

  1. 計算隱含層j單元的輸出值:

      lip_image021[4]

   閾值lip_image015[7]在學習過程中和權值一樣不斷被修改,閾值的作用反應在函數的輸出曲線上,

ip_image023[3]

                         3 閾值的作用

由圖可見閾值的作用相當於輸出值移了lip_image025[4]個單位。同理可求出輸出端的激活值和輸出值。

  1. 計算輸出層第k個單元的激活值lip_image027[4]

                      lip_image029[4]

lip_image031[4]為隱含層至輸出層的權值

lip_image033[4]輸出層單元閾值

  1. 計算輸出層第k個單元的實際輸出值lip_image035[4]

                      lip_image037[4] t=1,2,3…q

lip_image039[4]S型激活函數。

3)輸出誤差的傳播。

在第(2)步的模式順傳播計算中得到網絡的實際輸出值,當這些實際的輸出值與希望的輸出值不一樣時或者說誤差大於所限定的數值時,就要對網絡進行校正。
輸出層的校正誤差為:

                  lip_image041[4] k=123…q

隱含層各單元的校正誤差為:

                 lip_image043[4]

 

對於輸出層至隱含層連接權和輸出層閾值的校正量為:

                             lip_image045[4]

α為學習系數,α>0

lip_image047[4]為隱含層j單元的輸出。

lip_image049[4]為輸出層的校正誤差。
  

隱含層至輸入層的校正量為:

lip_image051[4]
  lip_image053[4]為隱含層j單元的校正誤差。


  (4)循環記憶訓練。對於BP神經網絡輸入的每一組訓練模式,一般都要經過數百次甚至上萬次的循環記憶訓練,才能使網絡記住這一模式。這種循環記憶訓練實際上就是反復重復上面介紹的輸入模式。
  (5)學習結果的判別。判別的目的主要是檢查輸出誤差是否已經小到可以允許的程度。學習或者說訓練的過程是網絡全局誤差趨向於極小值的過程。
2.BP神經網絡分類器設計
 任務一:2bit異或問題,輸入及其對應的輸出

input=[0 0 ;

      0 1;

      1 0;

      1 1];

output=[0;1;1;0];

2個輸入神經元,2個隱含層神經元,1個輸出層神經元,MATLAB代碼如下:

% % % % % % % % % % % % % % %

% name:bpnet1.m

% function:solve 2bit XOR Problem with a Neural bpnetwork

% input:no

% return:no

% programer:LI Xin

% % % % % % % % % % % % % % %

clear;clc;close all;

sigma=0.01;%精度控制參數

alpha=0.8;%學習率

M=10000;%循環的最大次數

in_num=2; %輸入節點個數

mid_num=2;%隱含層神經元個數

out_num=1;%輸出層神經元個數

input=[0 0 ;

       0 1;

       1 0;

       1 1];

output=[0;1;1;0];

hide_s=zeros(1,mid_num);%隱含層的激活值

hide_o=zeros(1,mid_num);%隱含層的輸出值

delta_h=zeros(1,mid_num);%隱含層各聯結權的修改量組成的向量

sita_h = rand(1,mid_num) ;%隱含層的閾值

sita_o=rand(1,out_num) ;%輸出層閾值

output_o=zeros(1,out_num);%輸出層的輸出值

output_s=zeros(1,out_num);%輸出層的激活值

delta_o=zeros(1,out_num);  %輸出層各聯結權的修改量組成的向量

T=4;%樣本個數

w=rand(in_num,mid_num,'double');%初始化輸入層到隱含層連接權值

v=rand(mid_num,out_num,'double'); %初始化隱含層到輸出層連接權值

E = sigma + 1;

N = 0;

while((E>sigma)&&(N<M))

    N=N+1;

    for t=1:T

       for i=1:mid_num

           hide_s(i)=0;

           for j=1:in_num

               hide_s(i)=hide_s(i)+w(j,i)*input(t,j);

           end

           hide_s(i)=hide_s(i)-sita_h(i);          % 計算隱含層各神經元的激活值hide_s

           hide_o(i)=1.0/(1.0+exp(-hide_s(i)));     %隱含層神經元的輸出值

       end

       for i=1:out_num

           output_s(i)=0;

           for j=1:mid_num

               output_s(i)=output_s(i)+v(j,i)*hide_o(j);

           end

           output_s(i)=output_s(i)-sita_o(i);      %計算輸出層各神經元的激活值output_s

           output_o(i)=1.0/(1.0+exp(-output_s(i))); % 輸出層神經元的輸出值

       end

       for i=1:out_num

           delta_o(i)=output_o(i) * ( 1 - output_o(i) ) * ( output(t,i) - output_o(i) );

                                           %輸出層的校正誤差delta_o=(o-y)y(1-y)

           sita_o(i)=sita_o(i)-alpha*delta_o(i);    %輸出層閾值校正量

       end

       for i=1: mid_num

                            Z = 0;

                            for j=1:out_num

                                     Z = Z+v(i,j) * delta_o(j);

            end

                            delta_h(i) = Z * hide_o(i) * ( 1 - hide_o(i) );  %隱含層的校正誤差

                            sita_h(i) = sita_h(i)-alpha * delta_h(i);      %隱含層閾值校正量

       end

       for i=1: mid_num

                                     for j=1:out_num

                                               v(i,j) = v(i,j) +alpha * hide_o(i) * delta_o(j); %輸出層至隱含層權值校正

                end

       end

       for i=1:in_num

                                     for j=1: mid_num

                                               w(i,j) = w(i,j)+alpha * input(t,i) * delta_h(j); %隱含層至輸入層權值的校正

                end

       end

    end

    E=0;

    for t=1:T

        for i=1:mid_num

                                     hide_s(i) = 0;

                                     for j=1:in_num

                                               hide_s(i) = hide_s(i)+w(j,i) * input(t,j);

                end

                                     hide_s(i) = hide_s(i)-sita_h(i);              %計算隱含層各神經元的激活值hide_s

                                     hide_o(i) = 1.0 / ( 1.0 + exp(-hide_s(i)) );      %隱含層神經元的輸出值

        end

        for i=1: out_num

                                     output_s(i) = 0;

                                     for j=1:mid_num

                                               output_s(i) = output_s(i)+v(j,i) * hide_o(j);

                end

                output_s(i) = output_s(i)-sita_o(i);          %計算輸出層各神經元的激活值output_s

                                     output_o(i) = 1.0 / ( 1.0 + exp(-output_s(i)) );  %輸出層神經元的輸出值

        end

            error = 0;

                            for i=1:out_num

                                     error = error +( output_o(i) - output(t,i)) * ( output_o(i) - output(t,i) );

            end

            E = E +error / 2;

    end

end

str=sprintf('網絡學習%d次結束,誤差為:%d,各層權值如下:',N,E);

disp(str)

disp('輸入層到隱藏層權值:');

for i=1:in_num

    for j=1:mid_num

        str=sprintf('w[%d,%d]=%d',i,j,w(i,j)) ;

        disp(str)

    end

end

disp('隱藏層到輸出層權值:');

for i=1:mid_num

    for j=1:out_num

        str=sprintf('v[%d,%d]=%d',i,j,v(i,j));

        disp(str)

    end

end

disp('對應着樣本實際輸出為:')

for t=1: T

       str=sprintf('%d個樣本',t);

       disp(str)

                   for i=1:mid_num

                            hide_s(i) = 0;

                            for j=1:in_num

                                     hide_s(i) = hide_s(i)+w(j,i) * input(t,j);

            end

                            hide_s(i) = hide_s(i)-sita_h(i);             %計算隱含層各神經元的激活值hide_s

                            hide_o(i) = 1.0 / ( 1.0 + exp(-hide_s(i)) );      %隱含層神經元的輸出值

        end

        for i=1: out_num

                                     output_s(i) = 0;

                                     for j=1:mid_num

                                               output_s(i) = output_s(i)+v(j,i) * hide_o(j);

                end

                output_s(i) = output_s(i)-sita_o(i);         %計算輸出層各神經元的激活值output_s

                                     output_o(i) = 1.0 / ( 1.0 + exp(-output_s(i)) );  %輸出層神經元的輸出值

        end

        disp('輸入樣本')

        disp(input(t,:))

        disp('輸出樣本')

        disp(output_o) 

end     

 

任務二:識別問題,輸入輸出如下:

input=[0 0 0 0 0 0 0 1;

      0 0 0 0 0 0 1 0 ;

      0 0 0 0 0 1 0 0 ;

      0 0 0 0 1 0 0 0 ;

      0 0 0 1 0 0 0 0 ;

      0 0 1 0 0 0 0 0 ;

      0 1 0 0 0 0 0 0 ;

      1 0 0 0 0 0 0 0 ];

output=[0 0 0 0 0 0 0 1;

       0 0 0 0 0 0 1 0 ;

       0 0 0 0 0 1 0 0 ;

       0 0 0 0 1 0 0 0 ;

       0 0 0 1 0 0 0 0 ;

       0 0 1 0 0 0 0 0 ;

       0 1 0 0 0 0 0 0 ;

       1 0 0 0 0 0 0 0 ];

8個輸入神經元,3個隱含層神經元,8個輸出層神經元,詳細代碼與任務一差別不大,在此不再贅述,詳見附件bpnet2.m

3.實驗過程

對於任務一的異或問題,令學習率為0.8,迭代次數上限10000次,精度0.01,寫好代碼后運行結果如下:

網絡學習2054束,9.987865e-03,各層權值如下:

層權值

w[1,1]=-4.319853e+00

w[1,2]=-6.118312e+00

w[2,1]=4.479814e+00

w[2,2]=5.661403e+00

層權值

v[1,1]=-6.512379e+00

v[2,1]=6.853598e+00

對應實際輸:

1個樣

     0     0

    0.0724

2個樣

     0     1

    0.9411

3個樣

     1     0

    0.9128

4個樣

     1     1

0.0605

 

可見其學習后的輸出和期望輸出差距不大。

對於任務二的識別問題,令學習率為0.8,迭代次數上限10000次,精度0.01,寫好代碼后運行結果如下:

網絡學習5786次結束,誤差為:9.998725e-03,各層權值如下:

輸入層到隱含層權值:

w[1,1]=-3.179389e+00

w[1,2]=4.680957e+00

w[1,3]=-2.814682e+00

w[2,1]=5.307254e+00

w[2,2]=3.485574e+00

w[2,3]=5.443434e+00

w[3,1]=-5.120963e+00

w[3,2]=-3.003381e+00

w[3,3]=-2.533489e-01

w[4,1]=1.072151e-01

w[4,2]=-4.017080e+00

w[4,3]=5.120281e+00

w[5,1]=5.281661e+00

w[5,2]=-4.188798e+00

w[5,3]=1.327247e-01

w[6,1]=-4.166501e+00

w[6,2]=3.666821e+00

w[6,3]=4.480010e+00

w[7,1]=4.666180e+00

w[7,2]=4.637388e+00

w[7,3]=-2.178645e+00

w[8,1]=3.595688e-01

w[8,2]=-1.660022e+00

w[8,3]=-5.989204e+00

隱藏層到輸出層權值:

v[1,1]=-7.888675e+00

v[1,2]=7.121264e+00

v[1,3]=-1.422755e+01

v[1,4]=-1.645257e+00

v[1,5]=1.155231e+01

v[1,6]=-8.289016e+00

v[1,7]=8.183556e+00

v[1,8]=1.246045e+00

v[2,1]=6.724860e+00

v[2,2]=3.464005e+00

v[2,3]=-8.313719e+00

v[2,4]=-8.505718e+00

v[2,5]=-8.905993e+00

v[2,6]=4.500327e+00

v[2,7]=5.055143e+00

v[2,8]=-7.146627e+00

v[3,1]=-8.436705e+00

v[3,2]=7.793561e+00

v[3,3]=-2.065419e+00

v[3,4]=1.213004e+01

v[3,5]=-6.566507e-01

v[3,6]=7.878356e+00

v[3,7]=-8.415250e+00

v[3,8]=-1.719139e+01

對應着樣本實際輸出為:

1個樣本

輸入樣本

     0     0     0     0     0     0     0     1

輸出樣本

  Columns 1 through 7

    0.0056    0.0000    0.0275    0.0001    0.0319    0.0000    0.0151

  Column 8

    0.9546

2個樣本

輸入樣本

     0     0     0     0     0     0     1     0

輸出樣本

  Columns 1 through 7

    0.0154    0.0232    0.0000    0.0000    0.0055    0.0000    0.9731

  Column 8

    0.0207

3個樣本

輸入樣本

     0     0     0     0     0     1     0     0

輸出樣本

  Columns 1 through 7

    0.0150    0.0234    0.0028    0.0144    0.0000    0.9735    0.0000

  Column 8

    0.0000

4個樣本

輸入樣本

     0     0     0     0     1     0     0     0

輸出樣本

  Columns 1 through 7

    0.0000    0.0188    0.0000    0.0225    0.9645    0.0000    0.0094

  Column 8

    0.0229

5個樣本

輸入樣本

     0     0     0     1     0     0     0     0

輸出樣本

  Columns 1 through 7

    0.0000    0.0163    0.0236    0.9647    0.0238    0.0178    0.0000

  Column 8

    0.0000

6個樣本

輸入樣本

     0     0     1     0     0     0     0     0

輸出樣本

  Columns 1 through 7

    0.0046    0.0000    0.9598    0.0287    0.0003    0.0054    0.0000

  Column 8

    0.0280

7個樣本

輸入樣本

     0     1     0     0     0     0     0     0

輸出樣本

  Columns 1 through 7

    0.0000    0.9647    0.0000    0.0034    0.0040    0.0110    0.0159

  Column 8

    0.0000

8個樣本

輸入樣本

     1     0     0     0     0     0     0     0

輸出樣本

  Columns 1 through 7

    0.9768    0.0000    0.0130    0.0000    0.0000    0.0210    0.0191

  Column 8

0.0122

 

 

4.實驗總結

可見本次實驗較好的完成了bp神經網絡的建模,在學習率和誤差精度上都達到了要求,通過這次實驗深入的理解了神經網絡的結構和各參數之間的作用,為以后的科研學習打下了一定基礎,對於第二個任務要比第一個任務計算耗時大很多,可見bp神經網絡是收斂速度比較慢。

              


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM