【深度学习】深入理解卷积神经网络(CNN)
?CNN
Author:louwill
From:深度學習筆記
本文將為大家介紹一種用途更為廣泛、性能更加優越的神經網絡結構——卷積神經網絡(Convolutional Neural Network, CNN)。CNN在圖像識別、目標檢測和語義分割等多個計算機視覺領域有著廣泛的應用。
?
CNN發展簡史與相關人物
早在20個世紀60年代的時候,生物神經學領域的相關研究就表明,生物視覺信息從視網膜傳遞到大腦是由多個層次的感受野逐層激發完成的。到了20世紀80年代,出現了相應的早期感受野的理論模型。這一階段是早期的樸素卷積網絡理論時期。
到了1985年,Rumelhart和Hinton等人提出了BP神經網絡,也就是著名的反向傳播算法來訓練神經網絡模型。這基本奠定了神經網絡的理論基礎,如今大家在谷歌學術上可以看到,提出BP算法的這篇文章的引用次數是24914(這個數字隨時都在上升),如圖1所示。所以如果你的論文里引用到了BP算法,這個數字還得繼續往上漲。
圖1?提出BP算法的論文
?
有了此前的理論積累,在 BP算法提出三年之后,如今深度學習三巨頭之一的Yann LeCun發現可以用BP算法來訓練一種構造出來的多層卷積網絡結構,并用其訓練出來的卷積網絡識別手寫數字。在1989年,LeCun正式提出了卷積神經網絡的概念。因而,現在我們提到Yann LeCun這個人物時,除了深度學習三巨頭之外,還有個名號就是深度學習之父。圖2這四位深度學習頂級大咖中最左邊這位就是Yann Lecun。
?
圖2?深度學習三巨頭和吳恩達
?
至于圖中其他人,咱們也一并介紹了。除了第一位卷積神經網絡之父的Yann Lecun之外,第二位就是前面提到的發明反向傳播算法之一的Geoffrey Hinton , 第三位則是在RNN和序列模型領域成就頗豐的Yoshua Bengio,這三位便是前面我們所說的深度學習三巨頭,是他們支撐起了深度學習的發展。第四位便是我們熟悉的吳恩達(Andrew Ng)。大家若想更多的了解以上深度學習人物的故事,可以參看吳恩達對三位大神的采訪,看他們對大家學習機器學習和深度學習是怎樣建議的。
繼續來看CNN的發展歷程。LeCun正式提出CNN之后,經過一些年的醞釀,在1998 年提出了CNN的開山之作——LeNet5網絡。提出 LeNet5 的這篇論文引用次數已達21444次,如圖3所示。
圖3?提出LeNet5的論文
?
進入新世紀后,由于計算能力不足和可解釋性較差等多方面的原因,神經網絡的發展經歷了短暫的低谷,直到2012年ILSVRC ImageNet圖像識別大賽上AlexNet一舉奪魁,此后大數據逐漸興起,以CNN為代表的深度學習方法逐漸成為計算機視覺、語音識別和自然語言處理等領域的主流方法,CNN才真正實現開宗立派。
?
卷積的含義
從前面的學習中,我們了解了深度神經網絡的一般結構、前向傳播和反向傳播機制,而CNN相較于深度神經網絡,其主要區別就在于卷積層(Convolutional Layer),卷積層的存在使得神經網絡具備更強的學習和特征提取能力。除了卷積層之外,池化層(Pooling Layer)的存在也使得CNN有著更強的穩定性,最后則是DNN中常見的全連接層(Fully Connected Layer)。一個典型的CNN通常包括這三層。CNN的基本結構如圖4所示。?
圖4?CNN的基本結構
?
說了半天的CNN,想必很多人還沒弄明白:到底什么是卷積?
從數學角度來看,卷積可以理解為一種類似于加權運算一樣的操作。在圖像處理中,針對圖像的像素矩陣,卷積操作就是用一個卷積核來逐行逐列的掃描像素矩陣,并與像素矩陣做元素相乘,以此得到新的像素矩陣。這個過程就是卷積。其中卷積核也叫過濾器或者濾波器,濾波器在輸入像素矩陣上掃過的面積稱之為感受野。這么說可能過于概念化,我們以一個具體的例子來看卷積操作,如圖4.5所示。
?
圖5?卷積計算示意圖
圖5中我們用一個3*3的濾波器去掃描一個5*5的像素矩陣,用濾波器中每一個元素與像素矩陣中感受野內的元素進行乘積運算,可得到了一個3*3的輸出像素矩陣,這個輸出的3*3像素矩陣能夠較大程度的提取原始像素矩陣的圖像特征,這也是卷積神經網絡之所以有效的原因。我們以輸出像素矩陣中第一個元素4為例,演示一下計算過程:
1*1 + 1*0 + 1*1 + 1*0 + 1*1 + 0*0 + 1*1 + 0*0 + 0*1 = 4
這里你可能會問:如何確定經過卷積后的輸出矩陣的維度?我們是有計算公式的。假設原始輸入像素矩陣的shape為n*n,濾波器的shape為f*f,那么輸出像素矩陣的shape為(n-f+1)*(n-f+1)?。例如,3*3的濾波器去掃描一個5*5的輸入圖像,按照公式計算的話輸出就是 (5-3+1)*(5-3+1)=3*3。在訓練卷積網絡時,我們需要初始化濾波器中的卷積參數,在訓練中不斷迭代得到最好的濾波器參數。
大體上卷積操作就是這么個過程,看起來十分簡單。這也是目前大多數深度學習教程對于卷積的闡述方式。讓我們來深究一下,究竟卷積為什么要這么設計,背后有沒有什么數學和物理意義呢?追本溯源,我們先回到數學教科書中來看卷積。在泛函分析中,卷積也叫旋積或者褶積,是一種通過兩個函數x(t)和h(t)生成的數學算子。其計算公式如下:
?公式寫的很清楚了,兩個函數的卷積就是先將一個函數進行翻轉(Reverse),然后再做一個平移(Shift),這便是“卷”的含義。而“積”就是將平移后的兩個函數對應元素相乘求和。所以卷積本質上就是一個Reverse-Shift-Weighted Summation(翻轉平移加權求和)的操作。那么為什么要卷積?直接元素相乘不好嗎?就圖像的卷積操作而言,卷積能夠更好提取區域特征,使用不同大小的卷積算子能夠提取圖像各個尺度的特征。卷積這么設計的原因也正在于此。
接著前面的卷積圖像處理操作,這里我們需要注意兩個問題:第一個就是濾波器移動的步幅問題,上面的例子中我們的濾波器的移動步長為1,即在像素矩陣上一格一格平移。但如果濾波器是以兩個單位或者更多單位平移呢?這里就涉及卷積過程中的Stride問題。第二個問題涉及卷積操作的兩個缺點?,第一個缺點在于每次做卷積,你的圖像就會變小,可能做了幾次卷積之后,你的圖像就變成1*1,這就不好辦了。第二個缺點在于原始輸入像素矩陣的邊緣和角落的像素點只能被濾波器掃到一次,而靠近像素中心點的像素點則會被多次掃到進行卷積。這就使得邊緣和角落里的像素特征提取不足,這就涉及卷積過程中的 Padding問題。
針對第一個問題,也就是卷積步長問題,其實也很簡單,就是按照正常的卷積過程去操作,只不過每次要多走一個像素單位。且看卷積步幅為2的卷積操作示例,如圖6所示。?
圖6?步長等于2的卷積計算示例
?
我們用一個3*3的濾波器去對原始像素為7*7的圖像進行卷積操作,設定卷積步長為 2,可看到輸出像素矩陣的第二行第一個元素69的計算跨越了兩個像素格點,計算過程為:
3*3 + 4*4 + 8*4 + 7*1 + 8*0 + 3*2 + 4*-1 + 2*0 + 1*3 = 69
加入步長之后我們的輸出像素矩陣的shape的計算公式需要更新為:,其中為步長。
針對第二個問題,卷積神經網絡采用一種叫作Padding的操作,即對原始像素邊緣和角落進行零填充,以期能夠在卷積過程中充分利用邊緣和角落的像素特征。至于填充多少 0 像素值,一般有兩個選擇,一是Valid填充,也就是不填充,所以就不用管它了。我們在意的是有填充,就是第二種,Same填充方法,即填充后,輸入和輸出大小是一致的,對于n*n大小的輸入像素,如果你用填充了p個像素點之后,就變成了n+2p,最后輸出像素的shape 計算公式就變成了((n+2p-f)/s)+1,要想讓的((n+2p-f)/s)+1=n話,輸入輸出大小相等,則p=(f-1)/2。所以,正常情況下濾波器f的大小都會選擇為奇數個。
以上便是CNN中卷積的基本過程描述。一個完整的卷積神經網絡除了最重要的卷積層之外,還有池化層和全連接層。
?
池化和全連接
通常在設計卷積網絡結構時,卷積層后會跟著一個池化層。池化(Pooling)的操作類似于卷積,只是將濾波器與感受野之間的元素相乘改成了對感受野直接進行最大采樣。簡單來說,池化層是用來縮減模型大小,提高模型計算速度以及提高所提取特征的魯棒性。池化操作通常有兩種,一種是常用的最大池化(Max Pooling),另一種是不常用的平均池化(Average Pooling)。池化操作過程也非常簡單,假設池化層的輸入為一個4*4的圖像,我們用最大池化對其進行池化,執行最大池化的樹池是一個2*2的矩陣,執行過程就是將輸入矩陣拆分為不同區域,對于2*2 的輸出而言,輸出的每個元素都是其對應區域的最大元素值。最大池化如圖7所示。?
圖7?最大池化
?
最大池化過程就像是應用了一個2*2的濾波器以步幅2進行區域最大化輸出操作。我們可以這么理解:池化的參數就是濾波器的大小和步幅,池化的效果就相當于對輸入圖像的高度和寬度進行縮小。值得注意的是,最大池化只是計算神經網絡某一層的靜態屬性,中間并沒有什么學習過程。
池化完成之后就是標準神經網絡中的全連接層了。全連接層我們在本書前三講深度神經網絡中有詳細描述,在此就不再贅述??傊?#xff0c;一個典型的卷積層通常包括卷積層-池化層和全連接層。例如,Yann LeCun在1998年提出的LeNet5網絡結構就是最初的卷積網絡結構。LeNet5網絡結構如圖8所示。
?
圖8?LeNet5網絡結構
?
CNN發展到如今,人們早已不滿足常規的卷積方式設計,除此之外,針對3維圖像的3D卷積、在圖像分割中應用廣泛的轉置卷積、GoogLeNet中常用的1*1卷積、基于1*1卷積的深度可分離卷積、為擴大感受野而設計的空洞卷積等各種花式卷積方式不斷地出現在各種CNN結構設計中,感興趣的讀者可以逐一深入了解。
本講在介紹卷積神經網絡發展歷程的基礎上,對卷積的基本過程進行了詳細的描述,之后又介紹了池化和全連接卷積神經網絡的另外兩大組成部分。一個典型的卷積網絡結構設計通常包括卷積層、池化層和全連接層三個部分。在下一講中,我們將和大家繼續深入討論卷積神經網絡的結構、訓練等更加深入的內容。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):總結
以上是生活随笔為你收集整理的【深度学习】深入理解卷积神经网络(CNN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】Python中必须知
- 下一篇: 【Python基础】推荐几个神器来拯救奇