Network in Network(2013),1x1卷積與Global Average Pooling

博客:blog.shinelee.me | 博客園 | CSDNpython

寫在前面

《Network in Network》簡稱NIN,出自顏水成老師團隊,首次發表在arxiv的時間爲2013年12月,至20190921引用量爲2871(google scholar)。網絡

citations

NIN的網絡結構還是在AlexNet基礎上修改而來,其主要創新點以下:ide

  • 提出了mlpconv layer:mlpconv layer中使用小的多層全鏈接神經網絡(multilayer perceptron, MLP)「micro network」替換掉卷積操做,micro network的權重被該層輸入feature map的全部local patch共享。卷積操做能夠當作線性變換,而micro network能夠擬合更復雜的變換,至關於加強了conv layer的能力。多個mlpconv layer堆疊構成整個網絡,這也是Network in Network名稱的由來。
  • 提出了global average pooling(GAP)NIN再也不使用全鏈接層,最後一層mlpconv layer輸出的feature map數與類別數相同,GAP對每一個feature map求全圖均值,結果直接經過softmax獲得每一個類別的機率。GAP在減小參數量的同時,強行引導網絡把最後的feature map學習成對應類別的confidence map
  • \(1\times 1\) convolution:在mlpconv layer中首次使用了\(1\times 1\)卷積,\(1\times 1\)卷積能夠在不改變尺寸和感覺野的狀況下,靈活調整feature map的channel數,普遍影響了後續網絡的設計,如Inception系列等。

本文將依次介紹上面的創新點,同時順帶介紹 全鏈接 與 卷積的關係、全鏈接與GAP的關係,最後給出NIN的網絡結構。post

mlpconv layer實現

mlpconv

論文中講,mlpconv layer使用一個小的全鏈接神經網絡替換掉卷積,convolution layer與mlpconv layer對比示意圖以下,性能

Comparison of linear convolution layer and mlpconv layer

對於convolution layer,假設有N個kernel,每一個kernel的尺寸爲\(k \times k\),卷積操做將每一個\(k \times k\)大小的local recptive field / local patch線性映射爲N個輸出,彙總全部local patch的卷積結果獲得N個feature map。學習

對於mlpconv layer,使用micro network替換掉卷積,經過micro network將每一個\(k \times k\)的local patch非線性映射爲N個輸出,彙總後仍獲得N個feature map。文中說micro network爲小的全鏈接神經網絡,但在實現時,這個全鏈接神經網絡倒是經過幾個卷積層實現的,爲何呢?由於全鏈接能夠轉化成卷積測試

下面爲《Dive into Deep Learning》中提供一個NIN block(mlpconv layer)的mxnet實現,google

NIN block

from mxnet import gluon, nd
from mxnet.gluon import nn

def nin_block(num_channels, kernel_size, strides, padding):
    blk = nn.Sequential()
    blk.add(nn.Conv2D(num_channels, kernel_size, strides, padding, ctivation='relu'),
            nn.Conv2D(num_channels, kernel_size=1, activation='relu'),
            nn.Conv2D(num_channels, kernel_size=1, activation='relu'))
    return blk

一個NIN block經過1個卷積層和2個\(1 \times 1\)卷積層堆疊而成,這3個卷積層的輸出channel數相同。對於第1個卷積層,由於kernel_size與local patch大小相同,因此對每個local patch而言,這個卷積等價於全鏈接,共num_channels個輸出,每一個輸出與local patch全鏈接的權重就是對應的整個卷積核,卷積核的數量也爲num_channels。對於後面2個\(1\times 1\)的卷積層,輸入都是num_channels維的向量,即num_channels個\(1\times 1\)的feature map,kernel_size與整個feature map的尺寸相同,這個\(1\times 1\)的卷積也就至關於全鏈接了。經過\(1\times 1\)的卷積實現了不一樣卷積核結果間的信息交流。spa

實際上,經過調整\(1\times 1\)卷積核的數量,能夠在不改變輸入feature map尺寸和感覺野的狀況下,靈活地增長或減小feature map的channel數量,引入更多的非線性,表達能力更強,在實現feature map間信息交流的同時,得到信息的壓縮或增廣表示

Global Average Pooling

卷積神經網絡的經典作法是 數個卷積層+幾個全鏈接層,典型視角是將前面的卷積層視爲特徵提取器,將全鏈接層視爲分類器。卷積層的計算量高但參數少,全鏈接層的計算量少但參數多,一種觀點認爲全鏈接層大量的參數會致使過擬合。做者提出了Global Average Pooling(GAP),取代全鏈接層,最後一層mlpconv layer輸出的feature map數與類別數相同,對每個feature map取平均,全鏈接層與GAP的對好比下圖所示,圖片來自Review: NIN — Network In Network (Image Classification),GAP的結果直接輸給softmax獲得每一個類別的機率。

FC vs GAP

去掉全鏈接的GAP強制將feature map與對應的類別創建起對應關係,softmax至關於分數的歸一化,GAP的輸出能夠當作是與每一個類別類似程度的某種度量,GAP的輸入feature map能夠解釋爲每一個類別的置信度圖(confidence map)——每一個位置爲與該類別的某種類似度,GAP操做能夠當作是求取每一個類別全圖置信度的指望。由於只有卷積層,很好地保留了空間信息,增長了可解釋性,沒有全鏈接層,減小了參數量,必定程度上下降了過擬合。

最後一層mlpconv layer輸出的feature map以下,能夠看到圖片label對應的feature map響應最強,強響應基本分佈在目標主體所在的位置。

Visualization of the feature maps from the last mlpconv layer

此外,做者還作將GAP與全鏈接層、全鏈接+dropout對比,在CIFAR-10庫上的測試結果以下,

GAP comparison

GAP能夠當作是一種正則,全鏈接層的參數是學習到的,GAP能夠當作是權值固定的全鏈接層。上面的實驗說明,這種正則對改善性能是有效的。

網絡結構

論文中給出的總體網絡結構以下,

NIN architecture

論文中沒有給出具體的參數配置,實際上,NIN還是在AlexNet基礎上修改而來,至關於在AlexNet的每一個卷積層後插入2個\(1\times 1\)卷積層,移除了Local Response Norm,同時用GAP替換掉全鏈接層。在這裏,mlpconv layer既能夠當作是加強了原conv layer的表達能力,也能夠當作增長了網絡深度。

NIN architecture in d2l

參考

相關文章
相關標籤/搜索