Concat層解析


Concat層的作用就是將兩個及以上的特征圖按照在channel或num維度上進行拼接,並沒有eltwise層的運算操作,舉個例子,如果說是在channel維度上進行拼接conv_9和deconv_9的話,首先除了channel維度可以不一樣,其余維度必須一致(也就是num、H、W一致),這時候所做的操作僅僅是conv_9 的channel k1加上deconv_9的channel k2,Concat 層輸出的blob可表示為:N*(k1+k2)*H*W。通常情況下,考慮到Concat是希望將同大小的特征圖拼接起來,那為什么會產生同大小的特征圖呢?顯然離不開上采樣和下采樣的操作,接下來,以Caffe為例,介紹一下這兩種拼接的方式,如下:

  • 選擇axis=0,表示在num維度上進行拼接,可表示為:(k1+k2)*C*H*W;
  • 選擇axis=1,表示在channel維度上進行拼接,可表示為:N*(k1+k2)*H*W。

注意,卷積運算是三維的(不要想成二維的,當然這應該在學卷積的時候說過的),卷積核的數量就是feature map的channel,feature map的num通常是minibatch的數目。可問題是,這兩種Concat的方式應該如何選擇呢?(ps:如果自己不會用,很自然就是看看別人怎么用)

那么接下來我們就看看到底怎么用。

目前我見過的大都是在channel維度上進行拼接,其實也容易想到,因為我們說feature map 的num是minibatch的圖片數目,比方我們的batch是32,但是我們有4張顯卡同時訓練,顯然minibatch等於8,這個8表示的是每張顯卡一次性處理的圖片數目,這么說來,如果在num維度上拼接的意思就是將同一張顯卡處理的feature map數目重復的加倍了,當然由於上下采樣並不是嚴格的互逆運算,所以在重復的特征圖上像素值還是存在差異。反之,如果是在channel 維度上拼接,此時channel 的數量增加了,也就是說同一個大小的特征圖有了更多的特征表示,很多論文都已經證實其可以提高檢測性能,但是如果不是cancat的方式,而是增加原有的卷積層的channel數目會導致顯存占用增加,速度下降,這樣一來concat的方式在不失速度的前提下,提高了精度,這也是其主要的貢獻。當然光說不行,我把這兩種方法都試驗一下,供大家參考。

在試驗之前介紹一下我的環境,我采用的是VGG模型加的改進,訓練中用了4個TITAN X,minibatch等於8,在保證其它情況一致的情況下進行如下試驗:

  1. 在num維度上進行拼接;顯然,在num維度上拼接的話,concat層輸出的num個數就變成16了,如下表統計的結果顯示,此種操作的效果很差,出現missing GT position for label的warning,不建議使用。
  2. 在channel維度上進行拼接,在channel維度上的拼接分成無BN層和有BN層。

(1)無BN層:直接將deconvolution layer 和convolution layer concat。實驗結果表明,該方式取得的結果精度較低,低於原有的VGG模型,分析主要的原因是漏檢非常嚴重,原因應該是concat連接的兩層參數不在同一個層級,類似BN層用在eltwise層上。

(2)有BN層:在deconvolution layer 和convolution layer 后面加batchnorm和scale層(BN)后再concat。實驗結果表明,該方式取得了比原有VGG模型更好的檢測效果(表中的迭代次數還沒有完哦),增加了2%的精度,但是速度上慢了一些。

 

總結:concat層多用於利用不同尺度特征圖的語義信息,將其以增加channel的方式實現較好的性能,但往往應該在BN之后再concat才會發揮它的作用,而在num維度的拼接較多使用在多任務問題上,將在后續的博客中介紹,總之concat層被廣泛運用在工程研究中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM