part I ? :來源
part II ?:應用
part III :作用(降維、升維、跨通道交互、增加非線性)
part IV :從fully-connected layers的角度理解
一、來源:[1312.4400] Network In Network (如果1×1卷積核接在普通的卷積層后面,配合激活函數,即可實現network in network的結構)
二、應用:GoogleNet中的Inception、ResNet中的殘差模塊
三、作用:
1、降維(減少參數)
例子1 : GoogleNet中的3a模塊
輸入的feature map是28×28×192
1×1卷積通道為64
3×3卷積通道為128
5×5卷積通道為32
左圖卷積核參數:192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
右圖對3×3和5×5卷積層前分別加入了通道數為96和16的1×1卷積層,這樣卷積核參數就變成了:
192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184
同時在并行pooling層后面加入1×1卷積層后也可以降低輸出的feature map數量(feature map尺寸指W、H是共享權值的sliding window,feature map 的數量就是channels)
左圖feature map數量:64 + 128 + 32 + 192(pooling后feature map不變) = 416 (如果每個模塊都這樣,網絡的輸出會越來越大)
右圖feature map數量:64 + 128 + 32 + 32(pooling后面加了通道為32的1×1卷積) = 256
GoogLeNet利用1×1的卷積降維后,得到了更為緊湊的網絡結構,雖然總共有22層,但是參數數量卻只是8層的AlexNet的十二分之一(當然也有很大一部分原因是去掉了全連接層)
例子2:ResNet中的殘差模塊
假設上一層的feature map是w*h*256,并且最后要輸出的是256個feature map
左側操作數:w*h*256*3*3*256 =589824*w*h
右側操作數:w*h*256*1*1*64 + w*h*64*3*3*64 +w*h*64*1*1*256 = 69632*w*h,,左側參數大概是右側的8.5倍。(實現降維,減少參數)
2、升維(用最少的參數拓寬網絡channal)
例子:上一個例子中,不僅在輸入處有一個1*1卷積核,在輸出處也有一個卷積核,3*3,64的卷積核的channel是64,只需添加一個1*1,256的卷積核,只用64*256個參數就能把網絡channel從64拓寬四倍到256。
3、跨通道信息交互(channal 的變換)
例子:使用1*1卷積核,實現降維和升維的操作其實就是channel間信息的線性組合變化,3*3,64channels的卷積核后面添加一個1*1,28channels的卷積核,就變成了3*3,28channels的卷積核,原來的64個channels就可以理解為跨通道線性組合變成了28channels,這就是通道間的信息交互。
注意:只是在channel維度上做線性組合,W和H上是共享權值的sliding window
4、增加非線性特性
1*1卷積核,可以在保持feature map尺度不變的(即不損失分辨率)的前提下大幅增加非線性特性(利用后接的非線性激活函數),把網絡做的很deep。
備注:一個filter對應卷積后得到一個feature map,不同的filter(不同的weight和bias),卷積以后得到不同的feature map,提取不同的特征,得到對應的specialized neuro。
四、從fully-connected layers的角度來理解1*1卷積核
將其看成全連接層
左邊6個神經元,分別是a1—a6,通過全連接之后變成5個,分別是b1—b5
左邊6個神經元相當于輸入特征里面的channels:6
右邊5個神經元相當于1*1卷積之后的新的特征channels:5
左邊 W*H*6 經過 1*1*5的卷積核就能實現全連接。
In Convolutional Nets, there is no such thing as “fully-connected layers”. There are only convolution layers with 1x1 convolution kernels and a full connection table– Yann LeCun
參考:https://iamaaditya.github.io/2016/03/one-by-one-convolution/