(轉載)感受野和座標對映的計算,以及卷積層跟全連線層的區別
轉自:http://blog.cvmarcher.com/posts/2015/05/17/cnn-trick/
這篇文章主要講一下Convolutional Neural Network(CNN)裡面的一些概念以及技巧。
Receptive Field (感受野)
這是一個非常重要的概念,receptive field往往是描述兩個feature maps A/B上神經元的關係,假設從A經過若干個操作得到B,這時候B上的一個區域areabareab只會跟a上的一個區域相關areaaareaa,這時候areaaareaa成為areabareab的感受野。用圖片來表示:
在上圖裡面,map 3裡1x1的區域對應map 2的receptive field是那個紅色的7x7的區域,而map 2裡7x7的區域對應於map 1的receptive field是藍色的11x11的區域,所以map 3裡1x1的區域對應map 1的receptive field是藍色的11x11的區域。
那麼很容易得出來,receptive field的計算公式如下:
- 對於Convolution/Pooling layer:
其中riri表示第ii層layer的輸入的某個區域,sisi表示第ii層layer的步長,kiki表示kernel size,注意,不需要考慮padding size。
- 對於Neuron layer(ReLU/Sigmoid/…)
Coordinate Mapping
通常,我們需要知道網路裡面任意兩個feature map之間的座標對映關係,如下圖,我們想得到map 3上的點p
計算公式如下:
- 對於Convolution/Pooling layer:
其中pipi表示第ii層layer的輸入的某個點,sisi表示第ii層layer的步長,kiki表示kernel size,paddingipaddingi
- 對於Neuron layer(ReLU/Sigmoid/…)
上面是計算任意一個layer輸入輸出的座標對映關係,如果是計算任意feature map之間的關係,只需要用簡單的組合就可以得到,下圖是一個簡單的例子:
Convolutionalize (卷積化)
最近掀起了FCN(全卷積網路)風,這種網路裡面不包括全連線層(fully connected layer)。
卷積層跟全連線層的區別
卷積層的操作跟傳統的滑窗(sliding windows)很相似,把kernel作用於輸入的不同的區域然後產生對應的特徵圖,由於這樣的性質,給定一個卷積層,它並不要求輸入是固定大小的,它可能根據輸入大小的不同而產生大小不一樣的特徵圖。
全連線層的操作是把輸入拉成一個一維的向量,然後對這一維的向量進行點乘,這就要求輸入大小是固定的。
那麼如果使用一個包含fc層的模型(如AlexNet)就必須使用固定大小的輸入,其實有時候這是非常不方便以及不合理的,比如下圖,如果我要把紅框的塔輸入網路,就必須得對它進行變成,假設是放到AlexNet裡面,因為輸入是224x224,那麼就會對圖片產生變形。
那麼有沒有辦法使得網路可以接受任意的輸入?實際上是可以的,只需要把全連線層變成卷積層,這就是所謂的卷積化。這裡需要證明卷積化的等價性。直觀上理解,卷積跟全連線都是一個點乘的操作,區別在於卷積是作用在一個區域性的區域,而全連線是對於整個輸入而言,那麼只要把卷積作用的區域擴大為整個輸入,那就變成全連線了,我就不給出形式化定義了。所以我們只需要把卷積核變成跟輸入的一個map的大小一樣就可以了,這樣的話就相當於使得卷積跟全連線層的引數一樣多。舉個例子,比如AlexNet,fc6的輸入是256x6x6,那麼這時候只需要把fc6變成是卷積核為6x6的卷積層就好了。