1*1卷積

老司機的詩和遠方發表於2020-04-06

本文介紹1*1的卷積核與googlenet裡面的Inception。正式介紹之前,首先回顧卷積網路的基本概念。
1. 卷積核:可以看作對某個區域性的加權求和;它是對應區域性感知,它的原理是在觀察某個物體時我們既不能觀察每個畫素也不能一次觀察整體,而是先從區域性開始認識,這就對應了卷積。卷積核的大小一般有1x1,3x3和5x5的尺寸。卷積核的個數就對應輸出的通道數,這裡需要說明的是對於輸入的每個通道,輸出每個通道上的卷積核是不一樣的。比如輸入是28x28x192(WxDxK,K代表通道數),然後在3x3的卷積核,卷積通道數為128,那麼卷積的引數有3x3x192x128,其中前兩個對應的每個卷積裡面的引數,後兩個對應的卷積總的個數。
2. 池化(pooling):卷積特徵往往對應某個區域性的特徵。要得到globa的特徵需要將全域性的特徵就行一個aggregation。池化就是這樣一個操作,對於每個卷積通道,將更大尺寸(甚至是globa)上的卷積特徵進行pooling就可以得到更有全域性性的特徵。這裡的pooling當然就對應了cross region。與1x1的卷積相對應,後者可以看作一個cross channel的pooling操作。pooling的另外一個作用就是升維或者降維,後面我們可以看到1x1的卷積也有相似的作用。

下面從一般卷積過程介紹1x1的卷積,借用[1]中的圖來表示卷積的過程:
convolution
對於nxn(n>1)的卷積核,我們通常還要考慮pad(邊緣補0的個數),stride(每次卷積移動的步長)。但是當尺寸是1x1時,對於single channel而言就相當於對原特徵的scala操作;但是我們一般遇到的都是multi-channel的情況,此時我們便可以根據自己的需要定義卷積核的個數,從而進行降(升)維。如上面所說,如果將它看作cross channel的pooling 操作,它還能幫我們得到在同一位置不同通道之間進行特徵的aggregation。
總結一下,1x1的卷積核可以進行降維或者升維,也就是通過控制卷積核(通道數)實現,這個可以幫助減少模型引數,也可以對不同特徵進行尺寸的歸一化;同時也可以用於不同channel上特徵的融合。一個trick就是在降維的時候考慮結合傳統的降維方式,如PCA的特徵向量實現,這樣效果也可以得到保證。
以googlenet[3]中的inception模組為例,來說明1x1的卷積如何來減少模型引數。
inception
左邊是naive的inception模組,右邊是加入1x1 convolution進行降維的inception。按照上面的說法,我們的這層的模型引數與輸入的特徵維數(28x28x192),卷積核大小以及卷積通道數(包括三種卷積核,分別是1x1x64,3x3x128,5x5x32),右圖中在3x3,5x5 convolution前新加入的1x1的卷積核為96和16通道的,在max pooling後加入的1x1卷積為32通道。那麼圖a該層的引數為(1x1x192x64)+(3x3x192x128)+(5x5x192x32)
圖b該層的引數為(1x1x192x64)+(1x1x192x96)+(1x1x192x16)+(3x3x96x128)+(5x5x16x32)+(1x1x192x32).
比較可知,模型引數減少了。
reference
[1]http://blog.csdn.net/stdcoutzyx/article/details/41596663
[2]http://www.caffecn.cn/?/question/136
[3]going deeper with convolutions

相關文章