1.1.大腦
作為人類,我們不斷地通過眼睛來觀察和分析周圍的世界,我們不需要刻意的“努力”思考,就可以對所看到的一切做出預測,并對它們采取行動。當我們看到某些東西時,我們會根據我們過去學到的東西來標記每個對象。為了說明這些情況。
你可能會想到“這是一個快樂的小男孩站在椅子上”?;蛘咭苍S你認為他看起來像是在尖叫,即將在他面前攻擊這塊蛋糕。
這就是我們整天下意識地做的事情。我們看到事物,然后標記,進行預測和識別行為。但是我們怎么做到這些的呢?我們怎么能解釋我們看到的一切?
大自然花費了5億多年的時間來創建一個系統來實現這一目標。眼睛和大腦之間的合作,稱為主要視覺通路,是我們理解周圍世界的原因。
雖然視力從眼睛開始,但我們所看到的實際解釋發生在大腦的初級視覺皮層中。
當您看到一個物體時,您眼中的光感受器會通過視神經將信號發送到正在處理輸入的主視覺皮層。在初級視覺皮層,使眼睛看到的東西的感覺。
所有這一切對我們來說都很自然。我們幾乎沒有想到我們能夠識別我們生活中看到的所有物體和人物的特殊性。神經元和大腦連接的深層復雜層次結構在記憶和標記物體的過程中起著重要作用。
想想我們如何學習例如傘是什么。或鴨子,燈,蠟燭或書。一開始,我們的父母或家人告訴我們直接環境中物體的名稱。我們通過給我們的例子了解到。慢慢地,但我們開始在我們的環境中越來越多地認識到某些事情。它們變得如此普遍,以至于下次我們看到它們時,我們會立即知道這個物體的名稱是什么。他們成為我們世界的模型一部分。
1.2.卷積神經網絡的歷史
與孩子學會識別物體的方式類似,我們需要在能夠概括輸入并對之前從未見過的圖像進行預測之前,展示數百萬張圖片的算法。
計算機以與我們不同的方式“看到”東西的。他們的世界只包括數字。每個圖像都可以表示為二維數字數組,稱為像素。
但是它們以不同的方式感知圖像,這一事實并不意味著我們無法訓練他們的識別模式,就像我們一樣如何識別圖像。我們只需要以不同的方式思考圖像是什么。
為了“教會”一種算法如何識別圖像中的對象,我們使用特定類型的人工神經網絡:卷積神經網絡(CNN)。他們的名字源于網絡中最重要的一個操作:卷積。
卷積神經網絡受到大腦的啟發。DH Hubel和TN Wiesel在20世紀50年代和60年代對哺乳動物大腦的研究提出了哺乳動物如何在視覺上感知世界的新模型。他們表明貓和猴的視覺皮層包括在其直接環境中專門響應神經元的神經元。
在他們的論文中,他們描述了大腦中兩種基本類型的視覺神經元細胞,每種細胞以不同的方式起作用:簡單細胞(S細胞)和復合細胞(C細胞)。
例如,當簡單單元格將基本形狀識別為固定區域和特定角度的線條時,它們就會激活。復雜細胞具有較大的感受野,其輸出對野外的特定位置不敏感。
復雜細胞繼續對某種刺激做出反應,即使它在視網膜上的絕對位置發生變化。在這種情況下,復雜指的是更靈活。
在視覺中,單個感覺神經元的感受區域是視網膜的特定區域,其中某些東西將影響該神經元的發射(即,將激活神經元)。每個感覺神經元細胞都有相似的感受野,它們的田地覆蓋著。
此外,層級【hierarchy 】的概念在大腦中起著重要作用。信息按順序存儲在模式序列中。的新皮層,它是大腦的最外層,以分層方式存儲信息。它存儲在皮質柱中,或者在新皮層中均勻組織的神經元分組。
1980年,一位名為Fukushima的研究員提出了一種分層神經網絡模型。他稱之為新認知。該模型的靈感來自簡單和復雜細胞的概念。neocognitron能夠通過了解物體的形狀來識別模式。
后來,1998年,卷心神經網絡被Bengio,Le Cun,Bottou和Haffner引入。他們的第一個卷積神經網絡稱為LeNet-5,能夠對手寫數字中的數字進行分類。
2、卷積神經網絡
卷積神經網絡(Convolutional Neural Network)簡稱CNN,CNN是所有深度學習課程、書籍必教的模型,CNN在影像識別方面的為例特別強大,許多影像識別的模型也都是以CNN的架構為基礎去做延伸。另外值得一提的是CNN模型也是少數參考人的大腦視覺組織來建立的深度學習模型,學會CNN之后,對于學習其他深度學習的模型也很有幫助,本文主要講述了CNN的原理以及使用CNN來達成99%正確度的手寫字體識別。
CNN的概念圖如下:
從上面三張圖片我們可以看出,CNN架構簡單來說就是:圖片經過各兩次的Convolution, Pooling, Fully Connected就是CNN的架構了,因此只要搞懂Convolution, Pooling, Fully Connected三個部分的內容就可以完全掌握了CNN!
2.1. convolution layer 卷積層
卷積運算就是將原始圖片的與特定的Feature Detector(filter)做卷積運算(符號?),卷積運算就是將下圖兩個3x3的矩陣作相乘后再相加,以下圖為例0 *0 + 0*0 + 0*1+ 0*1 + 1 *0 + 0*0 + 0*0 + 0*1 + 0*1 =0
每次移動一步,我們可以一次做完整張表的計算,如下:
下面的動圖更好地解釋了計算過程:
左:過濾器在輸入上滑動。右:結果匯總并添加到要素圖中。
中間的Feature Detector(Filter)會隨機產生好幾種(ex:16種),Feature Detector的目的就是幫助我們萃取出圖片當中的一些特征(ex:形狀),就像人的大腦在判斷這個圖片是什么東西也是根據形狀來推測
利用Feature Detector萃取出物體的邊界
利用Feature Detector萃取出物體的邊界
使用Relu函數去掉負值,更能淬煉出物體的形狀
我們在輸入上進行了多次卷積,其中每個操作使用不同的過濾器。這導致不同的特征映射。最后,我們將所有這些特征圖放在一起,作為卷積層的最終輸出。
就像任何其他神經網絡一樣,我們使用激活函數使輸出非線性。在卷積神經網絡的情況下,卷積的輸出將通過激活函數。這可能是ReLU激活功能
這里還有一個概念就是步長,Stride是每次卷積濾波器移動的步長。步幅大小通常為1,意味著濾鏡逐個像素地滑動。通過增加步幅大小,您的濾波器在輸入上滑動的間隔更大,因此單元之間的重疊更少。
下面的動畫顯示步幅大小為1。
由于feature map的大小始終小于輸入,我們必須做一些事情來防止我們的要素圖縮小。這是我們使用填充的地方。
添加一層零值像素以使用零環繞輸入,這樣我們的要素圖就不會縮小。除了在執行卷積后保持空間大小不變,填充還可以提高性能并確保內核和步幅大小適合輸入。
可視化卷積層的一種好方法如下所示,最后我們以一張動圖解釋下卷積層到底做了什么
卷積如何與K = 2濾波器一起工作,每個濾波器具有空間范圍F = 3,步幅S = 2和輸入填充P = 1.
2.2.pooling layer 池化層
在卷積層之后,通常在CNN層之間添加池化層。池化的功能是不斷降低維數,以減少網絡中的參數和計算次數。這縮短了訓練時間并控制過度擬合。
最常見的池類型是max pooling,它在每個窗口中占用最大值。需要事先指定這些窗口大小。這會降低特征圖的大小,同時保留重要信息。
Max Pooling主要的好處是當圖片整個平移幾個Pixel的話對判斷上完全不會造成影響,以及有很好的抗雜訊功能。
2.3.Fully Connected Layer 全連接層
基本上全連接層的部分就是將之前的結果平坦化之后接到最基本的神經網絡了
3、利用CNN識別MNIST手寫字體
下面這部分主要是關于如何使用tensorflow實現CNN以及手寫字體識別的應用:
大家稍微對tensorflow的代碼有些基礎,理解上面這部分基本上沒有難度,并且基本也是按照我們前面概念圖中的邏輯順序實現的。
最終按照慕課網上的學習資料TensorFlow與Flask結合打造手寫體數字識別,實現了一遍CNN,比較曲折的地方是前端,以 及如何將訓練的模型與flask整合,最后項目效果如下:
4、總結
最后說自己的兩點感觸吧:
1、CNN在各種場景已經應用很成熟,網上資料特別多,原先自己也是略知一二,但是從來沒有總結整理過,還是整理完之后心里比較踏實一些。
2、切記理論加實踐,實現一遍更踏實。
想了解更多IT資訊,請訪問中培偉業官網:中培偉業