1. 程式人生 > >卷積神經網路模型概念與理解

卷積神經網路模型概念與理解

博文的編寫,主要參考網上資料並結合個人見解僅供學習交流使用,如有侵權請聯絡博主刪除,原創文章轉載請註明出處。

本文簡單介紹 AlexNet、GoogLeNet、VGG、ResNet四個模型

AlexNet
  • AlexNet (2012 Imagenet Champion )包含了八個學習層,五個卷積層和三個全連線層
    這裡寫圖片描述
    輸入資料:227×227×3
    卷積核:11×11×3;步長:4;數量(也就是輸出個數):96
    卷積後資料:55×55×96
    relu1後的資料:55×55×96
    pool1的核:3×3,步長:2
    pool1後的資料:27×27×96
    norm1:local_size=5
    最後的輸出:27×27×96

    AlexNet 之所以厲害是因為

    1. 非線性啟用函式ReLU:用ReLU代替了傳統的Tanh或者LogisticReLU。本質上是分段線性模型,前向計算非常簡單,無需指數之類操作,ReLU的偏導也很簡單,反向傳播梯度,無需指數或者除法之類操作。ReLU不容易發生梯度發散問題,Tanh和Logistic啟用函式在兩端的時候導數容易趨近於零,多級連乘後梯度更加約等於0
    2. 防止過擬合的方法:Dropout,Data augmentation
    3. Deep Learning領域應該感謝李飛飛團隊搞出來如此大的標註資料集合ImageNet,大資料訓練:百萬級ImageNet影象資料

    最後的輸出1000個全連線層是每一個神經元都代表一個類。每次卷積過後都會有一次非線性變換,非線性變換在學術界和工業界都得到了認可,通常會用到ReLU函式,訓練採用Dropout來防止過擬合。batch size128訓練時候批大小,batch size越大的話訓練起來速度越快,GPU利用的效率越高,有一種觀點認為神經網路是靠資料喂出來的,若增加訓練資料,則能夠提升演算法的準確率,因為這樣可以避免過擬合,而避免了過擬合你就可以增大你的網路結構了。當訓練資料有限的時候,可以通過一些變換來從已有的訓練資料集中生成一些新的資料,來擴大訓練資料的batch size。1 Data Augmentation資料增強,可以

    參考李飛飛老師的cs231課程是最好了。常用的資料增強方法有:水平翻轉 隨機裁剪、平移變換 顏色、光照變。(2) Dropout方法和資料增強一樣,都是防止過擬合的。Dropout應該算是AlexNet中一個很大的創新,以至於Hinton在後來很長一段時間裡的Talk都拿Dropout說事,後來還出來了一些變種,比如DropConnect等。

