關於Reception field — SPP、ASPP和RFB
這篇文章主要是針對神經網路,特別是卷積網路,萃取特徵的手法作探討。
傳統的卷積神經網路(convoluational neural network)使用卷積核(kernal)萃取特徵,並使用池化層(pooling layer)來收集萃取的特徵,達到精練的效果。從最早的LeNet到2012年使深度學習邁入劃時代進展的AlexNet都是如此。
傳統神經網路的架構,在最後要接到輸出以評估損失之前,通常會接一至數層的全連接層(fully connection layer),目的是把最後學到的特徵展平,以符合例如分類這種任務,一對一的預測。這種架構有兩個問題:一是最後展平的特徵圖通常是較小尺度(scale)的,所以比較是細微、局部的特徵。前面層數中,高維度的特徵,保留到後面的程度未知。另一則是因為後面全連接層的關係,將會限制每一層神經網路的規格,從而限制輸入圖片的大小。亦即,圖片的輸入必須是固定尺寸。實務上在做預測時,圖片的規格往往大小不一,但為了符合規格而延展或裁切圖片,有可能使特徵變質。
因此,提出的解決方法有兩種:
- 利用多重規格的卷積核提取特徵並整合,既可保留較高層次的特徵,又不用擔心輸入圖片的尺寸,因為經過萃取之後都會一樣。
- 使用全卷積神經網路(fully convolutional layer,FCN),最後的全連接層改用1*1的卷積核,保持規格的彈性,但仍有全連接層的效果。
本篇討論方法1。關於FCN,可以參考3D Unet小簡介(1)。
SPP和ASPP
SPP:論文連結,可以直接看2.2
SPP全名為spatial pyramid pooling,空間的金字塔意味著它有多重大小的特徵圖。從最後一層卷積神經網路出來的特徵圖大小為a*a*256,根據論文把它分成三重pooling,再串接(concatenate)起來。第一重:單張特徵圖被分成4*4塊,每塊大小為(a/4)*(a/4),分別做maxpooling,得到16*256張。第二重:分成2*2塊,每塊大小為(a/2)*(a/2),得到4*256張。第三重:不分,直接做maxpooling,得到1*256張。然後把它串接再一起,最後是(16+4+1)*256張。無論最後一層輸入進來的特徵圖規格是多少,因為每一塊的大小會等比例改變,所以最後輸出都是(16+4+1)*256,從而固定了輸出的規格,可以安心地和後面的全連接層串在一起。如下圖。
ASPP:論文連結,可以直接看3.1
ASPP全名為atrous spatial pyramid pooling,比起SPP就是前面多了一個a,atrous,其本意為深黑色。顧名思義其概念很類似SPP,但有些不同。不同的地方在使用的卷積網路,SPP為了獲得不同尺寸的特徵圖,在卷積的kernal上也會不同。ASPP則不調整卷積kernal,改採「寬鬆式」卷積核。怎麼寬鬆法呢?卷積核不紮實,要卷積的位置彼此有間隔。如圖:
若中心的位置不變,隨著"rate"的改變,卷積核中實際執行卷積的點彼此間隔更遠,而達到實際上可以涵蓋更大的範圍。這樣的構想是啟發於如果把卷積調大來涵蓋大範圍,會使用較多運算資源;可是調小的話涵蓋範圍不夠,又擔心只萃取到細部特徵。當然,這樣的方式是一種妥協,所以還是會損失一些資訊的。根據論文,沒有執行卷積但又在卷積核範圍內的點,其值為0。這應該也是取atrous這個字的原因吧。(好啦,其實論文裡有提到是跟algorithme a trous這個演算法有關係,該演算法牽涉到濾波和upsampling,就不在這邊詳述了,我也沒時間再去研究)
RFB
論文連結,可以直接看3.2
全名是reception field block。一言以蔽之就是傳統的CNN和ASPP的概念結合。如圖:
先用一個1*1的kernal過濾一次,再分別經過1*1、3*3、5*5的kernal。然後,各自經過一個固定3*3的寬鬆kernal,其寬鬆程度由前一層的kernal大小決定。接著串在一起之後再經過一個1*1的kernal卷積。這樣設計的理念是模仿人眼判讀,先快速看過重要的地方,再去看細節。文章中認為ASPP用一樣的kernal size會把物件的大輪廓和細節的特徵至於同等地位,導致判斷上失去重心。RFB可以把重點集中在卷積核心處,越靠近物件中心的比重越高(因為好幾個recpetion field都疊在那裡),而外圍的比重就比較低。
在文章中還有另外做一個測試:把k*k的kernal換成1*k和k*1,例如3*3就換成1*3和3*1,1*1仍保留。把5*5換成兩層的3*3,第二個3*3是寬鬆的,ratio=5。不過結果沒有比較好,就寫在這邊供參考。
對了,它在經過這些卷積的同時,還有一條路徑是直接略過去的,沒有進到卷積核,這個概念當然不用說,就是從ResNet的residual block來的。這就是命名用block這個字的原因吧。