1. 程式人生 > >(轉載)感受野和座標對映的計算,以及卷積層跟全連線層的區別

(轉載)感受野和座標對映的計算,以及卷積層跟全連線層的區別

轉自: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的感受野。用圖片來表示:

receptive_field.jpg

在上圖裡面,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:
ri=si(ri+11)+kiri=si⋅(ri+1−1)+ki

其中riri表示第ii層layer的輸入的某個區域,sisi表示第ii層layer的步長,kiki表示kernel size,注意,不需要考慮padding size。

  • 對於Neuron layer(ReLU/Sigmoid/…)
ri=ri+1ri=ri+1

Coordinate Mapping

通常,我們需要知道網路裡面任意兩個feature map之間的座標對映關係,如下圖,我們想得到map 3上的點p

3p3映射回map 2所在的位置p2p2

coordinate_map.jpg

計算公式如下:

  • 對於Convolution/Pooling layer:
pi=sipi+1+(ki12paddingi)pi=si⋅pi+1+(ki−12−paddingi)

其中pipi表示第ii層layer的輸入的某個點,sisi表示第ii層layer的步長,kiki表示kernel size,paddingipaddingi

  • 對於Neuron layer(ReLU/Sigmoid/…)
pi=pi+1pi=pi+1

上面是計算任意一個layer輸入輸出的座標對映關係,如果是計算任意feature map之間的關係,只需要用簡單的組合就可以得到,下圖是一個簡單的例子:

coordinate_map_example.jpg

Convolutionalize (卷積化)

最近掀起了FCN(全卷積網路)風,這種網路裡面不包括全連線層(fully connected layer)。

卷積層跟全連線層的區別

卷積層的操作跟傳統的滑窗(sliding windows)很相似,把kernel作用於輸入的不同的區域然後產生對應的特徵圖,由於這樣的性質,給定一個卷積層,它並不要求輸入是固定大小的,它可能根據輸入大小的不同而產生大小不一樣的特徵圖。

sliding-windows.png

全連線層的操作是把輸入拉成一個一維的向量,然後對這一維的向量進行點乘,這就要求輸入大小是固定的。

那麼如果使用一個包含fc層的模型(如AlexNet)就必須使用固定大小的輸入,其實有時候這是非常不方便以及不合理的,比如下圖,如果我要把紅框的塔輸入網路,就必須得對它進行變成,假設是放到AlexNet裡面,因為輸入是224x224,那麼就會對圖片產生變形。

warp-image.png

那麼有沒有辦法使得網路可以接受任意的輸入?實際上是可以的,只需要把全連線層變成卷積層,這就是所謂的卷積化。這裡需要證明卷積化的等價性。直觀上理解,卷積跟全連線都是一個點乘的操作,區別在於卷積是作用在一個區域性的區域,而全連線是對於整個輸入而言,那麼只要把卷積作用的區域擴大為整個輸入,那就變成全連線了,我就不給出形式化定義了。所以我們只需要把卷積核變成跟輸入的一個map的大小一樣就可以了,這樣的話就相當於使得卷積跟全連線層的引數一樣多。舉個例子,比如AlexNet,fc6的輸入是256x6x6,那麼這時候只需要把fc6變成是卷積核為6x6的卷積層就好了。