卷積層輸出尺寸計算、卷積核大小選擇、網絡層數問題


0.卷積層的理解

  • 實際上卷積核(convolution kernel)不是真的卷積,而是類似一個輸入和輸出之間的線性表達式.
  • 為什么叫做卷積呢, 因為兩個次序上相鄰的NxN卷積核有N-1的重疊. 本質上卷積核是一個線性過濾式, 比如輸入時4x4的小宏塊, 卷積核過濾的結果相當於一次線性計算. 卷積核之后的亞采樣和池化都是為了把局部特征進行抽象化.
  • 但從數據傳播的方向上來講,卷積核進行特征提取,然后亞采樣和池化(sub-sampling and pooling)會突出/削弱一些主要的特征成分. 說簡單點,問題中的這張圖包含字母,字母的特征是什么呢?基本特征就是邊界在灰度圖上的映射. 通過卷積核進行每個局部特征的提取然后層層遞進.
  • 最接近輸入層(即數據幀)的卷積核-亞采樣-池化提取的是基本特征,比如邊界,明暗, 簡單的條紋(實際就是一階的數學特征,比如明暗的梯度). 但越靠近輸出提取的特征越抽象. 比如在前幾層卷積核提取的是條紋- -紋理--分布邊界--物體輪廓這樣的分級遞進關系, 后面就是宏觀的特征了.比如這個物體是貓還是狗,如果是狗是哪個品種的狗. 

 

1.  卷積層輸出尺寸計算

1.1 理論計算

假定參數如下:

  • 輸入圖片的大小: (n,n)
  • 卷積核的大小:(f,f)
  • 步長:s (卷積核計算一個區域后,挪動幾個像素再進行計算)
  • padding值:p  (即在圖像邊緣填充幾層0)$padding = \frac{f-1}{2}$(大小為偶數的卷積核即使對稱地加padding也不能保證輸入feature map尺寸和輸出feature map尺寸不變,所以一般都用>1的奇數作為卷積核大小 )

 計算公式如下(長、寬的計算方法都一樣):

$n' = \lfloor \frac{n+2*p-f}{s} \rfloor +1$

  • 卷積輸出的圖像大小是多少,就看卷積核在橫向一行走了多少次(+1),縱向一列走了多少次(+1)。
  • 圖像會先根據padding值在四周填充0,然后卷積核在左上方對齊填充后的圖片,再向一個方向移動。可以移動的長度是$n+2*p-f$ , 然后我們還要除以步長(如果商不是整數,那么向下取整),最后都會差一步,所以加上這一步。

 

*池化層處理*

輸入圖片的大小: (n,n)

pool_size的大小:(f,f)

步長:s (卷積核計算一個區域后,挪動幾個像素再進行計算)

默認s大小為pool_size的大小

*池化后的大小*

$n' = \lfloor \frac{n-f}{s} \rfloor +1$

 

1.2  tf.keras中的卷積層類

tf.keras.layers.MaxPool2D()、tf.keras.layers.Conv2D()等文檔中padding參數只有兩項:valid | same

same模式:卷積核的中心對齊圖片左上角,然后開始做卷機運算

此時:kernel_size = 3,  padding = 1, 若stride = 2

$n' =\lfloor \frac{n+2*p-f}{s} \rfloor  +1 =\lfloor \frac{6+2*1-3}{2}\rfloor  +1=3$

 

valid模式:卷積核最上角與圖片左上角對齊,再做卷積運算

此時:kernel_size = 3,  padding = 0, 若stride=2

$n' = \lfloor  \frac{n+2*p-f}{s} \rfloor  +1 = \lfloor  \frac{6+2*0-3}{2}\rfloor  +1=2$

 —|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—

 

2.  卷積核大小、卷積層數選擇 

2.1 卷積核大小、卷積層數與參數、計算開銷的關系

 

上四圖(上左-1、上右-2、下左-1、下右-2)闡釋了,為什么很多流行的深度卷積網絡多采用小而深的卷積核與網絡結構:

  • 卷積層的卷積核去計算上一層圖像中與卷積核大小相同的感知域區域(感受野),得出一個數值。在卷積核掃描過上一層圖像之后,得到的這些數值將組合成新的特征圖。之后的卷積層重復相同的工作。(圖1)
  • 卷積核的權重在這步驟中告訴模型如何去理解圖片、抽象出有用的圖片信息。這個過程逐步抽象,這個抽象的方法就是各層卷積核的權重。
  • 為獲得一個抽點的像素點,一個7*7的卷積核完成的任務,可以用3個3*3的卷積核去復現。(圖2)
  • 7*7的卷積核有49個權重,而3層、每層用3*3的卷積核的權重只有27個權重(圖3)
  • 通過拆分卷積核、增加卷積層數、可以降低計算復雜度。
  • 除此之外,深層的網絡由於多層激活函數嵌套的原因,會提升更多的非線性擬合能力,使網絡能夠表示的函數范圍更寬泛。

 

2.2 卷積核大小(kernel_size)和卷積層個數如何選擇

CNN網絡結構設計的 觀點:

  • 每一層卷積有多少filters,以及一共有多少層卷積,這些暫時沒有理論支撐。一般都是靠感覺去設置幾組候選值,然后通過實驗挑選出其中的最佳值。
  • 每一層卷積的filters數和網絡的總卷積層數,構成了一個巨大的超參集合。一來沒有理論去求解這個超參集合里的最優,二來沒有足夠的計算資源去窮舉這個超參集合里的每一個組合,因此我們不知道這個超參集合里的最優組合是什么。
  • 雖然說目前有比較火的研究方向針對這種自動神經網絡結構搜索(NAS),這些自動搜索出來的網絡在常規數據集上的建模結果顯示(當然是達到一定的准確度):自動搜索出來的網絡中的卷積核的類別有包括各種常見的型號(3*3、5*5、7*7),且在網絡中的前后排布沒有規律。
  • 知乎的一位網友認為:“在網絡中使用不同種類、不同大小的卷積核,尤其是在非串聯結構中,大概率會取得更好的效果。” 
  • 在ProxylessNAS中,作者發現:降采樣層的卷積核大小相對較大,作者認為大的卷積核有利於在降采樣時保留更多的信息
  • 至於卷積核的大小. 取決於要提取的特征分布和區分度.如果本身要提取的特征很小那卷積核也應該很小,卷積核太大比如16x16 vs 4x4這樣的差異可能導致丟失一些局部特征。

 

2.3. feature map個數如何選擇

(tf.keras中卷積層的filters參數)

  • 關於feature map的個數,有一個大部分網絡都在遵循的原則就是當輸出特征圖尺寸減半時,輸出特征圖的通道數應該加倍,這樣保證相鄰卷積層所包含的信息量不會相差太大
  •  至於全連接層的節點數,首先現有的分類網絡的最后一層幾乎都是使用softmax函數激活,輸出圖片屬於每一個類別的概率值,所以最后一層的節點數等於待分類圖片的類別數,這是毋庸置疑的。而在Network in network提出全局平均池化(GAP)后,主流的網絡幾乎都是在特征圖尺寸降低到7*7左右時,直接GAP+全連接+softmax輸出分類概率。這樣網絡中只有一層全連接層,其輸入節點數是GAP之前的特征圖個數,輸出節點數是圖片分類類別數目。



 

 附上一個從別的知乎網友那里扒來的資料

 

 

 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM