一文讀懂物體分類AI演算法:LeNet-5 AlexNet VGG Inception ResNet MobileNet
1 引言
當前深度學習十分火熱,深度學習網路模型對於降低錯誤率的重要作用不言而喻。深度學習應用場景主要分為三類:物體識別與分類,物體檢測,自然語言處理。在物體識別與分類領域,隨著AlexNet在2012年一炮走紅,深度學習重新燃起了一片熱情。從Lenet5第一次使用卷積開始,經歷了AlexNet VGG Inception ResNet等各種模型,錯誤率也一再降低。ResNet-152 top-5錯誤率僅為3%左右,遠低於人眼的5.1%。本文主要講解各種網路模型的結構,他們的特點,以及這些特點為何能減少訓練時間和降低錯誤率。
2 LeNet-5
LeNet-5的出現標誌著CNN卷積神經網路在AI領域的出現,CNN以視覺感受野和權值共享的思想,大大減少了模型引數,使得深度學習模型訓練成為了可能。但由於誕生於1998年,GPU的概念都還沒有提出,CPU的效能又是極其低下,而且LetNet-5只能使用在手寫字識別等很簡單的應用場景,故一直沒有火起來。但作為CNN應用的開山鼻祖,學習CNN勢必先從學習LetNet-5開始。LeNet-5網路結構如下圖
LeNet-5輸入為32x32的二維畫素矩陣,由於是灰度圖,輸入通道為1,其正向傳播步驟為
- 先經過一層5x5的卷積,feature map為6,也就是輸出通道為6。由於沒有在圖片四周加padding,畫素矩陣大小變為了28x28。這一層引數量為(5x5+1)x6 = 156。
- 然後經過一層2x2的平均值池化層進行下采樣。畫素矩陣大小變為了14x14
- 再經過一層5x5的卷積,feature map為16。畫素矩陣大小變為了10x10。這一層引數量為(5x5x6+1)x16 = 2416
- 然後經過一層2x2的最大值池化層。畫素矩陣大小變為了5x5
- 在經過一層5x5的卷積,feature map為120。畫素矩陣大小變為了1x1。這一層引數量為(5x5x16+1)x120 = 48120
- 然後經過一層全連線層, 輸出為84.故這一層引數量為84x120 = 10080
- 最後一層為Gaussian Connections輸出層,輸出0~9共10個分類。目前主流輸出層已經由softmax來代替
LeNet-5的特點如下
- 使用了卷積來提取特徵,結構單元一般為卷積 - 池化 -非線性啟用
- 已經加入了非線性啟用,啟用函式採用了tanh和sigmoid,目前大多數情況下我們使用的是relu
- 池化層使用的是平均值池化,目前大多數情況下我們使用最大值池化
- 分類器使用了Gaussian Connections,目前已經被softmax替代
3 AlexNet
AlexNet在2012年以16.4%的顯著優勢問鼎ILSVRC的冠軍,重新燃起了人們對於深度學習研究的熱情。它第一次採用了relu,dropout,GPU加速等技巧,引數量為6000萬,模型大小240M左右。其網路結構如下
AlexNet輸入圖片為224x224, 輸入為RGB三通道。正向傳播共5個卷積層和3個全連線層,步驟為
- conv1-relu1-pool1-lrn1: 11x11的卷積,步長為4, 輸出通道96,也就是96個特徵圖。分為兩組,每組48個通道。然後通過一層relu的非線性啟用。在經過一層最大值池化,池化核大小3x3, 步長為2。最後再經過一層LRN,區域性響應歸一化。第一層運算後圖片大小為27x27x96
- conv2-relu2-pool2-lrn2: 第二層的輸入即為第一層的輸出,也就是27x27x96的畫素矩陣。96個feature map分成兩組,分別在兩個GPU中進行運算。卷積核大小為5x5, 步長為1,輸出通道為128. 然後進過一層relu非線性啟用。再經過一層最大值池化,池化核大小仍然為3x3, 步長為2. 最後再經過一層LRN。第二層運算後為兩組13x13x128的圖片
- conv3-relu3: 第三層的輸入為第二層的輸出,也就是13x13x128的畫素矩陣。先經過卷積核大小為3x3x192的卷積運算,步長為1。然後就是relu非線性啟用。注意這一層沒有max-pooling和LRN。第三層運算後為兩組13x13x192
- conv4-relu4: 第四層先經過卷積核大小為3x3, 步長為1的卷積運算,然後經過relu非線性啟用。第四層運算後尺寸仍然為兩組13x13x192的圖片
- conv5-relu5-pool5:第五層先經過卷積核大小為3x3, 輸出通道128,步長為1的卷積運算,然後經過relu非線性啟用。最後經過一層大小為3x3, 步長為2的max-pooling, 第五層運算後為兩組6x6x128的圖片
- fc6-relu6-dropout6: 第六層為全連線層,輸入為兩組6x6x128, 組合在一起也就是6x6x256。輸出通道為4096。經過relu和dropout後輸出。輸出為4096的一維向量
- fc7-relu7-dropout7: 第七層為全連線層,輸入為4096的一維向量,輸出也為4096的一維向量,也就是4096x4096的全連線。然後通過relu和dropout輸出。輸出為4096的一維向量。
- fc8: 第八層為全連線層,輸入為4096的一維向量,輸出為1000的一維向量,對應1000個分類的輸出。也就是4096x1000的全連線。輸出為1000的一維向量。經過這一層後就可以通過softmax得到1000個分類的分類結果了。
AlexNet的結構特點為
- 採用relu替代了tanh和sigmoid啟用函式。relu具有計算簡單,不產生梯度彌散等優點,現在已經基本替代了tanh和sigmoid
- 全連線層使用了dropout來防止過擬合。dropout可以理解為是一種下采樣方式,可以有效降低過擬合問題。
- 卷積-啟用-池化後,採用了一層LRN,也就是區域性響應歸一化。將一個卷積核在(x,y)空間畫素點的輸出,和它前後的幾個卷積核上的輸出做權重歸一化。
- 使用了重疊的最大值池化層。3x3的池化核,步長為2,因此產生了重疊池化效應,使得一個畫素點在多個池化結果中均有輸出,提高了特徵提取的豐富性
- 使用CUDA GPU硬體加速。訓練中使用了兩塊GPU進行並行加速,使得模型訓練速度大大提高。
- 資料增強。隨機的從256x256的原始圖片中,裁剪得到224x224的圖片,從而使一張圖片變為了(256-224)^2張圖片。並對圖片進行映象,旋轉,隨機噪聲等資料增強操作,大大降低了過擬合現象。
4 VGG
VGG為ILSVRC 2014年第二名,它探索了卷積網路深度和效能,準確率之間的關係。通過反覆堆疊3x3卷積和2x2的池化,得到了最大19層的深度。VGG19模型大概508M,錯誤率降低到7.3%。VGG模型不復雜,只有3x3這一種卷積核,卷積層基本就是卷積-relu-池化的結構,沒有使用LRN,結構如下圖。
VGG的特點如下
- 採用了較深的網路,最多達到19層,證明了網路越深,高階特徵提取越多,從而準確率得到提升。
- 串聯多個小卷積,相當於一個大卷積。VGG中使用兩個串聯的3x3卷積,達到了一個5x5卷積的效果,但引數量卻只有之前的9/25。同時串聯多個小卷積,也增加了使用relu非線性啟用的概率,從而增加了模型的非線性特徵。
- VGG-16中使用了1x1的卷積。1x1的卷積是價效比最高的卷積,可以用來實現線性變化,輸出通道變換等功能,而且還可以多一次relu非線性啟用。
- VGG有11層,13層,16層,19層等多種不同複雜度的結構。使用複雜度低的模型的訓練結果,來初始化複雜度高模型的權重等引數,這樣可以加快收斂速度。
5 Google Inception
Google Inception是一個大家族,包括inceptionV1 inceptionV2 inceptionV3 inceptionV4等結構。它主要不是對網路深度的探索,而是進行了網路結構的改進。inceptionV1擊敗了VGG,奪得2014年ILSVRC冠軍。之後Google又對其網路結構進行了諸多改進,從而形成了一個大家族。
5.1 InceptionV1
inceptionV1是一個設計十分精巧的網路,它有22層深,只有500萬左右的引數量,模型大小僅為20M左右,但錯誤率卻只有6.7%。它的網路結構特點如下
- 去除了最後的全連線層,而使用全域性平均池化來代替。這是模型之所以小的原因。AlexNet和VGG中全連線幾乎佔據了90%的引數量。而inceptionV1僅僅需要1000個引數,大大降低了引數量
- inception module的使用。借鑑與Network in Network的思想,提出了inception module的概念,允許通道並聯來組合特徵。其結構如下
inception module分為並聯的四路,分別為單獨的1x1卷積,1x1並聯3x3, 1x1並聯5x5, 池化後1x1卷積。使用不同的卷積結構來提取不同特徵,然後將他們組合在一起來輸出。
- 使用了1x1,3x3,5x5等不同尺寸的卷積,增加了提取特徵面積的多樣性,從而減小過擬合
5.2 inceptionV2
inceptionV2和V1網路結構大體相似,其模型大小為40M左右,錯誤率僅4.8%,低於人眼識別的錯誤率5.1%。主要改進如下
- 使用兩個串聯3x3卷積來代替5x5卷積,從而降低引數量,並增加relu非線性。這一點參考了VGG的設計
- 提出了Batch Normalization。在卷積池化後,增加了這一層正則化,將輸出資料歸一化到0~1之間,從而降低神經元分佈的不一致性。這樣訓練時就可以使用相對較大的學習率,從而加快收斂速度。在達到之前的準確率之後還能繼續訓練,從而提高準確率。V2達到V1的準確率時,迭代次數僅為V1的1/14, 從而使訓練時間大大減少。最終錯誤率僅4.8%
5.3 inceptionV3
inceptionV3的網路結構也沒太大變化,其模型大小96M左右。主要改進如下
- 使用非對稱卷積。用1x3+3x1的卷積來代替一個3x3的卷積,降低了引數的同時,提高了卷積的多樣性
- 分支中出現了分支。如下圖
5.4 inceptionV4
inceptionV4主要是借鑑了resNet殘差網路的思想,可以看做是inceptionV3和resNet的結合。inceptionV4模型大小163M,錯誤率僅僅為3.08%。主要在ResNet網路中講解
6 ResNet
6.1 ResNetV1
ResNet由微軟提出,並奪得了2015年ILSVRC大賽的冠軍。它以152層的網路深度,將錯誤率降低到只有3.57%,遠遠低於5.1%的人眼識別錯誤率。它同樣利用全域性平均池化來代替全連線層,使得152層網路的模型不至於太大。網路中使用了1x1 3x3 5x5 7x7等不同尺寸的卷積核,從而提高卷積的多樣性。resNetV1_152模型大小為214M,不算太大。
ResNet提出了殘差思想,將輸入中的一部分資料不經過神經網路,而直接進入到輸出中。這樣來保留一部分原始資訊,防止反向傳播時的梯度彌散問題,從而使得網路深度一舉達到152層。當前有很多人甚至訓練了1000多層的網路,當然我們實際使用中100多層的就遠遠足夠了。殘差網路如下圖
ResNet的主要特點,就一個字,深!
6.2 ResNetV2
ResNetV2相對於V1的最大變化,就是借鑑了inceptionV2的BN歸一化思想,這樣來減少模型訓練時間。
7 MobileNet
為了能將模型部署在終端上,需要在保證準確率的前提下,減小模型體積,並降低預測時的計算時間,以提高實時性。為了能到達這一目的,Google提出了mobileNet框架。最終mobileNetV1_1.0_224模型以16M的大小,可以達到90%的top-5準確率。模型甚至可以壓縮得更小,mobileNetV1_0.25_128只有10M左右,仍然能達到80%的準確率。
7.1 mobileNet depthwise原理
mobileNet模型的核心是,將一個普通的卷積拆分成了一個depthwise卷積和一個1x1的普通卷積(也叫pointwise卷積)。depthwise卷積層的每個卷積只和輸入的某一個channel進行計算,而combining則由1x1的卷積來負責。如下圖
對於卷積核dk*dk,輸入通道為M,輸出通道為N的普通卷積,每個輸出通道都是由M個卷積分別和輸入通道做計算,然後累加出來,所以需要的引數量為dk x dk x M x N。而對於depthwise卷積,每個卷積只和輸入通道的某一個通道發生計算,並且不需要累加操作,其卷積後的輸出通道和輸入通道相等,仍然為M。然後再經過一層1x1的普通卷積。故其引數為dk x dk x M + 1 x 1 x M x N。
mobileNet引數量比原來減少了多少呢,我們由下面的計算可以得出
(dk x dk x M + 1 x 1 x M x N) / (dk x dk x M x N) = 1/N + 1/(dk^2)
由於輸出通道一般都比較大,為48 96 甚至4096, 故一般取1/(dk^2), 對於最常見的3x3卷積,mobileNet引數量可以降低為原來的1/9.
7.2 mobileNet網路結構
mobileNet一共包含28層,第一層的卷積為普通卷積,之後的卷積為分解的3x3 depthwise卷積和1x1 pointwise卷積。另外,最後有一個全域性平均池化層和全連線層。並利用softmax得到分類結果。如下圖所示
7.3 mobileNet可裁剪化
為了得到更小的模型,mobileNet還可以進行輸入通道和解析度的剪裁,稱為Width Multiplier 和 Resolution Multiplier。Width Multiplier 表示輸入通道變為baseline的多少倍, Resolution Multiplier表示輸入影象縮小為多少。經過剪裁後的mobileNetV1_0.25_128模型,只有10M左右,準確率仍然可達到80%左右。作為端上影象預處理完全足夠。下面是Width Multiplier 和 Resolution Multiplier的結果
8 總結
CNN已經廣泛應用在物體識別和分類領域,短短几年間就出現了AlexNet VGG inception ResNet等優秀的神經網路結構,並且每隔幾個月就問世一種優秀網路結構,可以說是百花齊放。這要歸功於TensorFlow等框架的成熟和GPU等硬體效能的提升,使得網路結構的設計和驗證日趨平民化。各種網路結構,其實本質上也是在解決神經網路的幾大痛點問題,如下
- 減少模型引數量,降低模型體積
- 加快訓練收斂速度,減少訓練耗時
- 加快模型預測計算時間,提高實時性。這主要還是通過減少引數量來達到
- 減少過擬合問題
- 減少網路層級過深時的梯度彌散問題
學習網路模型,不應該去死記硬背,因為有源源不斷的網路結構湧現。我們應該重點掌握每個模型的特點,以及他們是如何來解決上面列舉的這些神經網路痛點的。
相關文章
- 經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNetCNN模型架構Go
- 經典卷積神經網路結構——LeNet-5、AlexNet、VGG-16卷積神經網路
- 從Inception v1到Inception-ResNet,一文概覽Inception家族的「奮鬥史」
- 使用自己的資料集訓練MobileNet、ResNet實現影象分類(TensorFlow)
- 【Flutter】一文讀懂混入類MixinFlutter
- 演算法金 | 一文讀懂K均值(K-Means)聚類演算法演算法聚類
- 影像分類丨Inception家族進化史「GoogleNet、Inception、Xception」Go
- 五分鐘讀懂UML類圖
- 一文讀懂SAP Leonardo物聯網平臺
- 一文讀懂影象壓縮演算法演算法
- 一文讀懂SuperEdge拓撲演算法演算法
- 一文讀懂物聯網和邊緣計算
- 一文讀懂層次聚類(Python程式碼)聚類Python
- 5.AlexNet貓狗分類(Lightning框架)框架
- 一文讀懂mavenMaven
- 一文讀懂ServletServlet
- 讀懂物聯網
- 一文讀懂雲上DevOps能力體系dev
- 經典卷積神經網路LeNet&AlexNet&VGG卷積神經網路
- 使用TensorFlow slim資料夾當中的inception_resnet_v2網路訓練自己的分類資料集
- 知物由學 | 一文讀懂Android資原始檔保護Android
- 【物聯網】別讓阿里獨吞!一文讀懂物聯網萬億大蛋糕阿里
- 一文讀懂特徵工程特徵工程
- 一文讀懂 NPM 版本NPM
- 一文讀懂 Apache PulsarApache
- 一文讀懂Ka/Ks
- 一文讀懂 Data Mesh
- 一文讀懂微核心
- 一文讀懂eBPF/XDPeBPF
- Laravel7——一文讀懂中介軟體原始碼Laravel原始碼
- 一文讀懂Spring整合RedisSpringRedis
- 一文讀懂擁塞控制
- 一文讀懂支付系統
- 一文讀懂:GBDT梯度提升梯度
- 一文讀懂前端快取前端快取
- 一文讀懂“負載均衡”負載
- 一文讀懂web組態Web
- 一文讀懂「雲託管」