這周工作主要是完成了bp神經網路的復現,使用c++,對整個神經網路有了乙個初步的了解。下面談一下個人收穫與總結。
10.1-10.3完成了整個網路的編寫,由於時間上的考慮,本次程式沒有從零開始,一開始看了別人寫的程式,復現乙個加法,原來只是有神經網路、學習、收斂這些概念,看了別人的程式大致架構發現復現乙個二次函式沒什麼複雜的東西,然後開始自己編寫二次函式的實現即y=x*x。資料的輸入,神經網路的建立,網路訓練、驗證和測試。網路結構單輸入單輸出,單隱層神經網路,對於復現基本函式,單隱層神經網路可以實現。輸入輸出節點乙個,隱含層節點10個(依據輸入和輸出節點數再加乙個常數),樣本50個,0.01-0.99中的奇數,驗證集0.02-0.98中的偶數(c++樣本設定有些麻煩,可能樣本不按規律最後效果會更好),測試集9個(0.155每次加0.1),最後擬合效果還行,0.3的閾值(相對誤差),驗證集正確率0.88,測試集影象近似擬合為二次曲線,單隱層使用relu,輸出層使用sigmoid。整個過程我沒有使用c++中的框架,所以程式中使用了大量的for迴圈,這樣程式執行效率不高。
在這裡,我總結個人遇到的一些問題和方法。
1、**敲完,先自己檢視兩邊,尤其是公式。(這裡的公式我使用的吳恩達老師上課講的公式,包括損失函式、迭代等),我自己一般會發現好幾處錯誤。
2、c語言中某個陣列值本不該變化卻發生改變,很有可能前面其它陣列維數設定錯誤。我求矩陣的轉置時,由於行列設定錯誤,導致我的另外引數矩陣w2值所有元素直接從0變成0.5。這種情況以前也出現過
3、使用出發符號「/」時,兩個int數字相除,如1/10,結果為0,應使其中乙個數字帶小數。
4、樣本資料歸一化,使資料均在0-1之間。一開始我樣本集x為1-100,損失函式訓練幾次後直接是無窮大,歸一化後這個問題消失
5、疊加求和之前要清零。程式執行後誤差函式不收斂,發現求和(50個樣本求均值)後沒有清楚前一次疊加的結果。在測試集時,又是該問題。
6、矩陣(陣列)相乘時注意角標的變化
7、學習率初設為0.01,訓練一定次數後,降低學習率為0.0001,擬合效果進一步改善。
反思:1以前出現過的問題在以後程式設計中還可能繼續出現
2處理問題沒有思路時,看看想要的結果是什麼。在新增測試集後,輸出不太理想,又仔細看了**,找不到問題,於是從源頭出發,先看看訓練集的輸出,發現效果還行,又仔細看測試集程式,發現前一次沒有清零
3對於迴圈,找到了debug的方法,也算是一點小進步吧
BP神經網路
基本bp神經網路演算法包括 訊號的前向傳播 誤差的反向傳播 也即計算實際輸出時按照輸入到輸出的方向進行,權值閾值調整則相反。bp是一種多層前饋神經網路,由輸入層 隱含層和輸出層組成。層與層之間有兩種訊號在流動 一種是從輸入流向輸出的工作訊號,是輸入和權值的函式 另一種是輸入流向輸出的訊號,即誤差。隱...
BP神經網路
x 為輸入向量,y為隱藏層的神經元,z 為輸出層,d為目標真實值,本文預設 z 不經過sigmod處理。x y的權重為 w,y z的權重為 v yj ix iwij 1 oyi f y j 2 其中激勵函式f x 1 1 e x f x f x 1 f x 3 z k j f yj vjk 此時系統...
BP神經網路
bp是back propagation bp神經網路主要的演算法在於誤差反向傳播error backpropagation 有三層 輸入層 input 隱含層 hidden 輸出層 output 輸入層 n個神經元 隱含層 p個神經元 輸出層 q個神經元 輸入向量 x x1,x2,x n 隱含層輸入...