一年前接觸最初神經(jīng)網(wǎng)絡(luò),半年前就想自己寫一個最簡單的BP神經(jīng)網(wǎng)絡(luò)練練手,結(jié)果由于能力有限,不光是編程能力還有理論方面的能力都有限,一直推到半年后的現(xiàn)在才真正的開始。其實很多坑必須要自己親自踩過之后才能明白。在我看來,我現(xiàn)在這個過程就是在踩坑的過程。在不斷犯錯和改錯中提高。在這里記錄下自己的踩坑過程。
這是一個堪稱簡陋(隨著時間推移,應(yīng)該會變得更好)的練手性質(zhì)的小項目,而且重復(fù)造輪子,目的是為了加深自己對于神經(jīng)網(wǎng)絡(luò)的理解,以及提升自己的調(diào)參技巧和編程能力。我是一邊學(xué)習理論和編程技術(shù),一邊寫程序,而且現(xiàn)在還沒有完全完成,只能是一邊寫程序一邊記錄博客。之所以不叫BP神經(jīng)網(wǎng)絡(luò)而叫深度神經(jīng)網(wǎng)絡(luò),因為我不打算把這個當成一個寫完就可以扔掉的小程序,而是可以一直寫下去的項目。BP只是最基礎(chǔ)的,以后肯定不止于此,就我現(xiàn)在寫出來的內(nèi)容來說,已經(jīng)不止三層的BP神經(jīng)網(wǎng)絡(luò)了,理論上是可以有N層的。
項目中用到的除了標準庫就是OpenCV的core模塊。畢竟還是對opencv最熟悉,而且神經(jīng)網(wǎng)絡(luò)中最多的就是矩陣運算,而opencv的Mat類確實灰常強大。放著不用簡直浪費。
就目前來說,這個神經(jīng)網(wǎng)絡(luò)已經(jīng)可以開始跑了。大家都說mnist手寫數(shù)字識別是神經(jīng)網(wǎng)絡(luò)領(lǐng)域的Hello World,我也不例外,第一個測試的例子還是用的手寫數(shù)字識別。在用一千樣本(800訓(xùn)練,200測試,用這么少的原因是自己的地電腦太low了)的測試中,正確率85%左右,增加訓(xùn)練樣本可以增加正確率。現(xiàn)在只是到這一步。其他的以后再說。
如果有入門比我還晚的人能從中學(xué)到一些東西,不勝欣喜。如果有哪位大神偶然路過,能指點一二,簡直是再好不過了。
下面是系列文章鏈接:
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之壹——Net類的設(shè)計和神經(jīng)網(wǎng)絡(luò)的初始化
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之二——前向傳播和反向傳播
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之三——神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和測試
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之四——神經(jīng)網(wǎng)絡(luò)的預(yù)測和輸入輸出的解析
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之五——模型的保存和加載以及畫出實時輸出曲線
C++從零實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)之六——實戰(zhàn)手寫數(shù)字識別(sigmoid和tanh)