卷積神經網絡學習路線(八)| 經典網絡回顧之ZFNet和VGGNet

2021-03-06 GiantPandaCV

開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。

前言

這是卷積神經網絡學習路線的第八篇文章,我們來回顧一下經典網絡中的ZF-Net和VGGNet。

穩中求勝-ZFNet

ZFNet是ImageNet分類任務2013年的冠軍,其在AlexNet的結構上沒有做多大改進。首先作者Matthew D Zeiler提出了一種新的可視化技術,該技術可以深入了解中間特徵圖的功能和分類器的操作。這一點我在卷積神經網絡學習路線(一)| 卷積神經網絡的組件以及卷積層是如何在圖像中起作用的?詳細介紹過。最終基於特徵圖的可視化結果發現以下兩點:

AlexNet第一層中有大量的高頻(邊緣)和低頻(非邊緣)信息的混合,卻幾乎沒有覆蓋到中間的頻率信息。由於第一層卷積用的步長為4,太大,導致了有非常多的混疊情況,學到的特徵不是特別好看,不像是後面的特徵能看到一些紋理、顏色等。

因此作者針對第一個問題將AlexNet的第一層的卷積核大小從改成。同時針對第二個問題將第一個卷積層的卷積核滑動步長從改成

同時,ZFNet將AlexNet的第卷積層變為。然後就完了,可以看到ZFNet並沒有特別出彩的地方,因此這一年的ImageNet分類競賽算是比較平靜的一屆。

ZFNet的詳細網絡結構如下圖:

在這裡插入圖片描述

ZFNet的代碼實現如下:

