首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 從零手寫 BP 神經網絡:完整訓練與推理代碼解析

     編輯:關於C++

網絡架構參數

  • 輸入層:3 個神經元(對應樣本 3 個特徵)。
  • 隱含層:8 個神經元(代碼中 m=8)。
  • 輸出層:1 個神經元(回歸預測)。
  • 激活函數:Sigmoid 變體 out = A / (1 + exp(-net/B)),A=30, B=10。
  • 學習率:權重 COEF=0.0035,閾值 BCOEF=0.001。
  • 動量項:權重更新含 0.5 * 舊增量,權重衰減 0.9 * 舊權重。

核心算法流程

  1. 前向傳播 (netout): 計算隱含層與輸出層加權和,減去閾值,經激活函數得輸出。
  2. 誤差計算 (calculdiffer): 單樣本均方誤差 0.5*(out - target)²。
  3. 反向傳播 (calculd): 輸出層誤差項 δ = (out-target) * f'(net);隱含層誤差項累加下層權重×誤差項,再乘激活函數導數。
  4. 梯度計算 (calculwc, calculbc): 權重增量 Δw = -η * δ * in + α * Δw_old;閾值增量 Δb = η_b * δ。
  5. 參數更新 (changew, changb): w = 0.9*w + Δw,b = b + Δb。
  6. 樣本級迭代: 單樣本誤差 > ERROR(0.002) 時重複反向傳播更新,直到滿足精度或達最大輪數。
  7. 全局收斂判斷 (calculis): 所有樣本 MSE < ACCURACY(0.0005) 則停止訓練。

代碼結構優化建議

  • 使用 std::vector/std::array 替代固定大小 C 數組,支持動態網絡結構。
  • 封裝為 class BPNetwork,分離前向、反向、訓練、預測接口。
  • 引入隨機種子初始化(std::mt19937),替代 randomize()。
  • 添加批量訓練、學習率衰減、早停法等現代技巧。
  • 使用 double 而非 float 保證數值穩定性。

樣本數據說明

sample[41][4] 包含 40 個訓練樣本(索引 1-40),每樣本 3 輸入 + 1 目標輸出。測試時手動輸入 3 個特徵值獲取預測結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved