2016-05-25 39 views
0

我正在寫這個代碼用於學習ANN(多層反向傳播)的過程,但是學習的結果非常糟糕,它在任何時候都不是1我知道我們不能提供任何保證讓學習成功,但我想知道我是否在此代碼中出現錯誤,或者如果我可以使這些步驟具有更高的性能。在Matlab中學習ANN(多層反向傳播)

步驟:

1-上傳我的數據集

2-選擇從225 170行的學習和其餘50行測試(隨機地)

3-創建用於輸入權重和隱藏層隨機和1之間的0

4- -1之間,用於隱藏層和輸出層創建偏置隨機和1

5-找到輸出的每一行的每個輸出

6-查找誤差然後在每次迭代

8-每個隱藏層

7-更新權重和偏置陣列計算平方誤差(MSE)的總和在每次迭代。

每個輸出總是在0.2到0.5之間的結果也不適用於所需的輸出。 這是什麼在我的邏輯或在我的代碼在這裏可能的錯誤!

注: 170行(225行與108列,並用25個結果如類設定我使用的數據)用於學習 55行測試

2- 50000次迭代

1-

3-學習率0.3

4-動量= 0.7

5-隱藏層NE。沒有= 90

代碼:

%Initialize the weight matrices with random weights 

V = rand(inlayer,hlayer); % Weight matrix from Input to Hidden between [0,1] 

W = rand(hlayer,olayer); % Weight matrix from Hidden to Output between [0,1] 

%Initialize the theta matrices for hidden and output layers 
Thetahidden = randi(1,hlayer); 
Thetaoutput = randi(1,olayer); 

for i=1:iteration 


for j=1:170 % depends on training data set 
    %This for output between input-hidden 
    for h=1:hlayer % depends on neuron number at hidden layer 
     sum = 0; 
     for k=1:108 % depends on column number 
      sum = sum + (V(k,h)* trainingdata(j,k)); 
     end 
     H(h) = sum + Thetahidden(h); 
     Oh(h) = 1/(1+exp(-H(h))); 
    end 
    %This for output between hidden-output 
    for o=1:olayer % depends on number of output layer 
     sumO = 0; 
     for hh=1:hlayer 
      sumO = sumO+W(hh,o)*Oh(hh); 
     end 
     O(o)=sumO + Thetaoutput(o); 
     OO(o) = 1/(1+exp(-O(o))); 

     finaloutputforeachrow(j,o)= OO(o); 

    end 

    % Store real value of real output 
    for r=1:170 
     for o=1:olayer 
      i=outputtrainingdata(r); 
     if i == o 
      RO(r,o)=1; 
     else 
      RO(r,o)=0; 
     end 
     end 
    end 


    sumerror =0; 


    % Compute Error (output layer) 
    for errorout=1:olayer 

     lamdaout(errorout) = OO(errorout)*(1-OO(errorout))*(RO(j,errorout)-OO(errorout)); 
     errorrate = RO(j,errorout)-OO(errorout); 
     sumerror = sumerror+(errorrate^2); 
     FinalError(j,errorout) = errorrate; 
    % Compute Error (hidden layer) 
    ersum=0; 
    for errorh=1:hlayer 
     ersum= lamdaout(errorout)*W(errorh,errorout); 
     lamdahidden(errorh)= Oh(errorh)*(1-Oh(errorh))*ersum; 
    end 
    FinalSumError(j) = (1/2)*sumerror; 
    end 

    %update weights between input and hidden layer 
    for h=1:hlayer 
     for k=1:108 
      deltaw(k,h) = learningrate*lamdahidden(h)*trainingdata(j,k); 
      V(k,h) = (m*V(k,h)) + deltaw(k,h); 
     end 
    end 

    %update weights/Theta between hidden and output layer 
    for h=1:hlayer 
     for outl=1:olayer 
      %weight 
      deltaw2(h,outl) = learningrate * lamdaout(outl)*Oh(h); 
      W(h,outl)= (m*W(h,outl))+deltaw2(h,outl); 

     end 
    end 

    for h=1:hlayer 
      %Theta-Hidden 
      deltaHiddenTh(h) = learningrate * lamdahidden(h); 
      Thetahidden(h) = (m*Thetahidden(h)) + deltaHiddenTh(h); 
    end 

    for outl=1:olayer 

      %Theta-Output 
      deltaOutputTh(outl) = learningrate * lamdaout(outl); 
      Thetaoutput(outl) = (m*Thetaoutput(outl)) + deltaOutputTh(outl); 
    end 





end 


end 

回答

1

有很多影響神經網絡的性能(和最終的融合)的東西。除了有你的代碼最接近的外觀,並確保該進程是正確編碼,你可能有一些想法,玩耍和思考:

  • 的權重初始化範圍應涉及到網絡將處理have a look here的輸入。是否有理由在[0,1]範圍內的輸入範圍爲[-1,1]?

  • 動量值會對收斂產生巨大影響。嘗試不同的值。

  • 有一種很好的學習過程的感覺是繪製learning curve,即錯誤(MSE在你的情況下)與訓練時期。有健康模式,可以給你一個暗示發生了什麼。

  • 初始權重隨機設置的事實可能會導致(取決於問題的複雜性)不同的收斂點。瞭解這種差異可能有多大是有幫助的:只需要訓練網絡,再次訓練一次並繪製差異。

目前仍然隱藏神經元的數量,以及所有排序,你需要調整它的工作原理之前螺絲,但乍一看,這似乎是你有一個非常複雜的問題(108列和25個結果作爲類)與一小組數據進行訓練(225)。如果是這種情況,也許你需要更多的數據...或者嘗試其他類型的模型,而不是神經網絡。

希望它有幫助,玩得開心!