深度卷積網(wǎng)絡:實例探究

1.經(jīng)典的卷積網(wǎng)絡

介紹幾種經(jīng)典的卷積神經(jīng)網(wǎng)絡結構,分別是LeNet、AlexNet、VGGNet。
LeNet-5
LeNet-5主要是針對灰度設計的,所以其輸入較小,為32×32×1,其結構如下:

在LetNet中,存在的經(jīng)典模式:

  • 隨著網(wǎng)絡的深度增加,圖像的大小在縮小,與此同時,通道的數(shù)量卻在增加;
  • 每個卷積層后面接一個池化層。

AlexNet
AlexNet直接對彩色的大圖片進行處理,其結構如下:

  • 與LeNet相似,但網(wǎng)絡結構更大,參數(shù)更多,- - 表現(xiàn)更加出色;
  • 使用了Relu;
  • 使用了多個GPUs;
  • LRN(后來發(fā)現(xiàn)用處不大,丟棄了)

AlexNet使得深度學習在計算機視覺方面受到極大的重視。

VGG-16
VGG卷積層和池化層均具有相同的卷積核大小,都使用3×3,stride=1,SAME的卷積和2×2,stride=2 的池化。其結構如下:

2. ResNet

非常深的神經(jīng)網(wǎng)絡是很難訓練的,因為存在梯度消失和梯度爆炸問題,我們利用跳遠連接,它可以從某一網(wǎng)絡層獲取激活,然后迅速反饋給另外一層,甚至是神經(jīng)網(wǎng)絡的更深層,我們可以利用跳遠連接構建ResNet能夠訓練深度網(wǎng)絡,有時候深度可以超過100層。
ResNet是由殘差塊所構建。
殘差快
下面是一個普通的神經(jīng)網(wǎng)絡塊的傳輸:


其前向傳播的計算步驟為:

  • Linear:z[l+1]=W[l+1]a[l]+b[l+1]
  • Relu:a[l+1]=g(z[l+1])
  • Linear:z[l+2]=W[l+2]a[l+1]+b[l+2]
  • Relu:a[l+2]=g(z[l+2])

而ResNet塊則將其傳播過程增加了一個從a[l]直接到z[l+2].的連接,將其稱之為“short cut”或者“skip connection”:


也就是前向傳播公式的最后一個步驟變?yōu)椋篴[l+2]=g(z[l+2]+a[l])

增加“short cut”后,成為殘差塊的網(wǎng)絡結構:


注意這里是連接在Relu激活函數(shù)之前。

Residual Network:

每兩層增加一個捷徑,多個殘差塊堆積起來構成ResNet網(wǎng)絡結構,其結構如下:



沒有“short cut”的普通神經(jīng)網(wǎng)絡和ResNet的誤差曲線:


  • 在沒有殘差的普通神經(jīng)網(wǎng)絡中,訓練的誤差實際上是隨著網(wǎng)絡層數(shù)的加深,先減小再增加;
  • 在有殘差的ResNet中,即使網(wǎng)絡再深,訓練誤差都會隨著網(wǎng)絡層數(shù)的加深逐漸減小。

ResNet對于中間的激活函數(shù)來說,有助于能夠達到更深的網(wǎng)絡,解決梯度消失和梯度爆炸的問題。

3.ResNets為什么表現(xiàn)如此好

假設有個比較大的神經(jīng)網(wǎng)絡,輸入為x,輸出為a[l]。如果我們想增加網(wǎng)絡的深度,這里再給網(wǎng)絡增加一個殘差塊:


