實質上鼓勵一下吧

上一篇類神經網路基礎篇得到了相當多的搜尋引擎查詢和點閱(不過卻沒有人回應,玩技術的人實在是不善於跟人溝通呀,隨便回個兩句也好呀,這叫我怎麼把二十幾年的經驗丟出來呢),這一篇接著來說怎麼設計一個類神經網路程式。

Neture[5]

同樣是這張圖,單看這張圖片想像成是一個由三個一維陣列,S,H,Y三層各是一個一維陣列,以及兩個二維陣列,SW=S * H,HW=H * Y,用這樣的方法開好五個陣列就可以了,然後按照類神經網路的運算規則來計算就行了。

但是這樣的演算法架構雖然簡單,很適合使用在記憶體固定的硬體設備上,例如手寫輸入辨識。但是它並不是萬能的,如果要做的案例比較複雜,那麼就需要兩層以上的隱藏層,變成需要動態的建立起新的陣列。當然明確的知道你要分析的資料,那麼就可以在一開始的時候把陣列都開好,但是做好的東西就只能夠用在一個地方。

另一個缺點就是運算速度的問題,因為這樣的架構只能夠一個一個神經節使用廻圈進行運算,在現在CPU可以分工的環境下是很沒有效率的。

要解決這樣的問題最好就是利用物件導向的方法,以神經節Y1來看它和HW11、HW21可以看成是一個獨立的物件,由於HW11這種神經鏈裡面只會儲存一個浮點數,因此每一個神經節裡面只要根據上一層有多少個神經節來擴大神經鏈的陣列大小就可以了。隱藏層也是同樣的道理。

而最上面的輸入層雖然沒有往上的神經鏈,但是也可以用同樣的物件來表達,這樣所有的神經節都是同樣物件了,只是輸入層的神經節他的神經鏈陣列是null。

這樣全部的神經節都一樣了後來就簡單了,每一層裡面包含多個神經節,整個網路就是多個神經層,這樣在宣告上面就不會有問題了。

這樣做有一個好處,就是所有的神經節的運算可以放到一個執行緒裡面去,可以大大的提高整個網路的運算速度。當然是指輸入輸出都不少的情況下,如果少少的不要使用多執行緒還比較快,畢竟建立一個執行緒也需要不少的手續和記憶體搬移的動作。

創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 留言(7) 人氣()


留言列表 (7)

發表留言
  • hahalin
  • 很精采的說明

    您好,小弟最近也在學習這方面的理論,目前還在努力理解的階段,請問像RBFNN與SO,她們指的是學習網路的不同嗎?SO是分群那麼RBFNN呢?很希望能看看您對於RBFNN的說明,應該可以更能理解.
  • nanoeye
  • 善用執行緒是很重要的觀念

    善用執行緒可以讓程式跑得更順暢,避免有一段程式碼卡住大部分的CPU時間
  • 看文章請看完前後文,我只是把多執行緒的程式碼拿掉而已,免得程式碼變得太過複雜,很多人看不懂!

    漠哥 於 2009/10/25 20:53 回覆

  • 訪客
  • 請問版主:有個地方不太懂~「以及兩個二維陣列,SW=S * H,HW=H * Y」,意思是說輸入值S*權重值W會是二維陣列?(是說一維陣列*一維陣列=二維陣列?)
    如果輸入層、隱藏層、輸出層都是只有一個人神經元,請問還需要設成S、W、H、Y陣列嗎?
  • 1.事實上我是將一個神經元視為一個類,裏面包含權重和神經鍵陣列,而一個層則是神經元陣列。
    2.如果每一層都只有一個神經元,那麼這個問題應該非常簡單,根本就不應該用類神經方法來解,只會搞死自己。

    漠哥 於 2011/08/19 02:56 回覆

  • da
  • 請問你寫的那些程式matlab能用嗎感謝!!
  • mathlab已經是一套獨立的程式語言了哦,我這個是純粹使用C#來寫的程式。

    漠哥 於 2012/03/17 08:56 回覆

  • 訪客
  • 內容說明簡單易懂,真是費心了。
  • 12345
  • 大大我找了很久 ThreadArg 還是沒找到 ,可以給我code或是連結嗎感謝?