我想做一個基於神經網路的數字識別程序,請問我應該看哪些書?

這是一個小project,我現在上大一,之前沒有相關基礎,學過c語言。我現在想找一些相關的書籍資料,幫我理解其中的原理,然後自己編程實現,請問有沒有推薦的?

我不太清楚是不是所有的圖像識別都要用到神經網路,這個誰能給我解答一下?

在知乎里查了一下,相關的書有岡薩雷斯的《數字圖像處理》,以及《學習opencv》。我還想找一些講圖像識別原理和神經網路的,最好是兩者結合在一起,比較傾向於外國人寫的有中譯本的,或者是網上的資料和公開課。


0.本文的靶向讀者是,無英文文獻閱讀經驗,無機器學習經驗,無圖像處理經驗,掌握一門面向過程或面向對象的程序語言,掌握多元微積分的基本知識。

0.1.想快速做出一個神經網路小project,想快速知道神經網路是怎麼回事的人,適合此答案。想花費較長時間深入地理解神經網路和機器學習的人,想了解卷積神經網路的人,不適合此答案,因為此回答只講述卷積神經網路的前身bp神經網路。

1.自學關鍵在於迅速獲得成就感。在於迅速做出小原型,然後再逐步改進。

2.題主的想法很好,而且也可行。下面是步驟。

2.1.不過並不需要學數字圖像處理,也不是所有的圖像識別都要神經網路。按題主你的學法你可能會學很久。我可以不學圖像處理和opencv就完成這個project。我在大三下的時候,不懂圖像處理,也不懂opencv,但兩三天做好了這個project。你可以計劃一周到十天完成,但要全天候全身心投入。

3.目標:用c語言實現一個bp人工神經網路神經,來完成識別手寫數字的分類。

3.9.文獻調研:先複習一下高等數學中的偏導數,複合函數的求導,鏈式求導法則。

4.文獻調研:以「bp人工神經網路」為關鍵詞先在百度上通過技術博客和百度百科來學習,感受。感知器,或者多層感知器,向回傳播演算法,也可以作為關鍵詞。(關注怎麼做,先不問為什麼)

5.文獻調研:注意先避開「深度學習」,「深度人工神經網路」,「卷積神經網路」等關鍵詞和知識,以免產生混淆,在此project中暫且不用這些。

6.文獻調研:在中國知網上搜索,bp人工神經網路的應用論文,最好也是識別手寫字體相關的,注意避免神經網路的變體,選擇舊一點的,基本一點的論文。通過標題和摘要篩出十幾篇,再選出細節敘述得最詳細的三四篇,弄明白實現細節。

7.數據集:搜machine learning dataset 加上handwriting character recognition,你會找到一個有很多個數據集的網站,下載一個手寫字體的數據集。閱讀數據格式,用文件操作讀入數據,要知道,一張圖片本質就是一個整數矩陣。通常可以採樣一下,或者直接把這個矩陣作為人工神經網路的輸入。

8.程序:為了讓問題更簡單,先做一個比如識別手寫字體0和1的分類器。假設輸入是16乘16(也可以是8乘8)的矩陣,那麼輸入層就是256個神經元。輸出層是兩類對應兩個神經元。中間層一般是經驗設置。先設置為64,然後再嘗試32和128的效果。先實現這樣一個256,64,2的識別數字0和1的分類器。

9.實現能識別十個數字的bp人工神經網路。

10.參考完成時間:一周。

11.完成後在csdn上開個博客,寫一篇技術博客,這篇博客要讓此刻提問的你看懂,並且不用找別的文獻就能直接寫出代碼,技術博客中要畫圖,給出易於編譯的代碼,包括處理數據的代碼。

12.如果你完成了以上步驟,還想有更多的改進,尋求下一步學習的方向,請評論我的回答,我可以給你建議。但要附上11中你寫的技術博客,我會根據博客的完善程度和你興趣給出下一個指導意見。


Coursera的課程 Machine Learning 第三周和第四周的課程的例子和作業就是手寫數字識別。

課程有中文字幕,數學基礎要求很低(會求偏導數和矩陣乘法就行了,不會也沒關係,會有幾節視頻是複習的)。

大部分的代碼框架(Matlab)已經寫好,你只需要填關鍵部分。

傳送門在此:https://www.coursera.org/learn/machine-learning

上個效果圖:

準確率還不錯:


我博客里有一篇 [kaggle實戰] Digit Recognizer -- 從KNN,LR,SVM,RF到深度學習 (深度學習就是指神經網路)。 你可以先直觀感受一下怎麼用不同方法實現數字識別這個東西。其實都是機器學習相關的知識,沒用到啥圖像的domain knowledge(指岡薩雷斯的《數字圖像處理》,簡單了解過,但沒細看)。

如果想弄清楚裡面機器學習的原理,估計題主大一會有點吃力。如果是個小project,可以開發一些附屬的工具,比如上傳一個圖片,或者手寫一個圖片,然後後台調用深度學習這個黑盒的庫輸出結果到頁面之類的就可以了。


