1. 程式人生 > >(Paper)Network in Network網路分析

(Paper)Network in Network網路分析

《Network in Network》論文筆記

1.綜述

這篇文章有兩個很重要的觀點:

  1. 1×1卷積的使用
    文中提出使用mlpconv網路層替代傳統的convolution層。mlp層實際上是卷積加傳統的mlp(多層感知器),因為convolution是線性的,而mlp是非線性的,後者能夠得到更高的抽象,泛化能力更強。在跨通道(cross channel,cross feature map)情況下,mlpconv等價於卷積層+1×1卷積層,所以此時mlpconv層也叫cccp層(cascaded cross channel parametric pooling)。

  2. CNN網路中不使用FC層(全連線層)


    文中提出使用Global Average Pooling取代最後的全連線層,因為全連線層引數多且易過擬合。做法即移除全連線層,在最後一層(文中使用mlpconv)層,後面加一層Average Pooling層。

以上兩點,之所以重要,在於,其在較大程度上減少了引數個數,確能夠得到一個較好的結果。而引數規模的減少,不僅有利用網路層數的加深(由於引數過多,網路規模過大,GPU視訊記憶體等不夠用而限制網路層數的增加,從而限制模型的泛化能力),而且在訓練時間上也得到改進。

2.網路結構

  • 傳統的convolution層

  • 單通道mlpconv層

  • 跨通道mlpconv層(cccp層)


  • 由圖可知,mlpconv=convolution+mlp(圖中為2層的mlp)。

  • 在caffe中實現上,mlpconv=convolution+1×1convolution+1×1convolution(2層的mlp)

3.Caffe中的實現

原文3層mlpconv的完整網路結構

Caffe中4層網路示意圖(ImageNet)

說明:

1.方框為網路層,橢圓為blob
2.黃色pool4為Average Pooling

caffe網路資料資料如下(crop size=224)

Layer channels Filter size Filter stride Padding size Input size
conv1 96 11 4 - 224×224
cccp1 96 1 1 - 54×54
cccp2 96 1 1 - 54×54
pool1 96 3 2 - 54×54
conv2 256 5 1 2 27×27
cccp3 256 1 1 - 27×27
cccp4 256 1 1 - 27×27
pool2 256 3 2 - 27×27
conv3 384 3 1 1 13×13
cccp5 384 1 1 - 13×13
cccp6 384 1 1 - 13×13
pool3 384 3 2 - 13×13
conv4-1024 1024 3 1 1 6×6
cccp7-1024 1024 1 1 - 6×6
cccp8-1000 1000 1 1 - 6×6
pool4-ave 1000 6 1 - 6×6
accuracy 1000 - - - 1×1
  • 對於crop size = 227,則input size的變化為227, 55, 27, 13, 6, 1。

4. 1×1卷積的作用

問:發現很多網路使用了1X1卷積核,這能起到什麼作用呢?另外我一直覺得,1X1卷積核就是對輸入的一個比例縮放,因為1X1卷積核只有一個引數,這個核在輸入上滑動,就相當於給輸入資料乘以一個係數。不知道我理解的是否正確

答1:
對於單通道的feature map和單個卷積核之間的卷積來說,題主的理解是對的,CNN裡的卷積大都是多通道的feature map和多通道的卷積核之間的操作(輸入的多通道的feature map和一組卷積核做卷積求和得到一個輸出的feature map),如果使用1x1的卷積核,這個操作實現的就是多個feature map的線性組合,可以實現feature map在通道個數上的變化。接在普通的卷積層的後面,配合啟用函式,就可以實現network in network的結構了(本內容作者僅授權給CaffeCN社群(caffecn.cn)使用,如需轉載請附上內容來源說明。)

答2:
我來說說我的理解,我認為1×1的卷積大概有兩個方面的作用吧:
1. 實現跨通道的互動和資訊整合
2. 進行卷積核通道數的降維和升維

下面詳細解釋一下:
1. 這一點孫琳鈞童鞋講的很清楚。1×1的卷積層(可能)引起人們的重視是在NIN的結構中,論文中林敏師兄的想法是利用MLP代替傳統的線性卷積核,從而提高網路的表達能力。文中同時利用了跨通道pooling的角度解釋,認為文中提出的MLP其實等價於在傳統卷積核後面接cccp層,從而實現多個feature map的線性組合,實現跨通道的資訊整合。而cccp層是等價於1×1卷積的,因此細看NIN的caffe實現,就是在每個傳統卷積層後面接了兩個cccp層(其實就是接了兩個1×1的卷積層)。
2. 進行降維和升維引起人們重視的(可能)是在GoogLeNet裡。對於每一個Inception模組(如下圖),原始模組是左圖,右圖中是加入了1×1卷積進行降維的。雖然左圖的卷積核都比較小,但是當輸入和輸出的通道數很大時,乘起來也會使得卷積核引數變的很大,而右圖加入1×1卷積後可以降低輸入的通道數,卷積核引數、運算複雜度也就跟著降下來了。以GoogLeNet的3a模組為例,輸入的feature map是28×28×192,3a模組中1×1卷積通道為64,3×3卷積通道為128,5×5卷積通道為32,如果是左圖結構,那麼卷積核引數為1×1×192×64+3×3×192×128+5×5×192×32,而右圖對3×3和5×5卷積層前分別加入了通道數為96和16的1×1卷積層,這樣卷積核引數就變成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),引數大約減少到原來的三分之一。同時在並行pooling層後面加入1×1卷積層後也可以降低輸出的feature map數量,左圖pooling後feature map是不變的,再加捲積層得到的feature map,會使輸出的feature map擴大到416,如果每個模組都這樣,網路的輸出會越來越大。而右圖在pooling後面加了通道為32的1×1卷積,使得輸出的feature map數降到了256。GoogLeNet利用1×1的卷積降維後,得到了更為緊湊的網路結構,雖然總共有22層,但是引數數量卻只是8層的AlexNet的十二分之一(當然也有很大一部分原因是去掉了全連線層)。

最近大熱的MSRA的ResNet同樣也利用了1×1卷積,並且是在3×3卷積層的前後都使用了,不僅進行了降維,還進行了升維,使得卷積層的輸入和輸出的通道數都減小,引數數量進一步減少,如下圖的結構。(不然真不敢想象152層的網路要怎麼跑起來TAT)