用C語言從頭開始實現一個神經網絡
- 2020 年 8 月 13 日
- AI
字幕組雙語原文:用C從頭實現神經網絡
英語原文:Building Neural Network Framework in C using Backpropagation
翻譯:雷鋒字幕組(Mr.水方子)
在本文中,我們將用C語言從頭開始實現一個基本的神經網絡框架。之所以在C語言中這樣做,是因為大多數庫和其他高級語言(如Python)都抽象出了實現細節。在C語言中實現反向傳播實際上會讓我們更詳細地了解改變權重和偏差是如何改變網絡的整體行為的。
注意:本文假設您了解反向傳播算法背後的數學原理。如果你不熟悉,請參考這個。
我們的目標是建立一個通用的框架,其中的層數和神經元將由用戶根據他的要求指定。因此,我們將從用戶獲得以下輸入來定義我們的神經網絡框架:
1. 層數
2.每層神經元數目
3.學習速率
4.訓練例子
5.輸出標籤
定義層和神經元結構:
一旦我們有了層的數量和每層神經元的數量,我們就可以創建我們的神經網絡的架構。但首先我們必須定義神經元和層的結構。
神經元結構將包含以下參數:
層結構將有許多神經元在該層和一個指針的neuron_t結構。
創建架構:
現在,讓我們使用create_architecture()函數創建我們的神經網絡的體系結構。
在下面的代碼片段中,外部For循環創建層,內部For循環將指定數量的神經元添加到該層。我們也隨機初始化神經元的權值在0到1之間。
訓練的例子:
我們將使用get_input()函數存儲訓練示例:
得到輸出標籤:
我們將使用get_desired_exports()函數存儲輸出標籤
前向傳遞:
第i層第j個神經元的激活與(i−1)第(i−1)層神經元的激活關係為:
注意:σ是激活函數。這裡輸出層使用sigmoid激活函數,隱藏層使用Relu激活函數。
sigmoid函數:
Relu函數:
讓我們實現forward_prop()函數
反向傳遞:
反向傳播的目標是反向傳播錯誤並更新權值以最小化錯誤。這裡,我們將使用均方誤差函數來計算誤差。
權重(dw)和偏差(dbias)的變化是使用成本函數C對網絡中的權重和偏差的偏導數(∂C/ ∂weights和∂C/∂ bias)來計算的。
sigmoid函數的導數:
relu函數的導數:
反向傳播背後的四個基本方程:
讓我們在back_prop()函數中實現這些公式:
更新權重:
在每個epoch中,我們將使用update_weights()函數更新網絡權值和偏差
測試框架:
現在我們已經準備好了所有的部分,我們將驗證框架的工作情況。因此,讓我們創建一個4層的神經網絡,輸入層有2個神經元,第一隱含層有4個神經元,第二隱含層有4個神經元,輸出層有1個神經元。另外,隱藏的和輸出的神經元會有偏差。
現在,我們可以針對不同的邏輯門訓練這個神經網絡,比如XOR, OR等等。在下面的示例中,我們將實現XOR gate。
首先,提供所需的層數和每層神經元的數目:
Enter the number of Layers in Neural Network: 4 Enter number of neurons in layer[1]: 2 Enter number of neurons in layer[2]: 4 Enter number of neurons in layer[3]: 4 Enter number of neurons in layer[4]: 1 |
神經網絡體系結構將根據給定的規範創建:
Created Layer: 1 Number of Neurons in Layer 1: 2 Neuron 1 in Layer 1 created Neuron 2 in Layer 1 created Created Layer: 2 Number of Neurons in Layer 2: 4 Neuron 1 in Layer 2 created Neuron 2 in Layer 2 created Neuron 3 in Layer 2 created Neuron 4 in Layer 2 created Created Layer: 3 Number of Neurons in Layer 3: 4 Neuron 1 in Layer 3 created Neuron 2 in Layer 3 created Neuron 3 in Layer 3 created Neuron 4 in Layer 3 created Created Layer: 4 Number of Neurons in Layer 4: 1 Neuron 1 in Layer 4 created |
所有的權值將在0和1之間隨機初始化。
接下來,提供學習率和輸入訓練示例。下面是XOR邏輯門的真值表。
我們將以上4個輸入作為神經網絡的訓練實例。
Enter the learning rate (Usually 0.15): 0.15 Enter the number of training examples: 4 Enter the Inputs for training example[0]: 0 0 Enter the Inputs for training example[1]: 0 1 Enter the Inputs for training example[2]: 1 0 Enter the Inputs for training example[3]: 1 1 |
輸出標籤:
Enter the Desired Outputs (Labels) for training example[0]: 0 |
Enter the Desired Outputs (Labels) for training example[1]: 1 Enter the Desired Outputs (Labels) for training example[2]: 1 Enter the Desired Outputs (Labels) for training example[3]: 0 |
我們的神經網絡將在這4個訓練實例上訓練20000個epoch。現在,測試訓練好的神經網絡:
Enter input to test: 0 0 Output: 0 Enter input to test: 0 1 Output: 1 Enter input to test: 1 0 Output: 1 Enter input to test: 1 1 Output: 0 |
總結:
這是一個神經網絡框架的基本實現,目的是了解神經網絡的基本原理和反向傳播算法。可以通過實現各種損失函數和提供保存/裝載重量來增強代碼。
雷鋒字幕組是由AI愛好者組成的志願者翻譯團隊;團隊成員有大數據專家、算法工程師、圖像處理工程師、產品經理、產品運營、IT諮詢人、在校師生;志願者們來自IBM、AVL、Adobe、阿里、百度等知名企業,北大、清華、港大、中科院、南卡羅萊納大學、早稻田大學等海內外高校研究所。
了解字幕組請聯繫微信:tlacttlact
轉載請聯繫字幕組微信並註明出處:雷鋒字幕組
雷鋒網雷鋒