簡體   English   中英

反向傳播二維神經元網絡C ++

[英]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教程,在那里您可以找到許多與神經網絡及其范例有關的信息,值得一看!

http://ufldl.stanford.edu/wiki/index.php/Main_Page

http://ufldl.stanford.edu/tutorial/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM