VGG:使用基礎卷積塊的網絡

2021-02-23 皮皮魯的科技星球
AlexNet在LeNet的基礎上增加了卷積層,但AlexNet對卷積窗口、輸出通道數和構造順序均做了大量的調整。雖然AlexNet指明了深度卷積神經網絡有出色的表現,但並沒有提供簡單的規則以指導後來的研究者如何設計新的網絡。

VGG網絡是Oxford的Visual Geometry Group組提出的,VGG網絡是實驗室名字的縮寫。VGG論文闡述了其在ImageNet 2014挑戰賽上的一些發現,提出了可以通過重複使用基礎塊(Block)來構造深度模型。

VGG塊

一般地,構建CNN基礎塊的規律是:

VGG論文中提出的方法是:連續使用數個相同的填充為1、窗口形狀為3 × 3的卷積層後緊接一個步幅為2、窗口形狀為2 × 2的最大池化層。卷積層保持輸入和輸出的高和寬不變,而池化層對輸入的尺寸減半。

對於給定的感受野(與輸出有關的輸入圖片的局部大小),採用堆積的小卷積核優於採用大的卷積核,因為增加網絡深度可以保證網絡能學習到更複雜的模式,而且整個模型的參數更少,代價還比較小。

我們使用vgg_block()方法來實現這個基礎的VGG塊,這個方法有幾個參數:該塊中卷積層的數量、輸入輸出通道數。

def vgg_block(num_convs, in_channels, out_channels):
    '''
    Returns a block of convolutional neural network

        Parameters:
            num_convs (int): number of convolutional layers this block has
            in_channels (int): input channel number of this block
            out_channels (int): output channel number of this block

        Returns:
            a nn.Sequential network: 
    '''
    layers=[]
    for _ in range(num_convs):
        # (input_shape - 3 + 2 + 1) / 1 = input_shape
        layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    # (input_shape - 2 + 2) / 2 = input_shape / 2
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*layers)

VGG網絡

VGG與AlexNet、LeNet類似,VGG網絡分為兩大部分,前半部分是卷積層和池化層模塊,後半部分是全連接層模塊。

從AlexNet到VGG:使用基礎塊構建深度神經網絡

卷積層和池化層模塊由多個基礎塊連接組成,即vgg_block()方法返回的基礎塊,我們只需要給vgg_block()方法提供:該塊中包含的卷積層數,該塊的輸入和輸出通道數。我們定義變量conv_arch,該變量是一個列表,列表中每個元素為元組(a list of tuples)。conv_arch定了每個VGG塊裡卷積層個數和輸入輸出通道數。全連接層模塊則跟AlexNet中的一樣。下面的vgg()方法會返回整個VGG網絡,輸入參數是conv_arch。

def vgg(conv_arch):
    '''
    Returns the VGG network

        Parameters:
            conv_arch ([(int, int)]): a list which contains vgg block info.
                the first element is the number of convolution layers this block have.
                the latter element is the output channel number of this block.

        Returns:
            a nn.Sequential network: 
    '''
    # The convolutional part
    conv_blks=[]
    in_channels=1
    for (num_convs, out_channels) in conv_arch:
        conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
        in_channels = out_channels

    return nn.Sequential(
        *conv_blks, nn.Flatten(),
        # The fully-connected part
        nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 10))

現在我們構造一個VGG網絡。它有5個卷積塊,前2塊使用單卷積層,而後3塊使用雙卷積層。第一塊的輸入輸出通道分別是1和64,第一塊的輸入通道數根據所使用的數據集而定,Fashion-MNIST數據的通道數為1,對於ImageNet等數據集,輸入通道數一般為3。之後每次對輸出通道數翻倍,直到變為512。因為這個網絡使用了8個卷積層和3個全連接層,所以經常被稱為VGG-11。

在代碼層面,定義變量conv_arch,中間包含多個元組,每個元組第一個元素為該塊的卷積層個數,第二個元素為輸出通道數。

conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))

net = vgg(conv_arch)

模型的訓練過程與之前分享的LeNet、AlexNet基本相似。原始碼已經發布到了GitHub:https://github.com/luweizheng/machine-learning-notes/blob/master/neural-network/cnn/pytorch/vgg-fashionmnist.py