可以看Tensorflow的MNIST教程,教你從Logistic regression到CNN。


這種例子和論文太多了,找個最相近的模仿著做


個人建議學好英語,然後大三上tensorflow看tutorial。目前可能你的數學和計算機基礎不足以充分理解神經網路。


初學者最重要的是用現有的方法搭建一個成熟可用的系統,直觀上感受一下各種方法的效果,然後再對那些方法做深入的研究。從頭實現機器學習的方法的話,搞一些基本的功能還可以,一些後續的改進經常就不知道如何跟進了,所以最後效果往往一般。

上乾貨,我覺得這是對題主最大的幫助:這是我基於OpenCV2寫的一套開源的手寫數字識別程序,直接用像素點灰度值做為特徵輸入,採用維規約技術進行降維,並採用不同的分類器識別手寫數字,並輸出結果,進行比較。在我上傳的標準數據集上輕鬆達到98%以上的準確率(這個數據集比較簡單,最高記錄有人搞到過99.8%以上)。最重要的,純c++開發。題主有興趣以後也可以往裡面貢獻代碼。

https://github.com/zds9204/handwritten_number_recognition


搜索lenet即可


才大一,想的稍微多了點……好好上課、做作業、考試、考研/推研。上了研究生,再來考慮這件事情吧。


我覺得Michael Nelson以數字識別為例子講人工神經網路講的不錯。 當然現在數字識別基本已經是神經網路的HelloWorld了。 只是覺得MN在覆蓋面,深度,文章篇幅各方面的平衡上把控的非常好。 整個教程也不算長,半個禮拜應該也能看完。 然後MN在數字這個識別上進行了各種改進,能夠達到相對較高的精度。

Neural networks and deep learning


這是一個很常見的機器學習應用,主要是三個步驟:

特徵提取:在這個階段你可以從圖像中自行提取特徵信息也可以下載常見數據集如usps。如果做特徵提取的話可以參考lbp,顏色直方圖等等,做一些特徵組合。切記特徵工程很重要,決定整個項目結果的好與壞。

模型訓練:題主既然選擇了神經網路,不妨繼續關注一下深度學習以及神經網路方面的優化演算法。不一定要自行實現,在一些大牛的個人主頁可以下載Matlab 或者 python 代碼,還有numpy這個python庫實現了許多機器學習演算法。訓練過程中調參很重要,一般是交叉驗證,網格搜索。

模型測試:數據集的少部分需要專門用於模型的測試。驗證整個工程的正確性和有效性。

還有一個細節就是在特徵提取後,有必要的話可以做個特徵選擇,比如PCA,LDA,LPP。主要是降維,去除不冗餘特徵,從數據內部結構出發,可以關注流形學習。

上述是做一個機器學習過程的基本步驟,如果需要做一些原創性工作,那就要研究其中一個部分,做優化。


Neural networks and deep learning

這就是你需要的!

以數字識別為例子,幾十行代碼實現,行文幽默風趣。

從最基本的神經網路講到優化,非常全面。


心裡一萬隻草泥馬跑過!!!大半夜手機寫了好幾千字的內容居然沒了!!!fuck!被知乎客戶端的bug浪費了1小時的生命!!!

看了題主說是要到時候交選修課作業,確實是個蠻有想法的孩紙。

我大四學力學的,因為上個月計劃自動識別學校教務系統的驗證碼,接觸過這個卷積神經網路,首先值得說明的是,對於大一的孩紙來說,卷積神經網路還是有些困難的,我現在雖然跑起來了自己二次改寫卷積神經網路學習程序,但是我還是沒能完全明白裡面的原理的,因為這個領域是目前電子信息專業博士生的課題,本科生有知識欠缺的,不理解的部分在所難免。

現在大多數用戶更偏向於使用Python,我也比較喜歡,因為相對於c來說,Python更加靈活,入門快,規則簡單,模塊超多。但你又沒接觸過Python,不過Python並不難,你既然會c,那Python看下語法規則,應該很快就會了。

值得指出的是,Python的機器學習環境配置特別耗神,我不說我是電腦高手,起碼在班上大家是這麼叫我的,我折騰整個通宵才配置好,不是因為不好配置,是很多資源在國內被牆了,無法下載。

寫到這裡,不得不再次fuck下知乎客戶端,以平復我心中的憤怒和悲傷(???ω???)我大半夜倖幸苦苦碼字碼了幾千字點擊發布後直接回到了解放前!!連個影子都沒留下,還要我再憑回憶打一遍!!!

首先,你說了你只想要實現識別圖片對吧,如果你不需要學習功能的部分,如果不是十分複雜的圖像,內容的元素不重疊不嚴重的話,你大可不必用卷積神經網路,直接調用現有Python下的圖片識別模塊就可以了,應該十幾行代碼都可以搞定了,這個環境配置不太難,操作起來省事了許多。

