深度学习入门笔记(十九):卷积神经网络(二)
歡迎關注WX公眾號:【程序員管小亮】
專欄——深度學習入門筆記
聲明
1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
文章目錄
- 歡迎關注WX公眾號:【程序員管小亮】
- 專欄——深度學習入門筆記
- 聲明
- 深度學習入門筆記(十九):卷積神經網絡(二)
- 1、一個極其簡單的卷積網絡示例
- 2、池化層
- 3、卷積神經網絡
- 4、為什么使用卷積?
- 推薦閱讀
- 參考文章
深度學習入門筆記(十九):卷積神經網絡(二)
1、一個極其簡單的卷積網絡示例
在 深度學習入門筆記(十八):卷積神經網絡(一) 中我們已經講過了,怎樣為卷積網絡構建一個卷積層,那么現在來一起搭建一個簡單的卷積網絡。
假設有一張圖片(圖片分類或圖片識別)定義為 xxx,然后現在辨別圖片中有沒有貓(用0或1表示),顯然這是一個分類問題,針對它來一起構建一個卷積神經網絡。假設用的是一張比較小的圖片(39×39×3),這樣設定可以使其中一些數字效果更好。所以 nH[0]=nW[0]=39n_{H}^{[0]} = n_{W}^{[0]} = 39nH[0]?=nW[0]?=39,即高度和寬度都等于39,nc[0]=3n_{c}^{[0]} =3nc[0]?=3,即0層的通道數為3。
現在在網絡的第一層使用一個3×3的過濾器來提取特征,那么 f[1]=3f^{[1]} = 3f[1]=3,而 s[1]=1s^{[1]} = 1s[1]=1,p[1]=0p^{[1]} =0p[1]=0,所以高度和寬度使用 valid 卷積。如果有10個過濾器,那么神經網絡下一層的激活值為37×37×10,其中 nH[1]=nW[1]=37n_{H}^{[1]} = n_{W}^{[1]} = 37nH[1]?=nW[1]?=37,nc[1]=10n_{c}^{[1]} = 10nc[1]?=10,nc[1]n_{c}^{[1]}nc[1]?等于第一層中過濾器的個數,之所以是10是因為用了10個過濾器,又因為 vaild 卷積,所以公式 n+2p?fs+1\frac{n + 2p - f}{s} + 1sn+2p?f?+1 的計算結果是37,即 39+0?31+1=37\frac{39 + 0 - 3}{1} + 1 = 37139+0?3?+1=37,這(37×37×10)是第一層激活值的維度。
假設還有另外一個卷積層,這次采用的過濾器是5×5的,那么在標記法中,神經網絡下一層的 f=5f=5f=5,即 f[2]=5f^{\left\lbrack 2 \right\rbrack} = 5f[2]=5 步幅為2,即 s[2]=2s^{\left\lbrack 2 \right\rbrack} = 2s[2]=2,而 padding 為0,即 p[2]=0p^{\left\lbrack 2 \right\rbrack} = 0p[2]=0,且有20個過濾器。所以其輸出結果17×17×20,即 37+0?52+1=17\frac{37 + 0 - 5}{2} + 1 = 17237+0?5?+1=17,因此 nH[2]=nW[2]=17n_{H}^{\left\lbrack 2 \right\rbrack} = n_{W}^{\left\lbrack 2 \right\rbrack} = 17nH[2]?=nW[2]?=17,nc[2]=20n_{c}^{\left\lbrack 2 \right\rbrack} = 20nc[2]?=20。
是不是很驚訝,因為這次的大小從37×37減小到17×17,減小了一半還多,因為步幅是2,維度縮小得很快,而過濾器是20個,所以通道數也是20,17×17×20即激活值 a[2]a^{\left\lbrack 2 \right\rbrack}a[2] 的維度。
你以為這就完事了?當然不可能!!!不過這是最后一個卷積層了,假設過濾器還是5×5,步幅為2,即 f[2]=5f^{\left\lbrack 2 \right\rbrack} = 5f[2]=5,s[3]=2s^{\left\lbrack 3 \right\rbrack} = 2s[3]=2,計算過程略了,相信你一定會了,不會的話,去看前面的例子!假設使用了40個過濾器,padding 為0,所以最后結果為7×7×40。
到此,這張39×39×3的輸入圖像就處理完畢了,并且為圖片提取了7×7×40個特征,計算出來就是1960個特征。現在需要對該卷積進行處理,可以將其平滑或展開成1960個單元,是不是想起了什么,沒錯就是 深度學習入門筆記(二):神經網絡基礎、深度學習入門筆記(十四):Softmax!!!即 logistic 回歸單元或是 softmax 回歸單元,至于如何選取完全取決于我們是想識圖片上有沒有貓,還是想識別 KKK 種不同對象中的一種,不過無論是哪一種,有一定需要明確的是,最后這一步是處理所有數字(1960個數字),并把它們展開成一個很長的向量。
這就是卷積神經網絡的一個典型范例,其實在設計卷積神經網絡時,確定這些超參數比較費工夫:即決定濾器的大小、步幅、padding 以及使用多少個過濾器。隨著神經網絡計算深度不斷加深,通常開始時的圖像也要更大一些,初始值為39×39,高度和寬度會在一段時間內保持一致,然后隨著網絡深度的加深而逐漸減小,從39到37,再到17,最后到7,而通道數量在逐漸增加,從3到10,再到20,最后到40。這是卷積神經網絡中的一種趨勢,但是這些參數應該如何設置才會讓輸出結果更好?
之前寫過一個調參經驗,有興趣的童鞋可以看一看,深度學習100問之提高深度學習模型訓練效果(調參經驗),后面有機會的話會再說一說。
到這里,卷積層就基本說完了,一個典型的卷積神經網絡CNN(大話卷積神經網絡CNN(干貨滿滿))通常有三種層類型:
- 一個是卷積層,常常用 Conv 來標注,即上面講的;
- 一個是池化層,常常用 POOL 來標注;
- 最后一個是全連接層,常常用 FC 來標注。
雖然僅用卷積層也有可能構建出很好的神經網絡,但大部分神經網絡架構師依然會添加池化層和全連接層,不過幸運的是,池化層和全連接層比卷積層更容易設計。
2、池化層
池化層是干什么的呢?
顯然你很好奇,卷積網絡經常使用池化層來縮減模型的大小,提高計算速度,同時提高所提取特征的魯棒性。
先舉一個池化層的例子,假如輸入是一個4×4矩陣,用到的池化類型是最大池化(max pooling),執行最大池化的樹池其實也是一個2×2矩陣只需要拆分成不同的區域即可,這里用四個顏色來表示,即紫色、藍色、綠色、紅色。
現在最大池化要做什么事呢,就是輸出每個顏色區域中的最大元素值。
這很容易,左上區域的最大值是9,右上區域的最大元素值是2,左下區域的最大值是6,右下區域的最大值是3,看起來像是應用了一個規模為2的過濾器,步幅是2,這些就是最大池化的超參數。
卷積的方式是對最大池化功能的最直觀理解了,把4×4輸入看作是某些特征的集合,也就是神經網絡中某一層的非激活值集合,數字大意味著可能探測到了某些特定的特征,可能是一個垂直邊緣,一只眼睛,或是大家害怕遇到的 CAP 特征。最大化操作的功能就是在任何一個象限內提取到某個最大化的輸出特征,你肯定在想為啥得是最大池化,別的不行嗎,必須承認,人們使用最大池化的主要原因是此方法在很多實驗中效果都很好。。。盡管剛剛描述的直觀理解經常被引用,但是還是要盡量理解最大池化效率很高的真正原因。
其中一個有意思的原因就是,最大池化雖然有一組超參數,但并沒有參數需要學習(前面提到了),所以在實際學習過程中,梯度下降沒有什么可學的,速度自然就快,所以在這里你應該很容易能聯想到,卷積也可以實現池化,不過區別是卷積是帶有參數的,而池化不是。
池化只是求值計算,不存在梯度下降;卷積是矩陣運算,存在梯度下降。
另外還有一種類型的池化,平均池化,因為它不太常用,所以這里就簡單地介紹一下,顧名思義,平均池化求得不是每個過濾器的最大值,而是平均值。
下面例子中,紫色區域的平均值是3.75,后面依次是1.25、4和2,所以這個平均池化的超級參數 f=2f=2f=2,s=2s=2s=2,當然也可以選擇其它超級參數,不過公認如此。
小結:
目前來說,最大池化在很多方面比平均池化更常用,但也有例外,就是深度很深的神經網絡。。。一會看個例子。
池化的超級參數包括過濾器大小 fff 和步幅 sss,常用的參數值為 f=2f=2f=2,s=2s=2s=2,應用頻率非常高,其效果相當于高度和寬度縮減一半,至于其它超級參數就要看用的是最大池化還是平均池化了。
輸入通道與輸出通道個數相同,因為對每個通道都做了池化,不過需要注意的一點是,池化過程中沒有需要學習的參數,因此執行反向傳播時,反向傳播沒有參數適用于池化,速度較快。
3、卷積神經網絡
到目前為止(深度學習入門筆記),構建全卷積神經網絡的構造模塊,都已經掌握得差不多了,下面來看個網絡。
假設有一張大小為32×32×3的輸入圖片,這是一張 RGB 模式的圖片,所以是3通道,現在想做的是手寫體數字識別,因為圖片中含有某個數字,比如7,你想識別它是從0-9這10個數字中的哪一個,那么如何構建一個神經網絡來實現這個功能?
有靈氣的小伙伴應該猜到了,其實這就是一個手寫數字識別。
我用的這個網絡模型和經典網絡 LeNet-5 非常相似,LeNet-5 是多年前(史前時代)由 Yann LeCun 大佬創建的,這里使用的模型并不是 LeNet-5,但是許多參數選擇都與 LeNet-5 相似,以后會將 LeNet-5的。
輸入是32×32×3的矩陣,假設第一層使用過濾器大小為5×5,步幅是1,padding 是0,過濾器個數為6,那么輸出是多少?(別說你不會,不會的去面壁吧)
輸出為28×28×6,將這層標記為 CONV1,對該層增加了偏差,應用了非線性函數,可能是 ReLU 非線性函數(效果較佳),最后輸出 CONV1 的結果。
然后構建一個池化層(最大池化),參數 f=2f=2f=2,s=2s=2s=2,步幅為2,表示層的高度和寬度會減少一半,因此28×28變成了14×14,通道數量保持不變,所以最終輸出為14×14×6,將該輸出標記為 POOL1。
要學會給自己的網絡層起名字,不然有你的好果子吃。
人們發現在卷積神經網絡文獻中,卷積有兩種分類,這與所謂層的劃分存在一致性:
- 一類卷積是一個卷積層和一個池化層一起作為一層,即神經網絡的 Layer1。
- 另一類卷積是把卷積層作為一層,而池化層單獨作為一層。
這有什么關系呢?
這與人們在計算神經網絡有多少層有關,不過通常只統計具有權重和參數的層,因為池化層沒有權重和參數,只有一些超參數,所以很多時候不把它作為一個層數,即把 CONV1 和 POOL1 共同作為一個卷積,并標記為 Layer1。
下面再為它構建一個卷積層,過濾器大小為5×5,步幅為1,不過這次用16個過濾器,最后輸出一個10×10×16的矩陣,標記為 CONV2。
然后繼續執行做最大池化計算,參數 f=2f=2f=2,s=2s=2s=2,你現在應該能猜到結果了才對么?
參數 f=2f=2f=2,s=2s=2s=2,高度和寬度減半,通道數和之前一樣,結果為5×5×16,標記為 POOL2,這就是 Layer2(一個權重集和一個卷積層)。
然后做一個平整,5×5×16矩陣包含400個元素,POOL2 的輸出結果被平整化為一個大小為400的一維向量,可以想象這是一個神經元集合,然后利用這400個單元去構建下一層網絡,假設下一層含有120個單元,這就是我們的第一個全連接層,標記為 FC3,為什么叫全連接層,是因為這400個單元與120個單元緊密相連,每一項都連接在一起,它的權重矩陣為 W[3]W^{\left\lbrack 3 \right\rbrack}W[3],維度為120×400,這就是所謂的全連接。
然后對這個120個單元再添加一個全連接層,這層更小,假設它含有84個單元,標記為 FC4。
最后,用這84個單元填充一個 softmax 單元,你應該記得的,如果網絡的目的是想識別手寫0-9這10個數字,這個 softmax 就會有10個輸出,分別對應識別為十個數字的概率。
這個例子中的卷積神經網絡很典型,但是我們的版本和原始版本還是有些區別,不要著急,這個會在后面提到!
接下來我們講講神經網絡的激活值形狀,激活值大小和參數數量。
輸入為32×32×3,這些數做乘法,結果為3072,所以激活值 a[0]a^{[0]}a[0] 有3072維,激活值矩陣為32×32×3,輸入層沒有參數。計算其他層的時候,試著自己計算出激活值,這些都是網絡中不同層的激活值形狀和激活值大小。
以第一個卷積層為例,參數大小計算如下:
5×5×8+5×5×1=2085×5×8+5×5×1 = 2085×5×8+5×5×1=208
其中5是濾波器大小,8是濾波器通道數,1是偏差。
有幾點要注意,
- 第一,池化層和最大池化層沒有參數;
- 第二,卷積層的參數相對較少。
- 第三,許多參數都存在于神經網絡的全連接層。
通過觀察可發現,隨著神經網絡的加深,激活值尺寸會逐漸變小,但是如果激活值尺寸下降太快,也會影響神經網絡性能,所以需要逐漸減小,在示例中,激活值尺寸在第一層為6000,然后減少到1600,慢慢減少到84,最后輸出 softmax 結果。
那么如何把這些基本模塊(卷積層、池化層、全連接層)整合起來,構建高效的神經網絡?目前階段很多說法是經驗主義,這一點確實不可否認,因為整合這些基本模塊確實需要深入的理解,比如根據我的經驗,找到整合基本構造模塊最好方法就是大量閱讀別人的案例,但是模型是否真的不可解釋,當然不是,歡迎關注后續。
4、為什么使用卷積?
最后,我們來分析一下卷積在神經網絡中如此受用的原因,和只用全連接層相比,卷積層的兩個主要優勢在于參數共享和稀疏連接,舉例說明一下。
假設有一張32×32×3維度的圖片,用了6個大小為5×5的過濾器去卷積,輸出維度為28×28×6,32×32×3=3072,28×28×6=4704。即我們構建的神經網絡,其中一層含有3072個單元,而它的下一層含有4074個單元,兩層中的每個神經元彼此相連,然后計算權重矩陣,那么就是4074×3072≈1400萬,哇!
所以要訓練的參數很多很多,雖然以現在的技術計算也不是不可以,但是用1400多萬個參數來訓練網絡,肯定是不可行的,
- 一方面是因為這張32×32×3的圖片非常小,如果這是一張1000×1000的圖片,權重矩陣會變得非常大;
- 另一方面是網絡深度較大,如果這是一個100層的深度神經網絡,最終需要學習的參數會變得非常大。
而現在每個過濾器都是5×5,一個過濾器有25個參數,再加上偏差參數,那么每個過濾器就有26個參數,一共有6個過濾器,所以參數共計156個,參數數量還是很少。
為什么?
兩個原因:
- 一是參數共享。觀察發現,特征檢測,如垂直邊緣檢測,如果適用于圖片的某個區域,那么它也可能適用于圖片的其他區域。也就是說,每個特征檢測器以及輸出都可以在輸入圖片的不同區域中使用同樣的參數,以便提取垂直邊緣或其它特征(不僅適用于邊緣特征這樣的低階特征,同樣適用于高階特征),例如提取臉上的眼睛,貓或者其他特征對象都是比較相似的。
- 二是使用 稀疏連接,簡單解釋下,這個0是通過3×3的卷積計算得到的,它只依賴于這個3×3的輸入的單元格,右邊這個輸出單元(元素0)僅與36個輸入特征中9個相連接,而且其它像素值都不會對輸出產生任影響,這就是稀疏連接的概念。
再舉一個例子,這個輸出(右邊矩陣中紅色標記的元素30)僅僅依賴于這9個特征(左邊矩陣紅色方框標記的區域),看上去只有這9個輸入特征與輸出相連接,其它像素對輸出沒有任何影響。
神經網絡可以通過這兩種機制(參數共享、稀疏連接)減少參數,以便用更小的訓練集來訓練它,從而有效地預防過度擬合(深度學習入門筆記(十):正則化)。
你們可能也聽過,卷積神經網絡善于捕捉平移不變,通過觀察可以發現,向右移動兩個像素,圖片中的貓依然清晰可見,因為神經網絡的卷積結構使得即使移動幾個像素,這張圖片依然具有非常相似的特征,應該屬于同樣的輸出標記!!!實際上,我們用同一個過濾器生成各層中,圖片的所有像素值,希望網絡通過自動學習變得更加健壯,以便更好地取得所期望的平移不變屬性,這就是卷積或卷積網絡在計算機視覺任務中表現良好的原因。
最后,整合起來這些層,看看如何訓練這些網絡。
比如要構建一個貓咪檢測器,那么有一個標記訓練集,xxx 表示一張圖片,y^\hat{y}y^? 是二進制標記或某個重要標記,選定了一個卷積神經網絡,輸入圖片,增加卷積層和池化層,然后添加全連接層,最后輸出一個 softmax,即 y^\hat{y}y^?。卷積層和全連接層有不同的參數 www 和偏差 bbb,定義代價函數并隨機初始化其參數 www 和 bbb,代價函數 JJJ 等于神經網絡對整個訓練集的預測的損失總和再除以 mmm(即 Cost?J=1m∑i=1mL(y^(i),y(i))\text{Cost}\ J = \frac{1}{m}\sum_{i = 1}^{m}{L(\hat{y}^{(i)},y^{(i)})}Cost?J=m1?∑i=1m?L(y^?(i),y(i))),然后使用梯度下降法,或其它算法,例如 Momentum 梯度下降法,含 RMSProp 或其它因子的梯度下降來優化神經網絡中所有參數,以減少代價函數 JJJ 的值,通過上述操作,就可以構建一個高效的貓咪檢測器或其它檢測器。
到這里就把上面提到了基本全部講完了,歡迎在推薦閱讀中尋找相應的部分查看。
推薦閱讀
- 深度學習入門筆記(一):深度學習引言
- 深度學習入門筆記(二):神經網絡基礎
- 深度學習入門筆記(三):求導和計算圖
- 深度學習入門筆記(四):向量化
- 深度學習入門筆記(五):神經網絡的編程基礎
- 深度學習入門筆記(六):淺層神經網絡
- 深度學習入門筆記(七):深層神經網絡
- 深度學習入門筆記(八):深層網絡的原理
- 深度學習入門筆記(九):深度學習數據處理
- 深度學習入門筆記(十):正則化
- 深度學習入門筆記(十一):權重初始化
- 深度學習入門筆記(十二):深度學習數據讀取
- 深度學習入門筆記(十三):批歸一化(Batch Normalization)
- 深度學習入門筆記(十四):Softmax
- 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
- 深度學習入門筆記(十六):計算機視覺之邊緣檢測
- 深度學習入門筆記(十七):深度學習的極限在哪?
- 深度學習入門筆記(十八):卷積神經網絡(一)
- 深度學習入門筆記(十九):卷積神經網絡(二)
- 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)
參考文章
- 吳恩達——《神經網絡和深度學習》視頻課程
總結
以上是生活随笔為你收集整理的深度学习入门笔记(十九):卷积神经网络(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王乐畅草书签名怎么写
- 下一篇: 【音乐编程】基础知识一