假設網(wǎng)絡中均使用Relu激活函數(shù),所以最后的輸出激活值a?0。這里我們給出a[l+2]的值:
a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])
如果使用L2正則化或者權重衰減,會壓縮W和b的值,如果W[l+2]=0同時b[l+2]=0,那么上式就變成:
a[l+2]=g(z[l+2]+a[l])=g(a[l])=relu(a[l])=a[l]
所以從上面的結果我們可以看出,對于殘差塊來學習上面這個恒等函數(shù)是很容易的。所以在增加了殘差塊后更深的網(wǎng)絡的性能也并不遜色于沒有增加殘差塊簡單的網(wǎng)絡。所以盡管增加了網(wǎng)絡的深度,但是并不會影響網(wǎng)絡的性能。同時如果增加的網(wǎng)絡結構能夠學習到一些有用的信息,那么就會提升網(wǎng)絡的性能。
同時由于結構a[l+2]=g(z[l+2]+a[l]),ResNet在設計中使用了很多相同的卷積,以保持z[l+2]和a[l]的維度相同。
將普通深度神經(jīng)網(wǎng)絡變?yōu)镽esNet:
在兩個相同的卷積層之間增加“skip connection”

4.1x1卷積

過濾器是1×1,這里數(shù)字是2,輸入一張6×6×1的,結果相當于把這個圖片乘以數(shù)字2,用1×1的過濾器進行卷積似乎用處不大,在二維上的卷積相當于圖片的每個元素和一個卷積核數(shù)字相乘。 如果是一張6×6×32的圖片,那么使用1×1的過濾器進行卷積效果更好,具體來說1×1卷積所實現(xiàn)的功能是遍歷這36個單元格。1×1×32過濾器中的32個數(shù)字可以這樣理解,一個神經(jīng)元輸入個數(shù)是32,乘以相同高度和寬度上某個切片上的32個數(shù)字。這32個數(shù)字具有不同信道,乘以32個權重,然后應用ReLU非線性函數(shù)。
但是在三維上,與1×1×nC卷積核進行卷積,相當于三維圖像上的1×1×nC的切片,也就是nC個點乘以卷積數(shù)值權重,通過Relu函數(shù)后,輸出對應的結果。而不同的卷積核則相當于不同的隱層神經(jīng)元結點與切片上的點進行一一連接。 所以根本上1×1卷積核相當于對一個切片上的nC個單元都應用了一個全連接的神經(jīng)網(wǎng)絡。

1x1卷積應用:


假設一個28×28×129的輸入層,可以使用池化層壓縮它的高度和寬度,可以用32個1×1的過濾器,每個過濾器的大小都是1×1×192維
維度壓縮:使用目標維度的1×1的卷積核個數(shù)。
增加非線性:保持與原維度相同的1×1的卷積核個數(shù)。

5. Inception Network

Inception Network 的作用就是使我們無需去考慮在構建深度卷積神經(jīng)網(wǎng)絡時,使用多大的卷積核以及是否添加池化層等問題。Inception Network 就是代替我們來做決定。
例如:一個 28×28×192維度的輸入層,Inception Network網(wǎng)絡層的作用就是代替人工來確定卷積層中的過濾器類型,或者確定是否需要創(chuàng)建卷積層或池化層



在上面的Inception結構中,應用了不同的卷積核,以及帶padding的池化層,它是一種特殊的池化形式。在保持輸入圖片大小不變的情況下,通過不同運算結果的疊加,增加了通道的數(shù)量,這里的最終輸出為32+32+128+64=256。

6.計算成本的問題:

對于上面的5×5大小卷積核的計算成本:


  • 1 filters:5×5×192;
  • 32 個 filters;
  • 總的計算成本:28×28×32×5×5×192=120M(對于輸出每個數(shù)字都需要執(zhí)行5×5×192次乘法運算,乘以輸出值個數(shù))

對于1×1大小卷積核用作過渡的計算成本,也將下面的中間的層叫做“bottleneck layer”(瓶頸層):
輸入是28×28×192,輸出是28×28×32,和前面相同,但是先把輸入層壓縮成這個較小的中間層,只有 16個信道,而不是192。


  • 1×1卷積層計算成本:28×28×16×1×1×192=2.4M
  • 5×5卷積層計算成本:28×28×32×5×5×16=10.0M
  • 總的計算成本:2.4M+10.0M=12.4M

與前面網(wǎng)絡作比較,計算成本從1.2億下降到1240萬。
所以1×1卷積核作為bottleneck layer”的過渡層能夠有效減小卷積神經(jīng)網(wǎng)的計算成本。事實證明,只要合理地設置“bottleneck layer”,既可以顯著減小上層的規(guī)模,同時又能降低計算成本,從而不會影響網(wǎng)絡的性能