def ZF_Net():
model = Sequential()
model.add(Conv2D(96,(7,7),strides=(2,2),input_shape=(224,224,3),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Conv2D(256,(5,5),strides=(2,2),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000,activation='softmax'))
return model

越來越深-VGGNet

在2014年的ImageNet挑戰賽上,牛津大學的VGG(Visual Geometry Group)Net贏得了定位任務的關娟和分類任務的亞軍。VGGNet相比於前面的AlexNet,仍然沿用了卷積加全連接的結構,但深度更深。VGGNet的論文全名為:Very Deep Convolutional Networks for Large-Scale Visual Recognition》。

我們來看一下VGGNet的具體網絡結構:

這個表格有意思了啊,他分為 種網絡。這是因為當時為了解決初始化權重的問題,VGG使用的是預訓練的方式,即先訓練一部分小網絡,然後確保這部分網絡收斂之後再在這個基礎上逐漸加深。並且當網絡在D階段(VGG-16)效果是最好的,E階段(VGG-19)次之。VGG-16指的是網絡的卷積層和全連接層的層數為。接下來我們仔細看一下VGG-16的結構圖:

在這裡插入圖片描述

從上圖可以看到網絡的第一個卷積層的通道數為,然後每一層Max Pooling之後卷積層的通道數都成倍的增加,最後接看三分全連接層完成分類任務。總的來說VGGNet的貢獻可以概括如下兩點:

所有隱藏層都使用了ReLU激活函數,而不是LRN(Local Response Normalization),因為LRN浪費了更多了內存和時間並且性能沒有太大提升。使用更小的卷積核和更小的滑動步長。和AlexNet相比,VGG的卷積核大小只有兩種。卷積核的感受野很小,因此可以把網絡加深,同時使用多個小卷積核使得網絡總參數量也減少了。

其中卷積核相比於一個大尺寸的卷積核有更多的非線性函數,使得模型更有判別性。同時,多個層比一個大的卷積核參數更少,例如假設卷積層的輸出特徵圖和輸出特徵圖的大小分別是,,那麼三個卷積核的參數為。而一個的卷積核參數為。而至於為什麼卷積核可以代替一個卷積核,這是因為這兩者的感受野是一致的,並且多個小卷積核非線性更多,效果更好。

卷積的引入是在不影響輸入輸出維數的情況下,對輸入進行線性形變,然後通過Relu進行非線性處理,增加網絡的非線性表達能力。

VGG-16的代碼實現如下:

def VGG_16():
model = Sequential()

model.add(Conv2D(64,(3,3),strides=(1,1),input_shape=(224,224,3),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(128,(3,2),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(128,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000,activation='softmax'))

return model

後記

今天講解了經典網絡ZFNet和VGGNet,讓我們至少明白了一個東西,神經網絡在2014年這個時期是在往更深的角度去發展。同時小卷積核的堆疊可以取代大卷積核。

卷積神經網絡學習路線往期文章

歡迎關注我的微信公眾號GiantPandaCV,期待和你一起交流機器學習,深度學習,圖像算法,優化技術,比賽及日常生活等。

相關焦點

  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    Batch Normalization。這是我一直在使用的技巧,可以很大程度的加快收斂速度。建議搭建自己網絡的時候儘量加上BN,如果有BN了全連接層就沒必要加Dropout了。目標檢測不能盲目去掉fpn結構。在針對自己的數據調檢測任務如yolov3的時候不能盲目砍掉fpn結構,儘管你分析出某個分支的Anchor基本不可能會對你預測的目標起作用,但如果你直接去掉分支很可能會帶來漏檢。優化器的選擇。
  • 圖像分類-卷積網絡閱讀筆記(二)VGG
    ,主要的貢獻是通過使用具有非常小的卷積核的網絡結構以增加網絡的深度,當權值層增加到16-19層使網絡的性能有了明顯的提升。隨著卷積神經網絡在計算機視覺領域越來越通用,為取得更好的精度,已經有很多人嘗試改變AlexNet原始的結構,例如在第一個卷積層中使用更小的感受窗口和更小的步長。
  • 卷積神經網絡之 - VGGNet
    Networks for Large-Scale Image Recognition》論文中,作者給出了 6 個 VGG 模型,對應不同的網絡結構和深度,具體結構如下:不同的網絡結構這樣的連接方式使得網絡參數量更小,而且多層的激活函數令網絡對特徵的學習能力更強。多個 3*3 的卷積核比一個較大尺寸的卷積核有更多層的非線性函數,增加了非線性表達,使判決函數更具有判決性。結合 1×1 卷積層是增加決策函數非線性而不影響卷積層感受野的一種方式。訓練設置:批量大小設為 256,動量為 0.9。
  • TensorFlowNews五大經典卷積神經網絡介紹:LeNet / AlexNet / GoogLeNet / VGGNet/
    前言:這個系列文章將會從經典的卷積神經網絡歷史開始,然後逐個講解卷積神經網絡結構,代碼實現和優化方向。(以下內容來翻譯自史丹福大學課程:http://cs231n.github.io/convolutional-networks/)在卷積網絡領域有幾個有名字的體系結構。
  • 深度理論VGG-NET 網絡
    深度學習VGG-NET 網絡概述VGG名字來源於Visual Geometry Group, Department of Engineering
  • 【長文詳解】卷積神經網絡常見架構AlexNet、ZFNet、VGGNet、GoogleNet和ResNet模型的理論與實踐
    LeNet-5模型誕生於1998年,是Yann LeCun教授在論文Gradient-based learning applied to document recognition中提出的,它是第一個成功應用於數字識別問題的卷積神經網絡,麻雀雖小五臟俱全,它包含了深度學習的基本模塊:卷積層,池化層,全連接層。是其他深度學習模型的基礎。
  • 經典CNN網絡(Lenet、Alexnet、GooleNet、VGG、ResNet、DenseNet)
    每一個group對應N/M個channel,與之獨立連接。然後各個group卷積完成後將輸出疊在一起(concatenate),作為這一層的輸出channel。局部響應歸一化LRN:利用前後幾層(對應位置的點)對中間這一層做一下平滑約束,增加泛化能力,公式為:
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。卷積神經網絡的每一層都將3維的輸入數據變化為神經元3維的激活數據並輸出。在下圖中,紅色的輸入層代表輸入圖像,所以它的寬度和高度就是圖像的寬度和高度,它的深度是3(代表了RGB 3種顏色通道)。
  • DenseNet——CNN經典網絡模型詳解(pytorch實現)
    DenseNet——CNN經典網絡模型詳解(pytorch實現)一個CV小白,寫文章目的為了讓和我意義的小白輕鬆如何,讓大佬鞏固基礎(手動狗頭),大家有任何問題可以一起在評論區留言討論~一、概述論文:Densely Connected Convolutional Networks 論文連結:https://arxiv.org/pdf
  • VGG:使用基礎卷積塊的網絡
    AlexNet在LeNet的基礎上增加了卷積層,但AlexNet對卷積窗口、輸出通道數和構造順序均做了大量的調整。雖然AlexNet指明了深度卷積神經網絡有出色的表現,但並沒有提供簡單的規則以指導後來的研究者如何設計新的網絡。
  • 深度學習、圖像分類入門,從VGG16卷積神經網絡開始
    、卷積神經網絡的時候非常懵逼,不知道從何入手,我覺得應該有一個進階的過程,也就是說,理應有一些基本概念作為奠基石,讓你有底氣去完全理解一個龐大的卷積神經網絡:本文思路:一、我認為學習卷積神經網絡必須知道的幾個概念:1、卷積過程:  我們經常說卷積神經網絡卷積神經網絡,到底什麼才是卷積?網絡層卷積過程到底怎麼實現?
  • 卷積神經網絡學習路線(十八) | Google CVPR 2018 MobileNet V2
    MobileNet-V2的來源Mobilenet-V1的出現推動了移動端的神經網絡發展。但MobileNet V1主要使用的Depthwise Conv(深度可分離卷積)雖然降低了9倍的計算量,但遺留了一個問題是我們在實際使用的時候訓練完發現kernel有不少是空的。
  • 卷積神經網絡的前世今生
    深度學習在技術與應用上的突破引發了第三次人工智慧浪潮,獲得了空前成功。在前述章節的基礎上,本章將主要介紹訓練卷積神經網絡和深度神經網絡的重要方法與技巧,深度神經網絡的遷移學習策略,以及如何訓練深度神經網絡以解決實際問題等內容。
  • AMS機器學習課程:Keras深度學習 - 卷積神經網絡正則化
    - 卷積神經網絡》由於要擬合大量的權重,並且要處理的數據量有限,如果神經網絡受到不適當的約束,它們很容易過度擬合數據集中的噪聲。儘管使用卷積和池化確實可以充當正則化器,但對於具有許多權重的網絡,可能需要其他正則化技術。我們將討論兩種常見的正則化技術:權重衰減 (Weight decay) 和丟棄法 (Dropout)。權重衰減權重衰減 (Weight decay) 是一種通過在損失函數中包含懲罰項來約束回歸模型權重的方法,該函數將權重的總大小最小化。 懲罰項的影響由參數 alpha 控制。
  • 在深度學習的革命中,談談卷積神經網絡(CNN)
    #掃描上方二維碼進入報名#文章連結:https://my.oschina.net/u/876354/blog/1620906
  • 卷積神經網絡算法的一個實現
    卷積神經網絡CNN是Deep Learning的一個重要算法,在很多應用上表現出卓越的效果,[1]中對比多重算法在文檔字符識別的效果,結論是CNN優於其他所有的算法。CNN在手寫體識別取得最好的效果,[2]將CNN應用在基於人臉的性別識別,效果也非常不錯。前段時間我用BP神經網絡對手機拍照圖片的數字進行識別,效果還算不錯,接近98%,但在漢字識別上表現不佳,於是想試試卷積神經網絡。
  • AlexNet、VGGNet、ResNet、Inception、DenseNet體系結構簡介
    AlexNet層的詳細信息AlexNet是第一個在ImageNet分類上表現出色的大規模卷積神經網絡體系結構。AlexNet在比賽中大大超越了以前所有基於非深度學習的模型。池化層的輸出為27 x 27 x 96,池化層不學習任何東西,因為參數是嘗試學習的權重。網絡一開始有11 x 11個filters,然後是5x5和3x3。最後,我們有兩個大小為4096的全連接層,最後一層是FC8到softmax,也就是1000個ImageNet類。該架構是ReLu非線性的首次使用。
  • 資源 | 如何利用VGG-16等模型在CPU上測評各深度學習框架
    目前這兩個網絡的參數都是隨機生成的,因為我們只需要測試輸入數據通過神經網絡的測試時間。最後的結果並不能保證絕對正確,但作者希望能與我們共同測試並更新結果。若再加上隨機生成的權重,那麼整個測試僅僅能測試各深度學習框架的在 CPU 上運行相同模型的時間。以下分別展示了 20 次迭代(有點少)的平均運行時間和標準差,其中每種模型是否使用了 MKL 等 CPU 加速庫也展示在結果中。
  • 卷積神經網絡學習路線(十一)| Stochastic Depth(隨機深度網絡)
    開篇的這張圖代表ILSVRC歷年的Top-5錯誤率,我會按照以上經典網絡出現的時間順序對他們進行介紹,同時穿插一些其他的經典CNN網絡。然而,作者發現ResNet網絡中不是所有的層都是必要的,因此結合經典的Dropout思想提出在訓練過程中隨機丟棄丟掉一些層來優化ResNet的訓練過程。(PS:這不就是把Dropout用到網絡層這個單位嗎?)
  • VGG網絡詳解
    VGG是在2014年由牛津大學著名研究組VGG(Visual Geometry Group)提出,斬獲該年ImageNet競賽中Localization Task(定位任務)第一名和Classification Task(分類任務)第二名。具體的來說,論文中寫到通過堆疊兩個3×3的卷積核代替5×5的卷積核,堆疊三個3×3的卷積核替代7×7的卷積核。