caffe卷積層延伸:卷積核膨脹詳細解析

在筆者的上一篇博客中,解析caffe的卷積層時,在conv_layer.cpp中有一個卷積核膨脹操作,在conv_layer.cpp的第17行有如下代碼

const int kernel_extent = dilation_data[i] * (kernel_shape_data[i] - 1) + 1;

   上面的代碼描述了卷積核的膨脹操作,我們不妨來做個假設,卷積核爲3*3的,膨脹係數爲2,那麼,卷積核膨脹之後,卷積核的單邊尺寸就變成了2*(3-1)+1,即卷積核的尺寸變成了5*5,筆者在最初看到這一行代碼的時候相當疑惑,不太明白卷積核由3*3變成5*5是怎麼操作的,這個時候,caffe.proto就起了作用,我們打開caffe.proto,找到卷積層的參數定義,在message ConvolutionParameter中,找到關於dilation的定義如下
  // Factor used to dilate the kernel, (implicitly) zero-filling the resulting
  // holes. (Kernel dilation is sometimes referred to by its use in the
  // algorithme à trous from Holschneider et al. 1987.)
  repeated uint32 dilation = 18; // The dilation; defaults to 1

   在caffe.proto中,闡述了卷積核膨脹的使用情景,即在à trous算法中,這是一個有關小波分析的算法。卷積核膨脹是將卷積核擴張到膨脹尺度約束的尺度中,並將原卷積核沒有佔用的區域填充零,爲了使說明更加形象,下面筆者繪製卷積核膨脹示意圖爲大家解析一下卷積核膨脹操作:


   在上面的示意圖中,卷積核由3*3膨脹到了5*5,讀者朋友們可以看到,膨脹後的卷積核中填充了一些0,讀者朋友們可以試着畫出其他尺寸的卷積核搭配不同膨脹係數的膨脹效果,而具體的膨脹操作是在img2col中實現的,img2col.cpp筆者將在後話解析。

   下面筆者分析一下膨脹係數與卷積核膨脹的關係,首先回到卷積核膨脹公式:

膨脹的卷積核尺寸 = 膨脹係數 * (原始卷積核尺寸 - 1) + 1

   首先由於卷積的操作特性,卷積核尺寸是奇數,則原始卷積核尺寸減一爲偶數。那麼,在上述公式中,膨脹係數*偶數-1爲奇數,保證了膨脹的卷積核尺寸爲奇數。其次,筆者認爲,卷積核的膨脹係數刻畫了卷積核高和寬方向的擴張倍數,可將上述公式看作:

膨脹的卷積核尺寸 - 1 = 膨脹係數 * (原始卷積核尺寸 - 1)

   到此爲止,卷積核膨脹就解析完畢了,通過對卷積核膨脹的理解,筆者感受到,在閱讀源碼不明白時,尤其在對卷積這種抽象的操作中的細節不明白時,可以動筆畫一畫,將不形象轉爲形象,問題就迎刃而解了!

   在下一篇博客中,筆者打算解析一下caffe中卷積層實現必不可少的的im2col_cpu和col2im_cpu函數,作爲caffe卷積層解析的尾聲。

   歡迎閱讀筆者後續解析caffe源碼的博客,各位讀者朋友的支持與鼓勵是我最大的動力!
--------------------- 
作者:jiongnima 
來源:CSDN 
原文:https://blog.csdn.net/jiongnima/article/details/69487519 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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