CNN中感受野(receptive field)計算及一層輸入和輸出size之間的關係計算

 之前有段時間偏向於工程實現,用CNN做classification,Detection,Segmentation都已經玩過,且在項目上有過應用,過程中也看了很多理論知識,但較淺。現在有時間再回頭過下理論知識吧。

     一.感受野的計算

        點擊打開鏈接該博客中做了完備數學公式的推導,在此引用一下:    

         假設第i層上對第j層的局部感受野爲F(i,j),顯然i>=j.假定輸入層爲第0層。則現在問題轉化爲求F(i,0)的問題。由上面分      析可知F(i,i)=1,現只需要求出F(i,j) 與F(i,j-1)層的關係,即可通過F(i,i)求出F(i,0).通過簡單情況和畫圖分析,可得      出遞歸關係式:

            F(i,j-1) = kernel_size_j + (F(i,j)-1)*stride_j

           kernel_size_j表示的第j層的kernel_size,stride_j表示第j層的stride

     分析可有如下邏輯:

     假設目前有一張原始圖像(224*224*1),中間會經過兩次卷積(conv1,conv2),那麼conv2後的數據(即第3層)對輸入層的的感受野可推導如下(假設conv1的kernel size爲3*3, stride爲1;conv2的kernel size爲3*3,stride 爲1):

     先計算conv2(第2層)對conv1(第1層)的感受野:

      則上面公式中i=2,j=2;

      F(2,1) = conv2的kernel_size + (F(2,2)-1)*(conv2的stride)

      所以F(2,1)= 3 + (1-1)*1 = 3

     接着求F(2,0),即conv2對輸入圖像的感受野,則上面公式中i=2,j=1,

      F(2,0) = conv的kernel_size + (F(2,1)- 1) * (conv1的stride)

      即F(2,0) = 3 + (3 -1)*2 = 7

      所以conv3對輸入圖像的感受野爲7個像素。

博客點擊打開鏈接中也對感受野做了介紹,並推出了主流網絡vgg16和Alexnet各層的感受野,下面我也帶着推導部分層來手動驗證下,做這個工作需要對vgg16和Alexnet的網絡結構瞭解(對各層的卷積和池化的kernel size以及stride瞭解)

 使用博客點擊打開鏈接中的vgg16模型圖:



  博客點擊打開鏈接對Alexnet的各層結構做了詳細介紹。

  來驗證博客點擊打開鏈接中的推導值:

  

 首先來驗證Alexnet的pool2層對原始圖像的感受野計算。pool2是第四層。

 則F(4,3)= 第四層的kernel_size + (F(4,4)-1)*第四層的stride。瞭解到Alexnet的結構,這裏kernel_size=3.

  所以F(4,3) = 3;

  F(4,2) = 第三層的kernrl_size + (F(4,3) - 1)*第三層的stride

  所以F(4,2) = 5 + (3 - 1)* 1 = 7

  F(4,1) = 第二層的kernel_size + (F(4,2) - 1)*第二層的stride

  所以F(4,1) = 3+ (7 - 1)* 2 = 15

  F(4,0) = 第一層的kernel_size + (F(4,1) - 1)*第一層的stride

  所以F(4, 0) = 11 + (15 - 1)* 4 = 67

  Alexnet驗證正確

  接下來看Vgg16的conv1_2對輸入層的感受野求解,conv1_2爲第二層

  F(2,1) = 第二層的kernel_size + (F(2,2) -1)*第二層的stride

  F(2,1) = 3

  F(2,0) = 第一層的kernel_size + (F(2,1) - 1)* 第一層的stride

  F(2,0) = 3 + (3 - 1)*2 = 5。


二.各層的輸出和輸入圖像寬度和高度大小的關係

   outsize = (insize - fsize + 2*pad)/stride + 1,前者會向下求整

這裏outsizes是輸出圖像的寬度和高度大小,insize是輸入圖像的寬度和高度大小,fsize表示該層的卷積核大小,stride表示卷積核的移動步長。

   首先來驗證Alexnet的pool2的輸出圖像的outsize.

   conv1_outsize = (224 - 11 + 2*0)/4 + 1 -> 54

   pool1_outsize = (54 - 3 + 2*0)/2 + 1 -> 26

   conv2_outsize = (26 - 5 + 2*2)/1 + 1 -> 26

   pool2_outsize = (26 - 3 + 2*0)/2 + 1 -> 12

  驗證正確

   看vgg16的conv2_1的輸出size

   conv1_1 = (224 - 3 + 2*1)/1 + 1 ->224

   conv1_2 = (224 - 3 + 2*1)/1 + 1 ->224

   pool1 = (224 - 2 + 2*0)/2 + 1 -> 112

  conv2_1 = (112 - 3 + 2*1) + 1 -> 112

  驗證正確!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章