小結VGG通過多個基礎卷積塊來構造網絡。基礎塊需要定義卷積層個數和輸入輸出通道數。VGG論文認為,更小(例如3 × 3)的卷積層比更大的卷積層效率更高,因為可以增加更多的層,同時參數又不至於過多。

參考資料

Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition.http://d2l.ai/chapter_convolutional-modern/vgg.html

相關焦點

  • 圖像分類-卷積網絡閱讀筆記(二)VGG
    ,主要的貢獻是通過使用具有非常小的卷積核的網絡結構以增加網絡的深度,當權值層增加到16-19層使網絡的性能有了明顯的提升。隨著卷積神經網絡在計算機視覺領域越來越通用,為取得更好的精度,已經有很多人嘗試改變AlexNet原始的結構,例如在第一個卷積層中使用更小的感受窗口和更小的步長。
  • VGG網絡詳解
    在卷積神經網絡中,決定某一層輸出結果中一個元素所對應的輸入層的區域大小,被稱為感受野(receptive field)。通俗的解釋是,輸出feature map上的一個單元對應輸入層上的區域大小。下面使用深度學習框架pytorch搭建VGG網絡,IDE環境為Pycharm2020.2.3,Pytorch1.7.1,python3.6.8。
  • 深度理論VGG-NET 網絡
    VGGNet的主要特點在於:(1)網絡很深;(2)卷積層中使用的卷積核很小,且都是3*3的卷積核。方法使用了卷積神經網絡,其中卷積核為3x3卷積核,按照模型的層數,分為11-19層,其中16層的模型為VGG-16,19層的為VGG-19論文中,作者測試了A-E不同深度的神經網絡。
  • 《Computer vision》筆記-VGGNet(2)
    VGG主要的工作貢獻就是基於小卷積核的基礎上,去探尋網絡深度對結果的影響。VGG網絡結構VGG網絡的架構圖如下圖所示:好吧,上面那張圖看起來眼花繚亂,實際上上圖展示了不同層數的VGG,分別是11層,13層,16層,19層,不同層數的網絡訓練出來的網絡模型大小如下:
  • 零基礎入門深度學習(七):圖像分類任務之VGG、GoogLeNet和ResNet
    授課講師 | 孫高峰 百度深度學習技術平臺部資深研發工程師授課時間 | 每周二、周四晚20:00-21:00本課程是百度官方開設的零基礎入門深度學習課程,主要面向沒有深度學習技術基礎或者基礎薄弱的同學VGG通過使用一系列大小為3x3的小尺寸卷積核和pooling層構造深度卷積神經網絡,並取得了較好的效果。VGG模型因為結構簡單、應用性極強而廣受研究者歡迎,尤其是它的網絡結構設計方法,為構建深度神經網絡提供了方向。圖3 是VGG-16的網絡結構示意圖,有13層卷積和3層全連接層。
  • 資源 | 如何利用VGG-16等模型在CPU上測評各深度學習框架
    目前這兩個網絡的參數都是隨機生成的,因為我們只需要測試輸入數據通過神經網絡的測試時間。最後的結果並不能保證絕對正確,但作者希望能與我們共同測試並更新結果。以下分別展示了 20 次迭代(有點少)的平均運行時間和標準差,其中每種模型是否使用了 MKL 等 CPU 加速庫也展示在結果中。
  • 基礎入門,怎樣用PaddlePaddle優雅地寫VGG與ResNet
    非線性變化: 卷積層、全連接層後面一般都會接非線性變化函數,例如Sigmoid、Tanh、ReLu等來增強網絡的表達能力,在CNN裡最常使用的為ReLu激活函數。 Dropout [1] : 在模型訓練階段隨機讓一些隱層節點權重不工作,提高網絡的泛化能力,一定程度上防止過擬合。
  • 經典CNN網絡(Lenet、Alexnet、GooleNet、VGG、ResNet、DenseNet)
    殘差網絡做了相加的操作,inception做了串聯的操作圖:inception v1    Googlenet的核心思想是inception,通過不垂直堆砌層的方法得到更深的網絡(我的理解是變寬且視野範圍種類多,vgg及resnet讓網絡變深,inception讓網絡變寬
  • 「模型解讀」從LeNet到VGG,看卷積+池化串聯的網絡結構
    你可以把(5*5*1)想像成一個厚度為1,長度,寬度各為5的卷積塊,以下依此類推。1.Input輸入圖像統一歸一化為32*32。2.C1卷積層經過(5*5*1)*6卷積核,stride=1, 生成featuremap為28*28*6。
  • 手把手教你用 PyTorch 快速準確地建立神經網絡
    動態計算圖:PyTorch被稱為「由運行定義的」框架,這意味著計算圖結構(神經網絡體系結構)是在運行時生成的。該屬性的主要優點是:它提供了一個靈活的編程運行時接口,通過連接操作來方便系統的構建和修改。在PyTorch中,每個前向通路處定義一個新的計算圖,這與使用靜態圖的TensorFlow形成了鮮明的對比。
  • 使用eNSP搭建基礎網絡
    使用eNSP搭建基礎網絡實驗1-1 搭建基礎IP 網絡學習目標 掌握eNSP模擬器的基本設置方法
  • 卷積神經網絡之 - VGGNet
    VGG-19 的網絡結構設計要點預處理過程:圖片每個像素中減去在訓練集上的圖片計算 RGB 均值所有隱藏層都配備了 ReLU 激活全局使用 3×3 小卷積,可以有效的減少參數,2 個 3×3 卷積可以替代一個
  • 網絡分析儀基礎功能使用技巧
    本文開啟網絡分析儀使用的「傻瓜模式」,目標是讓沒有網絡分析儀基礎和經驗的人,也能得到準確的測試數據。
  • 深度學習算法優化:VGG,ResNet,DenseNe 模型剪枝代碼實戰
    深度學習算法優化系列七 | ICCV 2017的一篇模型剪枝論文,也是2019年眾多開源剪枝項目的理論基礎 。這篇文章是從源碼實戰的角度來解釋模型剪枝,源碼來自:https://github.com/Eric-mingjie/network-slimming 。我這裡主要是結合源碼來分析每個模型的具體剪枝過程,希望能給你剪枝自己的模型一些啟發。
  • VGGNet、ResNet、Inception和Xception圖像分類及對比
    該網絡使用 3×3 卷積核的卷積層堆疊並交替最大池化層,有兩個 4096 維的全連接層,然後是 softmax 分類器。16 和 19 分別代表網絡中權重層的數量(即列 D 和 E):圖 1 深層網絡配置示例在 2015 年,16 層或 19 層網絡就可以認為是深度網絡,但到了 2017 年,深度網絡可達數百層。
  • 科普丨一文了解殘差網絡
    深層神經網絡能夠從訓練數據中提取大量的解釋模式或特徵,並學習非常複雜但有意義的表達。這些特徵或模式的提取和發現可以歸功於神經網絡的深度,因為它們更容易在網絡的後期發現。隨著輸入到神經網絡的問題的性質變得越來越困難,研究人員開始開發越來越深的模型來獲得更高的結果精度。據觀察,深層神經網絡比淺層次神經網絡表現更好。
  • 圖神經網絡入門(五)不同類型的圖
    (一)GCN 圖卷積網絡圖神經網絡入門(二)GRN 圖循環網絡圖神經網絡入門(三)GAT 圖注意力網絡圖神經網絡入門(四)GRN圖殘差網絡在此前介紹的所有工作基本上都圍繞無向的這麼做的有G2S網絡,把AMR(Abstract Meaning Representation)圖轉化為Levi圖並使用GGNN(Gated Graph Neural Network,是一種圖循環網絡GRN,在之前的文章裡有簡單介紹)。G2S的節點編碼部分傳播過程如下:
  • 深入了解VGG卷積神經網絡濾波器
    本節將使用 keras-vis,一個用於可視化 VGG 預建網絡學到的不同濾波器的 Keras 軟體包。
  • 用PaddlePaddle 和 Tensorflow 實現經典 CNN 網絡 GoogLeNet
    簡單解釋下稀疏性,當整個特徵空間是非線性甚至不連續時: 學好局部空間的特徵集更能提升性能,類似於 Maxout 網絡中使用多個局部線性函數的組合來擬合非線性函數的思想;假設整個特徵空間由 N 個不連續局部特徵空間集合組成,任意一個樣本會被映射到這 N 個空間中並激活/不激活相應特徵維度,如果用 C1 表示某類樣本被激活的特徵維度集合