1X1 convolution layers
一文讀懂卷積神經(jīng)網(wǎng)絡(luò)中的1x1卷積核
Amusi
微信公眾號(hào):CVer
552 人贊同了該文章
前言
在介紹卷積神經(jīng)網(wǎng)絡(luò)中的1x1卷積之前,首先回顧卷積網(wǎng)絡(luò)的基本概念[1]。
?
1. 卷積核(convolutional kernel):可以看作對(duì)某個(gè)局部的加權(quán)求和;它是對(duì)應(yīng)局部感知,它的原理是在觀察某個(gè)物體時(shí)我們既不能觀察每個(gè)像素也不能一次觀察整體,而是先從局部開始認(rèn)識(shí),這就對(duì)應(yīng)了卷積。卷積核的大小一般有1x1,3x3和5x5的尺寸(一般是奇數(shù)x奇數(shù))。
?
卷積核的個(gè)數(shù)就對(duì)應(yīng)輸出的通道數(shù)(channels),這里需要說明的是對(duì)于輸入的每個(gè)通道,輸出每個(gè)通道上的卷積核是不一樣的。比如輸入是28x28x192(WxDxK,K代表通道數(shù)),然后在3x3的卷積核,卷積通道數(shù)為128,那么卷積的參數(shù)有3x3x192x128,其中前兩個(gè)對(duì)應(yīng)的每個(gè)卷積里面的參數(shù),后兩個(gè)對(duì)應(yīng)的卷積總的個(gè)數(shù)(一般理解為,卷積核的權(quán)值共享只在每個(gè)單獨(dú)通道上有效,至于通道與通道間的對(duì)應(yīng)的卷積核是獨(dú)立不共享的,所以這里是192x128)。
?
2. 池化(pooling):卷積特征往往對(duì)應(yīng)某個(gè)局部的特征。要得到global的特征需要將全局的特征執(zhí)行一個(gè)aggregation(聚合)。池化就是這樣一個(gè)操作,對(duì)于每個(gè)卷積通道,將更大尺寸(甚至是global)上的卷積特征進(jìn)行pooling就可以得到更有全局性的特征。這里的pooling當(dāng)然就對(duì)應(yīng)了cross region。
與1x1的卷積相對(duì)應(yīng),而1x1卷積可以看作一個(gè)cross channel的pooling操作。pooling的另外一個(gè)作用就是升維或者降維,后面我們可以看到1x1的卷積也有相似的作用。
?
下面從一般卷積過程介紹1x1的卷積,下面圖像來表示卷積的過程:
convolution
1x1卷積核
1x1卷積核,又稱為網(wǎng)中網(wǎng)(Network in Network)[2]。
?
這里通過一個(gè)例子來直觀地介紹1x1卷積。輸入6x6x1的矩陣,這里的1x1卷積形式為1x1x1,即為元素2,輸出也是6x6x1的矩陣。但輸出矩陣中的每個(gè)元素值是輸入矩陣中每個(gè)元素值x2的結(jié)果。
?
上述情況,并沒有顯示1x1卷積的特殊之處,那是因?yàn)樯厦孑斎氲木仃嘽hannel為1,所以1x1卷積的channel也為1。這時(shí)候只能起到升維的作用。這并不是1x1卷積的魅力所在。
?
讓我們看一下真正work的示例。當(dāng)輸入為6x6x32時(shí),1x1卷積的形式是1x1x32,當(dāng)只有一個(gè)1x1卷積核的時(shí)候,此時(shí)輸出為6x6x1。此時(shí)便可以體會(huì)到1x1卷積的實(shí)質(zhì)作用:降維。當(dāng)1x1卷積核的個(gè)數(shù)小于輸入channels數(shù)量時(shí),即降維[3]。
?
注意,下圖中第二行左起第二幅圖像中的黃色立方體即為1x1x32卷積核,而第二行左起第一幅圖像中的黃色立方體即是要與1x1x32卷積核進(jìn)行疊加運(yùn)算的區(qū)域。
?
其實(shí)1x1卷積,可以看成一種全連接(full connection)。
?
第一層有6個(gè)神經(jīng)元,分別是a1—a6,通過全連接之后變成5個(gè),分別是b1—b5,第一層的六個(gè)神經(jīng)元要和后面五個(gè)實(shí)現(xiàn)全連接,本圖中只畫了a1—a6連接到b1的示意,可以看到,在全連接層b1其實(shí)是前面6個(gè)神經(jīng)元的加權(quán)和,權(quán)對(duì)應(yīng)的就是w1—w6,到這里就很清晰了。
?
第一層的6個(gè)神經(jīng)元其實(shí)就相當(dāng)于輸入特征里面那個(gè)通道數(shù):6,而第二層的5個(gè)神經(jīng)元相當(dāng)于1*1卷積之后的新的特征通道數(shù):5。
?
w1—w6是一個(gè)卷積核的權(quán)系數(shù),若要計(jì)算b2—b5,顯然還需要4個(gè)同樣尺寸的卷積核[4]。
?
?
上述列舉的全連接例子不是很嚴(yán)謹(jǐn),因?yàn)閳D像的一層相比于神經(jīng)元還是有區(qū)別的,圖像是2D矩陣,而神經(jīng)元就是一個(gè)數(shù)字,但是即便是一個(gè)2D矩陣(可以看成很多個(gè)神經(jīng)元)的話也還是只需要一個(gè)參數(shù)(1*1的核),這就是因?yàn)閰?shù)的權(quán)值共享。
?
注:1x1卷積一般只改變輸出通道數(shù)(channels),而不改變輸出的寬度和高度
1x1卷積核作用
?
降維/升維
由于 1×1 并不會(huì)改變 height 和 width,改變通道的第一個(gè)最直觀的結(jié)果,就是可以將原本的數(shù)據(jù)量進(jìn)行增加或者減少。這里看其他文章或者博客中都稱之為升維、降維。但我覺得維度并沒有改變,改變的只是 height × width × channels 中的 channels 這一個(gè)維度的大小而已[5]。
圖像來自知乎ID: YJango的回答[6]
增加非線性
1*1卷積核,可以在保持feature map尺度不變的(即不損失分辨率)的前提下大幅增加非線性特性(利用后接的非線性激活函數(shù)),把網(wǎng)絡(luò)做的很deep。
?
備注:一個(gè)filter對(duì)應(yīng)卷積后得到一個(gè)feature map,不同的filter(不同的weight和bias),卷積以后得到不同的feature map,提取不同的特征,得到對(duì)應(yīng)的specialized neuron[7]。
?
跨通道信息交互(channal 的變換)
例子:使用1x1卷積核,實(shí)現(xiàn)降維和升維的操作其實(shí)就是channel間信息的線性組合變化,3x3,64channels的卷積核后面添加一個(gè)1x1,28channels的卷積核,就變成了3x3,28channels的卷積核,原來的64個(gè)channels就可以理解為跨通道線性組合變成了28channels,這就是通道間的信息交互[7]。
?
注意:只是在channel維度上做線性組合,W和H上是共享權(quán)值的sliding window
?
1x1卷積應(yīng)用
?
Inception
?
1. 這一點(diǎn)孫琳鈞童鞋講的很清楚。1×1的卷積層(可能)引起人們的重視是在NIN的結(jié)構(gòu)中,論文中林敏師兄的想法是利用MLP代替?zhèn)鹘y(tǒng)的線性卷積核,從而提高網(wǎng)絡(luò)的表達(dá)能力。文中同時(shí)利用了跨通道pooling的角度解釋,認(rèn)為文中提出的MLP其實(shí)等價(jià)于在傳統(tǒng)卷積核后面接cccp層,從而實(shí)現(xiàn)多個(gè)feature map的線性組合,實(shí)現(xiàn)跨通道的信息整合。而cccp層是等價(jià)于1×1卷積的,因此細(xì)看NIN的caffe實(shí)現(xiàn),就是在每個(gè)傳統(tǒng)卷積層后面接了兩個(gè)cccp層(其實(shí)就是接了兩個(gè)1×1的卷積層)。
?
2. 進(jìn)行降維和升維引起人們重視的(可能)是在GoogLeNet里。對(duì)于每一個(gè)Inception模塊(如下圖),原始模塊是左圖,右圖中是加入了1×1卷積進(jìn)行降維的。雖然左圖的卷積核都比較小,但是當(dāng)輸入和輸出的通道數(shù)很大時(shí),乘起來也會(huì)使得卷積核參數(shù)變的很大,而右圖加入1×1卷積后可以降低輸入的通道數(shù),卷積核參數(shù)、運(yùn)算復(fù)雜度也就跟著降下來了。
?
以GoogLeNet的3a模塊為例,輸入的feature map是28×28×192,3a模塊中1×1卷積通道為64,3×3卷積通道為128,5×5卷積通道為32,如果是左圖結(jié)構(gòu),那么卷積核參數(shù)為1×1×192×64+3×3×192×128+5×5×192×32,而右圖對(duì)3×3和5×5卷積層前分別加入了通道數(shù)為96和16的1×1卷積層,這樣卷積核參數(shù)就變成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),參數(shù)大約減少到原來的三分之一。
?
同時(shí)在并行pooling層后面加入1×1卷積層后也可以降低輸出的feature map數(shù)量,左圖pooling后feature map是不變的,再加卷積層得到的feature map,會(huì)使輸出的feature map擴(kuò)大到416,如果每個(gè)模塊都這樣,網(wǎng)絡(luò)的輸出會(huì)越來越大。
?
而右圖在pooling后面加了通道為32的1×1卷積,使得輸出的feature map數(shù)降到了256。GoogLeNet利用1×1的卷積降維后,得到了更為緊湊的網(wǎng)絡(luò)結(jié)構(gòu),雖然總共有22層,但是參數(shù)數(shù)量卻只是8層的AlexNet的十二分之一(當(dāng)然也有很大一部分原因是去掉了全連接層)[8]。
Inception
?
ResNet
?
ResNet同樣也利用了1×1卷積,并且是在3×3卷積層的前后都使用了,不僅進(jìn)行了降維,還進(jìn)行了升維,參數(shù)數(shù)量進(jìn)一步減少,如下圖的結(jié)構(gòu)[8]。
其中右圖又稱為”bottleneck design”,目的一目了然,就是為了降低參數(shù)的數(shù)目,第一個(gè)1x1的卷積把256維channel降到64維,然后在最后通過1x1卷積恢復(fù),整體上用的參數(shù)數(shù)目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話就是兩個(gè)3x3x256的卷積,參數(shù)數(shù)目: 3x3x256x256x2 = 1179648,差了16.94倍。
對(duì)于常規(guī)ResNet,可以用于34層或者更少的網(wǎng)絡(luò)中,對(duì)于Bottleneck Design的ResNet通常用于更深的如101這樣的網(wǎng)絡(luò)中,目的是減少計(jì)算和參數(shù)量(實(shí)用目的)[9]。
?
ResNet
參考
?
[1]?1*1的卷積核與Inception
[2]?《Network in network》
[3]https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x)
[4]?如何理解卷積神經(jīng)網(wǎng)絡(luò)中的1*1卷積
[5]【CNN】卷積神經(jīng)網(wǎng)絡(luò)中的 1*1 卷積 的作用
[6]?https://www.zhihu.com/question/56024942/answer/194997553
[7]?1×1 卷積核的作用?(附實(shí)例):
[8]?1X1卷積核到底有什么作用呢?ResNet解析 - CSDN博客?blog.csdn.net[8]?1X1卷積核到底有什么作用呢?
[9]?ResNet解析 - CSDN博客
擴(kuò)展知乎話題:卷積神經(jīng)網(wǎng)絡(luò)中用1*1 卷積有什么作用或者好處呢?
?
微信搜索:CVer或者CVerNews,即可關(guān)注CVer公眾號(hào)
總結(jié)
以上是生活随笔為你收集整理的1X1 convolution layers的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用评分如何应用在风控策略中(二)
- 下一篇: Deep Learning的基础概念