7.Inception模塊

Inception模塊會將之前層的激活或者輸出作為它的輸入,將上面說介紹的兩種主要思想和模式結合到一起構成 Inception 模塊,如下:



多個Inception 模塊的堆疊構成Inception Network,下面是GoogleNet的結構:


學會使用開源,例如github

從開源項目開始是一個好方法

8.遷移學習

小數(shù)據(jù)集:

如今在深度學習領域,許多研究者都會將他們的工作共享到網(wǎng)絡上。在我們實施自己的工作的時候,比如說做某種物體的識別分類,但是只有少量的數(shù)據(jù)集,對于從頭開始訓練一個深度網(wǎng)絡結構是遠遠不夠的。

但是我們可以應用遷移學習,應用其他研究者建立的模型和參數(shù),用少量的數(shù)據(jù)僅訓練最后自定義的softmax網(wǎng)絡。從而能夠在小數(shù)據(jù)集上達到很好的效果。


假設要建立一個貓的檢測器用來檢測自己的寵物貓,在這個例子中,你只需要把前面這些層的權重都凍結,由于前面權重都凍結相當于一個固定函數(shù),不需要改變。取輸入圖像X,將它映射到softmax層之前的激活函數(shù)層得到一個特征向量 ,然后用這個特征向量做預測。

大數(shù)據(jù)集:

如果我們在自己的問題上也擁有大量的數(shù)據(jù)集,我們可以多訓練后面的幾層??傊S著數(shù)據(jù)集的增加,我們需要“ freeze”的層數(shù)越來越少。最后如果我們有十分龐大的數(shù)據(jù)集,那么我們可以訓練網(wǎng)絡模型的所有參數(shù),將其他研究者訓練的模型參數(shù)作為參數(shù)的初始化來替代隨機初始化,來加速我們模型的訓練。


對于很多計算機視覺任務 ,如果你下載其他人的開源權重并用作你問題的初始化,你會做的更好,計算機視覺將會經(jīng)常用到遷移學習,除非有一個極其大的訓練集,可以從頭開始訓練所有東西,總之,遷移學習值得考慮。

9.數(shù)據(jù)擴充

與其他機器學習問題相比,在計算機視覺領域當下最主要的問題是沒有辦法得到充足的數(shù)據(jù)。所以在我們訓練計算機數(shù)據(jù)模型的時候,數(shù)據(jù)的擴充就是會非常有用。
數(shù)據(jù)擴充的方法:

  • 鏡像翻轉(Mirroring);
  • 隨機剪裁(Random Cropping);
  • 色彩轉換(Color shifting):
    為圖片的RGB三個色彩通道進行增減值,如(R:+20,G:-20,B:+20);PCA顏色增強:對圖片的主色的變化較大,圖片的次色變化較小,使總體的顏色保持一致。

計算機視覺現(xiàn)狀

數(shù)據(jù)和手工工程:
不同問題當前的數(shù)據(jù)集大小:

在有大量數(shù)據(jù)的時候,我們更傾向于使用簡單的算法和更少的手工工程。因為此時有大量的數(shù)據(jù),我們不需要為這個問題來精心設計特征,我們使用一個大的網(wǎng)絡結果或者更簡單的模型就能夠解決。
相反,在有少量數(shù)據(jù)的時候,我們從事更多的是手工工程。因為數(shù)據(jù)量太少,較大的網(wǎng)絡結構或者模型很難從這些少量的數(shù)據(jù)中獲取足夠的特征,而手工工程實際上是獲得良好表現(xiàn)的最佳方式。

對于機器學習應用,知識來源:

  • 標記數(shù)據(jù),(x,y);
  • 手工特征工程/網(wǎng)絡結構/其他構建。

在基準研究和比賽中,下面的tips可能會有較好的表現(xiàn):

  • Ensembling:獨立地訓練多個網(wǎng)絡模型,輸出平均結果或加權平均結果;
  • 測試時的 Multi-crop:在測試圖片的多種版本上運行分類器,輸出平均結果。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容