一、分組卷積 Group convolution
Group convolution
分組卷積,最早在AlexNet
中出現,由於當時的硬件資源有限,訓練AlexNet
時卷積操作不能全部放在同一個GPU
處理,因此作者把feature maps
分給多個GPU
分別進行處理,最後把多個GPU
的結果進行融合。
二、卷積核一定越大越好?-- 3×3卷積核
AlexNet
中用到了一些非常大的卷積核,比如11×11
、5×5
卷積核,之前人們的觀念是,卷積核越大,receptive field
(感受野)越大,看到的圖片信息越多,因此獲得的特徵越好。雖說如此,但是大的卷積核會導致計算量的暴增,不利於模型深度的增加,計算性能也會降低。於是在VGG
(最早使用)、Inception
網絡中,利用2個3×3
卷積核的組合比1個5×5
卷積核的效果更佳,同時參數量(3×3×2+1 VS 5×5×1+1)
被降低,因此後來3×3
卷積核被廣泛應用在各種模型中。
三、每層卷積只能用一種尺寸的卷積核?-- Inception結構
傳統的層疊式網絡,基本上都是一個個卷積層的堆疊,每層只用一個尺寸的卷積核,例如VGG
結構中使用了大量的3×3卷積層。事實上,同一層feature map
可以分別使用多個不同尺寸的卷積核,以獲得不同尺度的特徵,再把這些特徵結合起來,得到的特徵往往比使用單一卷積核的要好,谷歌的GoogLeNet
,或者說Inception
系列的網絡,就使用了多個卷積核的結構。
補充內容:什麼是feature map?
在每個卷積層,數據都是以三維形式存在的。你可以把它看成許多個二維圖片疊在一起,其中每一個稱爲一個feature map
。在輸入層,如果是灰度圖片,那就只有一個feature map
;如果是彩色圖片,一般就是3個feature map
(紅綠藍)。層與層之間會有若干個卷積核(kernel
),上一層的每個feature map
跟每個卷積核做卷積,都會產生下一層的一個feature map
。
最初版本的Inception
結構
如上圖所示,一個輸入的feature map
分別同時經過1×1
、3×3
、5×5
的卷積核的處理,得出的特徵再組合起來,獲得更佳的特徵。但這個結構會存在一個嚴重的問題:參數量比單個卷積核要多很多,如此龐大的計算量會使得模型效率低下。這就引出了一個新的結構!
四、怎樣才能減少卷積層參數量?-- Bottleneck
發明GoogleNet
的團隊發現,如果僅僅引入多個尺寸的卷積核,會帶來大量的額外的參數,受到Network In Network
中1×1
卷積核的啓發,爲了解決這個問題,他們往Inception
結構中加入了一些1×1的卷積核,如圖所示:
加入1×1
卷積核的Inception
結構
根據上圖,我們來做個對比計算,假設輸入feature map
的維度爲256維,要求輸出維度也是256維。有以下兩種操作:(怎麼算的?不明白)
-
256維的輸入直接經過一個
3×3×256
的卷積層,輸出一個256維的feature map
,那麼參數量爲:256×3×3×256 = 589,824
-
256維的輸入先經過一個
1×1×64
的卷積層,再經過一個3×3×64
的卷積層,最後經過一個1×1×256
的卷積層,輸出256維,參數量爲:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632
。足足把第一種操作的參數量降低到九分之一!
1×1卷積核也被認爲是影響深遠的操作,往後大型的網絡爲了降低參數量都會應用上1×1卷積核。
五、越深的網絡就越難訓練嗎?-- Resnet殘差網絡
ResNet skip connection
傳統的卷積層層疊網絡會遇到一個問題,當層數加深時,網絡的表現越來越差,很大程度上的原因是因爲當層數加深時,梯度消散的越來越嚴重,以至於反向傳播很難訓練到淺層的網絡。 爲了解決這個問題,何凱明大神想出了一個“殘差網絡”,使得梯度更容易地流動到淺層的網絡當中去,而且這種“skip connection”
能帶來更多的好處,
六、卷積操作時必須同時考慮通道和區域嗎?-- DepthWise操作
標準的卷積過程可以看上圖,一個2×2
的卷積核在卷積時,對應圖像區域中的所有通道均被同時考慮,問題在於,爲什麼一定要同時考慮圖像區域和通道?我們爲什麼不能把通道和空間區域分開考慮?
Xception
網絡就是基於以上的問題發明而來。我們首先對每一個通道進行各自的卷積操作,有多少個通道就有多少個過濾器。得到新的通道feature maps
之後,這時再對這批新的通道feature maps
進行標準的1×1
跨通道卷積操作。這種操作被稱爲 “DepthWise convolution”
,縮寫“DW”
。
這種操作是相當有效的,在imagenet 1000類
分類任務中已經超過了InceptionV3
的表現,而且也同時減少了大量的參數,我們來算一算,假設輸入通道數爲3,要求輸出通道數爲256,兩種做法:
-
直接接一個
3×3×256
的卷積核,參數量爲:3×3×3×256 = 6,912
-
DW
操作,分兩步完成,參數量爲:3×3×3 + 3×1×1×256 = 795
,又把參數量降低到九分之一!
因此,一個depthwise
操作比標準的卷積操作降低不少的參數量,同時論文中指出這個模型得到了更好的分類效果。
七、分組卷積能否對通道進行隨機分組?-- ShuffleNet
在AlexNet
的Group Convolution
當中,特徵的通道被平均分到不同組裏面,最後再通過兩個全連接層來融合特徵,這樣一來,就只能在最後時刻才融合不同組之間的特徵,對模型的泛化性是相當不利的。爲了解決這個問題,ShuffleNet
在每一次層疊這種Group conv
層前,都進行一次channel shuffle
,shuffle
過的通道被分配到不同組當中。進行完一次group conv
之後,再一次channel shuffle
,然後分到下一層組卷積當中,以此循環。
八、通道間的特徵都是平等的嗎? – SEnet
無論是在Inception、DenseNet或者ShuffleNet裏面,我們對所有通道產生的特徵都是不分權重直接結合的,那爲什麼要認爲所有通道的特徵對模型的作用就是相等的呢? 這是一個好問題,於是,ImageNet2017
冠軍SEnet
就出來了。
一組特徵在上一層被輸出,這時候分兩條路線,第一條直接通過,第二條首先進行Squeeze
操作(Global Average Pooling
),把每個通道2維的特徵壓縮成一個1維,從而得到一個特徵通道向量(每個數字代表對應通道的特徵)。然後進行Excitation
操作,把這一列特徵通道向量輸入兩個全連接層和sigmoid
,建模出特徵通道間的相關性,得到的輸出其實就是每個通道對應的權重,把這些權重通過Scale
乘法通道加權到原來的特徵上(第一條路),這樣就完成了特徵通道的權重分配。
九、能否讓固定大小的卷積核看到更大範圍的區域?-- Dilated convolution
標準的3×3
卷積核只能看到對應區域3×3
的大小,但是爲了能讓卷積核看到更大的範圍,dilated conv
使其成爲了可能。dilated conv
原論文中的結構如圖所示:
上圖b可以理解爲卷積核大小依然是3×3
,但是每個卷積點之間有1個空洞,也就是在綠色7×7
區域裏面,只有9個紅色點位置作了卷積處理,其餘點權重爲0。這樣即使卷積核大小不變,但它看到的區域變得更大了。
十、卷積核形狀一定是矩形嗎?-- Deformable convolution 可變形卷積核
認爲卷積核的形狀可以是變化的,變形的卷積核能讓它只看感興趣的圖像區域 ,這樣識別出來的特徵更佳。
要做到這個操作,可以直接在原來的過濾器前面再加一層過濾器,這層過濾器學習的是下一層卷積核的位置偏移量(offset
),這樣只是增加了一層過濾器,或者直接把原網絡中的某一層過濾器當成學習offset
的過濾器,這樣實際增加的計算量是相當少的,但能實現可變形卷積核,識別特徵的效果更好。
啓發與思考
現在越來越多的CNN
模型從巨型網絡到輕量化網絡一步步演變,模型準確率也越來越高。現在工業界追求的重點已經不是準確率的提升(因爲都已經很高了),都聚焦於速度與準確率的trade off
,都希望模型又快又準。因此從原來AlexNet
、VGGNet
,到體積小一點的Inception
、Resnet
系列,到目前能移植到移動端的MobileNet
、ShuffleNet
(體積能降低到0.5mb!),我們可以看到這樣一些趨勢。