[英]Backpropagation 2-Dimensional Neuron Network C++
我正在學習二維神經元網絡,因此我面臨許多障礙,但我相信這是值得的,並且我真的很喜歡這個學習過程。
這是我的計划:使2-D NN能夠識別數字圖像。 圖像是5 x 3網格,我准備了從零到九的10張圖像。 例如,這將是數字7:
數字7的索引0、1、2、5、8、11、14為1(或3、4、6、7、9、10、12、13為0無關緊要),依此類推。 因此,我的輸入層將是一個5 x 3神經元層,我將僅將其饋入零或 1(不在兩者之間,並且索引取決於我正在饋入該層的圖像)。
但是,我的輸出層將是10個神經元的一維層。 根據識別出的數字,某個神經元將觸發一個值,其余的應為零(不應觸發)。
我已經完成了所有事情,但是我在計算上遇到了問題,我將非常感謝您的幫助。 我得到了極高的錯誤率,並且所有輸出神經元上的極低(負)輸出值,並且即使在第10,000次傳遞時,值(錯誤和輸出)也不會改變。
我想走得更遠,發布我的反向傳播方法,因為我相信問題出在其中。 但是,要分解我的作品,我想先聽聽一些評論,我想知道我的設計是否平易近人。
我的計划有意義嗎?
所有帖子都在談論范圍( 0->1
, -1 ->+1
0.01 -> 0.5
等),它對{ 0 |
。要么。 | 1 }
| 1 }
在輸出層而不是范圍上? 如果是,我該如何控制?
我正在使用TanHyperbolic
作為傳遞函數。 它與sigmoid
和其他功能有什么區別嗎?
任何想法/意見/指導表示贊賞,並在此先感謝
好吧,通過上面的描述,我認為采用的設計和方法是正確的! 關於激活函數的選擇,請記住,這些函數有助於獲得具有最大激活數的神經元,此外,它們的代數性質(例如易導數)也有助於反向傳播的定義。 考慮到這一點,您不必擔心激活功能的選擇。
您上面提到的范圍與輸入的縮放過程相對應,最好將輸入圖像的范圍設置為0到1。這有助於縮放錯誤表面,並有助於優化過程的速度和收斂性。 因為您的輸入集由圖像組成,並且每個圖像都由像素組成,所以一個像素可以達到的最小值和最大值分別為0和255。 要在此示例中縮放輸入,必須將每個值除以255。
現在,關於訓練問題,您是否嘗試過檢查坡度計算程序是否正確? 即,通過使用成本函數,並評估成本函數, J
? 如果不是這樣,請嘗試生成一個包含矢量的theta
玩具向量theta
,其中包含神經網絡中涉及的所有權重矩陣,並通過使用漸變的定義評估每個點的漸變,這對Matlab示例來說很抱歉,但是應該很容易移植到C ++:
perturb = zeros(size(theta));
e = 1e-4;
for p = 1:numel(theta)
% Set perturbation vector
perturb(p) = e;
loss1 = J(theta - perturb);
loss2 = J(theta + perturb);
% Compute Numerical Gradient
numgrad(p) = (loss2 - loss1) / (2*e);
perturb(p) = 0;
end
評估函數后,將數值梯度與通過反向傳播計算的梯度進行比較。 如果每次計算之間的差異小於3e-9,則您的實現應正確。
我建議您查看斯坦福人工智能實驗室提供的UFLDL教程,在那里您可以找到許多與神經網絡及其范例有關的信息,值得一看!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.