另外,還有php語言也可以實現,php內置了很多圖像處理函數,可以把圖片進行處理變成01表示,然後再和已有的樣本遍歷對比,重合率最高的就是識別出來的內容,我做過一個半成品,因為我要識別的驗證碼太特殊,圖像重疊嚴重,php識別起來亞歷山大,所以做到一半就轉戰卷積神經網路了

最後提個建議

我看你在其他回答下不止一次提到說你不會深入研究,但是又不會看現有的代碼,想自己編寫。

首先,你的想法是好的,但是這樣做確實不是太明智的選擇。這個卷積神經網路的變數和處理步驟還有點多,在你不深入研究的情況下去自己寫代碼,可能花掉的時間比你深入研究的時間還要多。為什麼這麼說,你高中應該是理科生吧,我就拿物理的大題來說,你對照答案做題,和自己做題是完全不同的兩回事,如果你沒有學透那個題目的考點和解題步驟,而你僅僅只是知道了解,我想一個題目你自己解下來得花掉不少時間吧,這就出現了你說的矛盾,你又不深入研究(其實就是想表達你不會花很多時間在這上面的意思對吧)你又不參考已有的想完全自己寫(我可以揣摩為鍛煉自己的編程能力吧)這是不可能的事情。

我再跟你舉個例子,用過MATLAB的都知道裡面有個內置函數是專門來判斷一個數是否為質數的函數,函數名很好記,叫isprime。當時我是調用這個函數來判斷質數,我也想到了我為什麼要用這個自帶的,我也明白質數的定義,也知道幾種不同的判斷法則,我完全可以自己寫,興許還比自帶函數算的更快,當然,你可能知道結果了,我太天真了,花了一天時間把不同判斷法則寫成函數後我來和自帶函數運行時間做PK,最後慘敗,雖然是萬分之一秒的量級,但是我寫的程序最快的都比自帶的慢好幾倍,至此我們可以得出一個結論了吧,存在即合理,這些自帶函數之所以出現在我們面前,是因為它已經是好多數學和計算機的大牛們優化過千百遍的了,你何必跟自己過不去,在這個沒有深入研究的地方挖坑?除非你是數學高手,你才可以挑戰下,不然你哪來的自信可以寫出更完美的程序來,或者說是寫出令人滿意的程序來?

所以我說嘛,你的定位既然只是理解然後簡單實現,就不要跟自己整些幺蛾子了,先走好第一步再說,目標遠大值得表揚,但也得一步一個腳印來走,參考別人現有的程序並不丟臉,你這個年級如果能看懂別人寫的就已經是一件非常了不起的事了,別拿一個信息工程專業博士學位的內容來要求自己,老師也不會這樣要求,你能用到這個技術,我相信老師就已經很開心了,所以我還是建議你使用Python,多參考幾個現有程序,在CSDN裡面有幾篇非常好的文章並且帶Python源碼的,你可以先看懂程序,然後稍微改寫下細節,這樣的成果依然是非常有意義的,因為做到這點都會花費掉你不少時間。

請把寶貴的時間浪費在問題的核心上而不是在自己的短板上。

作為一個非計算機專業的愛折騰計算機的學長給你衷心的建議!


同大一。對於不太複雜的圖片,不用神經網路也可以。我嘗試用支持向量機識別了我們學校教務處的驗證碼,識別達到了百分之九十。具體是用libsvm加python做的,有興趣的話我可以把代碼發給你看看,只要稍微了解一下支持向量機的原理看懂問題就不大。


等等等。。基於神經網路的數字識別程序?這不就是經典的Yann LeCun提出CNN的那個論文嗎?

MNIST Demos on Yann LeCun"s website

你把這個實現出來就完工了。

而對於圖像處理和神經網路的關係。其實沒太大關係。圖像處理和計算機視覺(目前主流基於神經網路和其他一些機器學習演算法)並沒有太直接的聯繫,圖像處理在計算機視覺應用中一般起一些圖像預處理的作用,簡單了解一下就可以,不用花太多時間。


簡單一點的方法:

1. 看懂神經網路演算法(Andrew Ng 講的BPNN).

2. 收集,標記你的數據.

3. matlab有個神經網路工具箱,可以直接用來訓練.


用matlab做,比較簡單,搜一下車牌識別的例子,數字識別用神經網路訓練的那種


原理?《機器視覺》,《機器學習導論》,《機器學習實踐》樓下覺得可以不


我建議大一還是先打好數學與演算法的基礎,如果實在很感興趣,可以上Andrew NG的http://deeplearning.stanford.edu/tutorial/裡面拜讀一下,不懂的不斷Google


推薦閱讀:

為什麼梯度下降法每次找到的都是下降最快的點?
如何評價 Coursera 的機器學習 (Andrew Ng) 課程?
如何評價Deep and Hierarchical Implicit Models?
已知兩個高斯分布及他們的關係,如何求條件期望?

TAG:機器學習 | 圖像識別 | 計算機視覺 | 神經網路 |