在很多模型中都會有一些的卷積層,打眼一看感覺這些layer很雞肋,不知道放在模型裏能起到什麼作用。但深入理解一下就能發現,1*1的卷積是非常有用的,可以很靈活地控制特徵圖的深度,並能起到減少參數量的作用。
本文就基於個人粗淺的理解,簡單討論一下1*1卷積的作用。
1. 升維降維,實現跨通道的信息整合
feature map和1*1的卷積核做卷積時,只需要考慮當前像素即可,並不需要考慮周圍的像素值。因此第一個作用主要是可以用來調節feature map的通道數,對不同通道上的像素點進行線性組合,即可實現feature map的升維或降維功能,這也是通道見信息的交互和整合過程。
例如現在的feature map維度是(48, 28, 28),48表示channel,28表示長和寬。如果給定一個1*1的卷積層,輸入channel=48,出的channel=32,那麼就可以對特徵圖實現從48維到32維的降維操作。
同樣地,只要輸出channel大於48,就可以實現升維操作。
2. 減少模型參數量
減少模型參數這一想法最早應該是在GoogleNet中提出的,假設給定如下兩個Inception模塊:
如上圖,現在藍色方框中,左側是的卷積,而右側是和一個的卷積。兩者的功能是一樣的,即得到的輸出維度相同。現在要計算兩者的參數量,直覺上來說,單個的卷積參數似乎較少,但事實真的如此嗎?
我們假設Previous Layer得到結果的維度是(96, 28, 28),即這個Inception模塊的輸入是96通道,長寬均爲28的feature map,卷積後輸出通道爲48。假設經過左側和右側模塊的方框所需要的計算參數分別爲p1,p2,則p1和p2的計算公式如下:
p1 =
右圖中第一個卷積可以先將原始輸入降維,假設這裏降到32維,則:
p2 =
注:卷積核的通道數與輸入的feature map一致,而卷積核的個數與輸出channel一致。
我們驚奇的發現,反而是第二種採用了和兩次卷積的結構,擁有更少的訓練參數。由此可見,雖然加入了這額外的的卷積層,但竟然可以減少訓練的參數。
Resnet中的殘差模塊使用卷積核意義也是如此:
假設輸入feature map的維度是(256, 28, 28),左側和右側模塊的參數量分別是p1和p2,那麼p1和p2的計算值分別如下(爲了追求兩者輸入輸出的一致性,需要把左側圖的64都改爲256,且中間只有一層的卷積層):
p1 =
p1 =
可見採用了卷積後的參數量會減少很多,我覺得這主要是卷積核可以先進行降維,降維之後需要的的卷積核數目就變少了。而真正佔用參數量的是卷積核,1*1$卷積核的參數量其實非常少,所以引入了卷積核來減少訓練參數。