經典卷積神經網絡(CNN)圖像分類算法詳解

本文原創,轉載請引用 https://blog.csdn.net/dan_teng/article/details/87192430

CNN圖像分類網絡

一點廢話:CNN網絡主要特點是使用卷積層,這其實是模擬了人的視覺神經,單個神經元只能對某種特定的圖像特徵產生響應,比如橫向或者縱向的邊緣,本身是非常簡單的,但是這些簡單的神經元構成一層,在層數足夠多後,就可以獲取足夠豐富的特徵。從機制上講,卷積神經網絡與人的視覺神經還真是像。下面進入正題。

LeNet(1998)

網絡基本架構爲:conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax,括號內數字表示channel數。這是個很小的五層網絡(特指卷積或者全連接層),圖中subsampling下采樣是pooling layer, kernel size 是2x2, stride 2,feature map剛好爲上層一半大小。該網絡用於對支票(還是郵政?)的手寫數字分類。網絡受制於當時的硬件條件和訓練數據大小,並未帶來神經網絡的爆發。
LeNet網絡結構

AlexNet(2012)

AlexNet是2012年ILSVRC(ImageNet Large Scale Visual Recognition Challenge)冠軍,以高出10%的正確率力壓第二名,這是CNN網絡首次獲勝,將卷積神經網絡的巨大優勢帶入人們視野。
ILSVRC 歷年top5錯誤率及神經網絡深度(層數):
ILSVRC top5錯誤率及網絡深度
AlexNet基本架構爲:conv1 (96) -> pool1 -> conv2 (256) -> pool2 -> conv3 (384) -> conv4 (384) -> conv5 (256) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。AlexNet有着和LeNet相似網絡結構,但更深、有更多參數。conv1使用11×11的濾波器、步長爲4使空間大小迅速減小(227×227 -> 55×55)。

AlexNet的特點:

  • 第一次使用ReLU激活函數,有更好的梯度特性、訓練更快。
  • 使用了隨機失活(dropout),p=0.5,可以防止過擬合
  • 大量使用數據擴充技術
  • 使用SGD,Momentum 0.9
  • learning rate 1e-2 (0.01), reduced by 10 manually when val accuracy plateaus
  • L2 weight decay 5e-4
  • batch size 128
  • 使用Norm layers(不再使用)

由於當時GPU不夠強大,網絡有兩個分支,放在兩個GPU上分別訓練,當前已經不存在這個問題了,因此也常見到只有一個分支的網絡結構圖。另外需說明的是,圖上表的輸入圖片大小是224,其實應該是227,否則網絡跑不通。

雙分支網絡結構:
AlexNet原網絡單分支網絡結構(當下使用這個就行)
AlexNet單分支網絡結構
ILSVRC 2013冠軍是ZFNet,僅在AlexNet上做了一些改進,沒有突破性技術,這裏不再贅述。

VGGNet

ILSVRC 2014冠軍是GoogLeNet,亞軍是VGG。雖然VGG網絡是亞軍,但是其應用更加廣泛。
VGG網絡作者嘗試了多種結構,較常用的有VGG16和VGG19(VGG16網絡更簡單,性能也可以,應用最廣泛)。
VGG16的基本架構爲conv1^2 (64) -> pool1 -> conv2^2 (128) -> pool2 -> conv3^3 (256) -> pool3 -> conv4^3 (512) -> pool4 -> conv5^3 (512) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。 ^3代表重複3次。
VGG網絡結構
VGG16內存主要消耗在前兩層卷積,而參數最主要在第一層全連接中最多。這裏說的內存消耗,主要是指存儲各層feature map所用的空間,對第一層而言,輸入是圖片,佔用大小就是圖片長×寬×通道數,卷積後輸出佔用的內存就是輸出尺寸乘積;參數量中參數是網絡需要學習的部分,也就是卷積和全連接層的權重矩陣大小,因爲網絡中權重矩陣以kernel形式存在,因此參數量就是kernel的(長x寬x通道數)x個數。
VGG16內存和參數消耗tricks:由於主要參數消耗在fc6(各層命名見後圖)這一層,可以替換爲對上一層7x7x512的feature map 在7x7上做average pooling,得到512個數,也是可行的(Andrej Karpathy在2016 CS231n課上講的),這點在GoogLeNet中有應用。

VGGNet特點:

  • 結構簡單,只有3x3,stride 1,pad 1的卷積和2x2,stride 2的max pooling,每過一次pooling,feature map大小降低一半。
  • 參數量大(參數和內存解析見上圖)
  • 合適的網絡初始化
  • 使用batch normalization
  • FC7提取的特徵對其他任務有幫助。FC7始於AlexNet,表示某一全連接層,該層提取特徵用於分類任務。

VGG16中對各層的命名如下:
VGG16各層命名
需注意的是,VGGNet之所以使用更小的kernel,是因爲3個3x3的conv和1個7x7的conv具有的感受野是相同的,但是3層3x3帶來更深的網絡結構,非線性更強,另外參數量更少:3*(3x3xCxC)vs 7x7xCxC (這裏C是channel數,同時認爲kernel數也是C,等價於輸出的channel是C)

GoogLeNet

GoogLeNet是ILSVRC2014冠軍,取名源自作者所處單位Google,其中L大寫是爲了向LeNet致敬。該網絡如之前所提,使用average pooling代替了最耗參數(相應的也最耗時間)的全連接層,同時使用inception模塊來代替簡單的卷積層(inception的名字來源於盜夢空間中的we need to go deeper的梗);另外,使用1x1的卷積進行了降維。
inception module

ResNet

ResNet是ILSVRC 2015的冠軍。ResNet最大的貢獻在於解決了深層網絡難以訓練的問題(反向傳播梯度彌散),它的網絡深度達到了152層!ResNet網絡結構如下圖所示。
ResNet網絡結構

ResNet網絡之所以能夠訓練下去主要得益於residual block(殘差模塊)的使用。殘差模塊是一種短路連接,如下圖所示。通常的“plain”結構如左側所示,而residual網絡如右側所示,加了一條短路路徑,使得前面的輸入可以直接連接到輸出。原本圖中幾層要學習的是H(x),現在由於多加了輸入x的影響,網絡層需要擬合的變成了F(x) = H(x) - x
residual blockResNet的特點:

  • 使用BN(Batch Normalization)layer在每個conv layer後
  • 每個residual block包含兩個3x3 conv layer
  • 週期性的使用stride 2 pooling降低維度,相當於除2
  • 最耗時的FC層使用pool代替
  • SGD + Momentum 0.9
  • learning rate 0.1, divided by 10 when validation error plateaus
  • Mini-batch size 256
  • Weight decay 1e-5
  • 不使用dropout

截至2017年,典型CNN網絡的準確度和複雜度:
網絡複雜度

參考資料:
斯坦福CS231n 2016/2017 教學視頻和課件
https://zhuanlan.zhihu.com/p/31727402

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章