深度學習教程:卷積神經網路中的感受野計算詳細指南

本教程由深度學習中文社群(Studydl.com)持續釋出與更新, 本系列其餘教程地址見文章末尾.

前言

感受野(receptive field,RF)也許是CNN中最重要的概念之一,從文獻上來看,它應當引起足夠的重視。目前所有最好的影象識別方法都是在基於感受野理念來設計模型架構。然而,據我所知,目前並沒有一個完整的教程來介紹如何計算並可視化一個CNN的感受野。這篇文章將填補這一空白,這裡介紹CNN特徵圖視覺化的一種新方法,視覺化可以顯示感受野資訊,並且給出一個完整的感受野計算公式,它適用於任何CNN架構。我也實現了一個簡單的程式來驗證這個計算公式,任何人都可以利用該公式計算它們所設計的CNN的感受野,從而對所設計的架構有更多的認識。

要閱讀這篇文章,你必須要熟悉CNN的核心概念,特別是卷積和池化操作。你可以透過閱讀我這篇文章來複習CNN的基礎知識。如果你對CNN有一定的瞭解,你將用不了半個小時來看完。

固定大小的CNN特徵圖視覺化

感受野指的是一個特定的CNN特徵(特徵圖上的某個點)在輸入空間所受影響的區域。一個感受野可以用中心位置(center location)和大小(size)來表徵。然而,對於一個CNN特徵來說,感受野中的每個畫素值(pixel)並不是同等重要。一個畫素點越接近感受野中心,它對輸出特徵的計算所起作用越大。這意味著某一個特徵不僅僅是受限在輸入圖片中某個特定的區域(感受野),並且呈指數級聚焦在區域的中心。這個重要的發現會在下一篇文章中講。現在,我們關注如何計算一個特定感受野的中心位置和大小。

圖1為給出了某些感受野例項。其中輸入特徵圖大小為 5*5 ,採用的卷積引數如下:卷積核大小 k=3*3 ,padding大小 p=1*1 ,步長 s=2*2 。經過一次卷積之後,得到大小為 3*3 的輸出特徵圖(綠色)。在這個特徵圖上繼續採用相同的卷積,得到一個 2*2 的特徵圖(橙色)。輸出特徵圖的大小可以透過如下公式計算(參考A guide to convolution arithmetic for deep learning):

深度學習教程:卷積神經網路中的感受野計算詳細指南

為了簡化講解,這裡假定CNN架構是對稱的,並且輸入圖片是方形的。因此所有的卷積層的所有引數在兩個維度上都是相同的。如果CNN架構或者輸入圖片是非對稱的,你可以為各個維度單獨計算特徵圖的屬性。

深度學習教程:卷積神經網路中的感受野計算詳細指南

圖1 CNN特徵圖的兩種視覺化方法

圖1的左欄給出了CNN特徵圖視覺化最常用的方式。在這個視覺化中,我們可以看到每個特徵圖所包含的特徵數,但是很難知道每個特徵的感受野的中心位置和大小,對於深度CNN,我們沒有辦法追蹤到感受野資訊。右欄給出的是固定大小的CNN視覺化,所有的特徵圖固定大小並保持與輸入特徵圖大小一致,這可以解決前面的問題。每個特徵被標記在其感受野所在的中心(從而定位出感受野中心位置)。由於一個特徵圖中所有的特徵都有相同大小的感受野,我們可以簡單地在每個特徵周圍畫出一個邊界框,從而獲得感受野的大小。我們也沒有必要將這個邊界框向下對映到輸入層,因為特徵圖已經與輸入層具有相同的大小。圖2給出了另外一個例項,其中輸入特徵圖更大,為7*7,與前面例子採用相同的卷積。圖的左欄和右欄分別給出了固定大小CNN特徵圖的3D和2D視覺化。可以看出感受野大小增加迅速,以至於第二個特徵層的中心特徵的感受野已經覆蓋了整個輸入特徵圖。這在深度CNN中是一個很重要的設計理念以提升效能。

深度學習教程:卷積神經網路中的感受野計算詳細指南

圖2 7x7大小的輸入特徵圖的視覺化

感受野計算公式

為了計算CNN每一層的感受野,除了要知道特徵圖每個維度的特徵數 n,還需要記錄每一層的其他資訊,這包括當前層的感受野大小 r ,兩個相鄰特徵的距離(跳躍的距離,如前面視覺化所示) j ,和左上角特徵(第一個特徵)的中心座標 start 。注意感受野(其實是特徵圖第一個特徵的感受野)的中心座標就等於這個特徵的中心座標,就如前面視覺化中所示。當採用的卷積其核大小為 k ,padding大小為 p ,步長為 s ,輸出特徵圖的感受野可以按照如下公式計算:

深度學習教程:卷積神經網路中的感受野計算詳細指南

第一個式子根據輸入特徵圖大小以及卷積引數計算輸出特徵圖大小,前面已經說過。

第二個式子計算輸出特徵圖的特徵間的間隔 j ,其等於上一層的間隔值乘以卷積的步長,所以間隔值將是按照步長呈指數級增長。

第三個式子計算輸出特徵圖的感受野大小,其等於前一層感受野大小加上 (k-1)*j(in) ,所以感受野是呈指數級增加,並且還有一個因子 k-1 。

第四個式子計算輸出特徵圖的第一個特徵感受野的中心座標,其等於第一層的中心座標加上 (k-1)/2*j(in),再減去p*j(in),注意兩項都要乘以前一層的間隔距離以得到實際距離。

對於第一層,一般是輸入圖片,其各項值為: n=image_size, r=1, j =1, start=0。5 。圖3給出了一個如何計算感受野的例項,圖中的座標系統中,輸入層的第一個特徵中心位置記為 0。5 。透過利用上面公式迭代地進行計算,你可以計算出CNN中所有特徵圖的感受野資訊。

深度學習教程:卷積神經網路中的感受野計算詳細指南

圖3 使用感受野公式計算圖1中的感受野資訊

我也寫了一個簡單的Python程式來計算某個特定CNN架構的各個層的感受野資訊。它可以透過輸入某一個特徵圖的姓名或者索引值,給出相應的感受野大小和位置資訊。下面的圖給出了在AlexNet上的計算結果:

深度學習教程:卷積神經網路中的感受野計算詳細指南

附文

深度學習教程:卷積神經網路中的感受野計算詳細指南

小結

在CNN中,感受野應該是一個很重要的東西,但是往往被大家忽略,在我看到的文獻中,影象分割模型DeepLab就提到了感受野大小的問題,但是那裡並沒有給出計算公式,如果採用上面的公式就可以快速得到結果。對於影象分割,感受野大小對分割效果是有很大影響的,所以DeepLab採用了擴展卷積(Atrous Convolution, Dilated Convolution)來增加感受野大小。對於空洞卷積來說,你可以將其轉化為普通卷積(卷積核大小增加)來計算特徵圖的感受野。另外,上面的公式同樣適用於池化層,因為其在結構上與卷積層是類似的。

更多深度學習相關資源請點選文末了解更多按鈕進行獲取