BP神經網絡-- C語言實現 下

轉自:BP神經網絡-- C語言實現 下,保存在此以學習。

上一篇  C語言實現上 中介紹了程序實現時定義的一些數據結構、程序執行的流程以及 程序的基本骨架(詳情見 C語言實現上)。留下了兩個關鍵函數computO(i) 和 backUpdate(i) 沒有分析實現,參數 i 代表的是第 i 個樣本,本篇我們一起來分析下這兩個函數的實現。

BP神經網絡輸出

      函數 computO(i) 負責的是通過BP神經網絡的機制對樣本 i 的輸入,預測其輸出。回想BP神經網絡的基本模型(詳情見 基本模型)對應的公式(1)還有 激活函數對應的公式(2):

BP神經網絡    

BP神經網絡

      

      在前篇設計的BP神經網絡中,輸入層與隱藏層權重對應的數據結構是w[Neuron][In],隱藏層與輸出層權重對應的數據結構是v[Out][Neuron],並且數組 o[Neuron] 記錄的是神經元通過激活函數對外的輸出,BP神經網絡預測的樣本結果保存在OutputData[Out]中。由此,就可以得到以下實現的參考代碼:

複製代碼
void computO(int var){

    int i,j;
    double sum,y;
        
        /*
            神經元輸出
         */
    
        for (i = 0; i < Neuron; ++i){
        sum=0;
        for (j = 0; j < In; ++j)
            sum+=w[i][j]*d_in[var][j];
        o[i]=1/(1+exp(-1*sum));
    }

/*  隱藏層到輸出層輸出 */

    for (i = 0; i < Out; ++i){
        sum=0;
        for (j = 0; j < Neuron; ++j)
            sum+=v[i][j]*o[j];

        OutputData[i]=sum;
    }    
}
複製代碼

 

BP神經網絡的反饋學習

         函數 backUpdate(i) 負責的是將預測輸出的結果與樣本真實的結果進行比對,然後對神經網絡中涉及到的權重進行修正,也這是BP神經網絡實現的關鍵所在。如何求到對於 w[Neuron][In] 和 v[Out][Neuron] 進行修正的誤差量便是關鍵所在!誤差修正量的求法在基本模型一文中數學分析部分有解答,具體問題具體分析,落實到我們設計的這個BP神經網絡上來說,需要得到的是對w[Neuron][In] 和 v[Out][Neuron] 兩個數據進行修正誤差,誤差量用數據結構 dw[Neuron][In]  和  dv[Out][Neuron]  來進行存儲。那麼來分析下這兩個修正誤差量是什麼樣的?推導的思路與基本模型中推導誤差量的一致,這裏僅列出對具體對於我們設計的BP神經網絡中的數學推導過程:

   

BP神經網絡

      如果你不想知道推導過程,那麼只需要看上面中的兩個 所以(有三個點的地方) 的內容,就可以知道所需要的誤差量是什麼樣的了;如果想要想弄明白的話,或許需要自己在稿子上畫畫看推導推導。到這裏完成了數學推導,實現的代碼就很容易寫了。在具體實現對誤差修改中,我們再加上學習率,並且對先前學習到的修正誤差量進行繼承,直白的說就是都乘上一個0到1之間的數,具體的見如下實現參考代碼:

#define A  0.2
#define B  0.4
#define a  0.2
#define b  0.3
複製代碼
void backUpdate(int var)
{
    int i,j;
    double t;
    for (i = 0; i < Neuron; ++i)
    {
        t=0;
        for (j = 0; j < Out; ++j){
            t+=(OutputData[j]-d_out[var][j])*v[j][i];

            dv[j][i]=A*dv[j][i]+B*(OutputData[j]-d_out[var][j])*o[i];
            v[j][i]-=dv[j][i];
        }

        for (j = 0; j < In; ++j){
            dw[i][j]=a*dw[i][j]+b*t*o[i]*(1-o[i])*d_in[var][j];
            w[i][j]-=dw[i][j];
        }
    }
}
複製代碼

  

       好了,至此BP神經網絡的C語言實現就全部完成了。最後,我們可以測試下BP神經網絡的運行。我這裏是這樣給出數據的,兩個輸入a、b(10以內的數),一個輸出 c,c=a+b。換句話說就是教BP神經網絡加法運算。在 45個神經元,820個訓練樣例,樣本平均誤差小於0.01時完成訓練(學習率等見參考代碼)的條件下,最後預測 (6,8),(2.1,7),(4.3,8)實際輸出結果如下:

      最後附上參考實現代碼,以及實驗訓練時的數據、和神經元信息。(本示例 僅爲BP神經網絡實現的 簡單DEMO,若實際使用還需多加考慮!!!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章