VGG
  • VGG (2014 Imagenet Champion)
    Simonyan, Karen, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv preprint arXiv:1409.1556 (2014).

    這裡寫圖片描述
    VGG16 和VGG19有13層卷積層加上3層全連線層,特點是卷積層數不斷增加但是pooling層沒有增加,LeNet-5每次卷積加一層pooling是因為不做pooling層的話影象維度特別大,當時的計算處理不好。現在的VGG只需要3到4層卷積層後加pooling層,主要是計算資源比之前強很多。pooling層操作會丟失影象資訊,在計算資源豐富的情況下儘可能的情況下減少pooling層。神經網路的趨勢會是不斷增加捲積層。
    VGGNet 有 5 個卷積群,每一群內有 2~3 個卷積層,每個群連線一個 max-pooling 層來縮小圖片尺寸。每個卷積群內的卷積核數量一樣,越靠後的卷積群的卷積核數量越多:64 – 128 – 256 – 512 – 512。其中經常出現多個完全一樣的 3x3 的卷積層堆疊在一起的情況,可以發現兩個 3x3 的卷積層串聯其實相當於 1 個 5x5 的卷積層,也就是說一個畫素會跟周圍 5x5 的畫素產生關聯。類似的,3 個 3x3 的卷積層串聯的效果則相當於 1 個 7x7 的卷積層。為什麼要堆疊卷積層而不直接用 7x7 的呢?一是因為 3 個串聯的 3x3 的卷積層的引數比 1 個 7x7 的卷積層更少,二是因為 3 個 3x3 的卷積層比 1 個 7x7 的卷積層有更多的非線性變換(前者可以用三次 ReLU 啟用函式,而後者只有一次),對特徵的學習能力更強。VGG結構簡單,同 AlexNet 結構類似,都是卷積層、池化層、全連線層的組合
    GitHub - machrisaa/tensorflow-vgg: VGG19 and VGG16 on Tensorflow

    GooLeNet
  • GooLeNet: 多維度識別
    GooLeNet: 多維度識別
    GooLeNet是2014ILSVRC冠軍,top-5錯誤率6.7%。共9個inception模組,改變CNN原序列結構,採用並行。共22層。
    藍色Convolution層:
    紅色pooling:網路最後採用了average pooling來代替全連線層,想法來自NIN,事實證明可以將TOP1 accuracy提高0.6%。但是,實際在最後還是加了一個全連線層,主要是為了方便以後大家finetune
    黃色Softmax:為了避免梯度消失,網路額外增加了2個輔助的softmax用於向前傳導梯度
    綠色:Other

    Inception 結構發展
    這裡寫圖片描述
    GooLeNet Inception引入了一個相當重要的概念就是當前一層到下面一層 ,Convolution卷積核的大小都是(1x1, 3x3, 5x5),但Inception module是用各種各樣的Convolution疊在一起得出一個輸出,主要目標是找到最優的稀疏結構單元,也就是 Inception module。Inception 結構是將不同的卷積層通過並聯的方式結合在一起,它主要改進了網路內部計算資源的利用率,讓我們能在固定計算資源下增加神經網路深度和寬度,另外,Inception 結構還遵循了 Hebbian 原則並增加了多尺度處理。
    GooLeNet 的 Inception 對特徵圖進行了三種不同的卷積(1x1, 3x3, 5x5)來提取多個尺度的資訊,也就是提取更多的特徵。

    參考:

    Inception v1 有 22 層,但只有 500w 的引數量,是 AlexNet 的 1/12。為什麼要減少引數量?一是因為引數越多,需要餵給模型的資料量就越大,二是因為引數越多,耗費的計算資源就越大。InceptionNet 為什麼引數少而且效果好?一是因為用平均池化層代替了最後的全連線層,二是因為上面解釋的 Inception Module 的作用。

    Inception v2 學習了 VGG,用兩個 3x3 的卷積替代了 5x5 的大卷積(降低引數&減少過擬合),並提出了 Batch Normalization 方法,另外根據 BN 對其他部分做了一些調整,比如增大 learning rate,加快學習衰減速度,去除 dropout 減輕L2 正則,去除 LRN,更徹底的對訓練樣本進行 shuffle 等等。

    Inception v3 優化了 Inception Module 的結構,同時引入了 Factorization into small convolutions 思想,把一個較大的二維卷積拆分成兩個較小的一維卷積,如將 7x7 卷積拆成 1x7 卷積核 7x1 卷積,進一步節約引數減輕過擬合,此外,Inception v3 還增加了一層非線性擴充套件模型表達能力。

    這裡寫圖片描述

    Inception v4 則結合了微軟的 ResNet,在 TOP5 error 上反超了 ResNet 3.1%,Inception 網路就是由多個上面所說的 inception model 堆疊起來的,Inception model 之間可能再通過 max pulling 減小 feature map,論文作者提出,為了 memory efficiency,最好前幾層按正常 CNN 套路來,在深層的時候使用 Inception model。
    nception 網路就是由多個上面所說的 inception model 堆疊起來的,Inception model 之間可能再通過 max pulling 減小 feature map,論文作者提出,為了 memory efficiency,最好前幾層按正常 CNN 套路來,在深層的時候使用 Inception model。
    Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.I

  • ResNet: 機器超越人類識別
    Deep Residual Learning for Image Recognition
    這裡寫圖片描述
    微軟亞洲研究院MSRA何凱明團隊的Residual NetworksResNet,引入了殘差網路結構(residual network),通過殘差網路,可以把網路層弄的很深,據說現在達到了1000多層,最終的網路分類的效果也是非常好,殘差網路的基本結構如下圖所示 這裡寫圖片描述
    主要的創新在殘差網路,其實這個網路的提出本質上還是要解決層次比較深的時候無法訓練的問題。這種借鑑了Highway Network思想的網路相當於旁邊專門開個通道使得輸入可以直達輸出,而優化的目標由原來的擬合輸出H(x)變成輸出和輸入的差H(x)-x,其中H(X)是某一層原始的的期望對映輸出,x是輸入。
    網路層數不斷增加會導致網路優化的問題,梯度消失是神經網路中一個很重要的問題,即使使用了ReLU雖然可以減少梯度消失的問題但不能解決這個問題,ResNet本質上和GooLeNet沒有太大差別,ResNet的區別在與加了跳躍連線,跳躍連線不會導致梯度消失所產生的問題使網路優化變得簡單,相當於網路等效變低了,有跳躍連線這層的話網路層是152/2Residual Net 核心思想是,去擬合殘差函式 F (F = y - h(x)),選 h(x)=x 時效果最好。
    ResNet:Identity Mappings in Deep Residual Networks論文筆記