深度學習各式卷積介紹

by allenlu2007

Reference: 

View story at Medium.com

https://po.baidu.com/feed/share?isBdboxShare=1&context=%7B%22nid%22%3A%22news_2849076689852113814%22%2C%22sourceFrom%22%3A%22bjh%22%7D

 

卷積神經網絡作为深度學習的典型網路,在圖像處理和计算機视覺等多个领域都取得了很好的效果。

Paul-Louis 在Medium上通过这篇文章快速地介绍了不同类型的卷積结構(Convolution)及优勢。为了简单起见,本文僅探讨二维卷積结構。
 

Convolution

首先定義卷積层的参数。
 
 卷積核为3、步幅为1和带有边界扩充的二维卷積结構
卷積核大小(Kernel Size):定義了卷積操作的感受域。在二维卷積中,通常设置为3,即卷積核大小为3×3。我認為應該要和 image spatial frequency 有關。
步幅(Stride):定義了卷積核遍历圖像时的步幅大小。其默认值通常设置为1,也可将步幅设置为2 后对圖像进行下采样,这种方式与最大池化类似。
边界扩充(Padding):定義了網路层處理样本边界的方式。当卷積核大于1且不进行边界扩充,输出尺寸将相应缩小;当卷積核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等。
输入与输出通道(Channels):構建卷積层时需定義输入通道 I,并由此确定输出通道O。这样,可算出每个網路层的参数量为 I×O×K,其中K为卷積核的参数个数。例,某个網路层有64个大小为3×3的卷積核,则对应K值为 3×3 =9。
此處輸入和輸出通道和 image size 完全無關。而是輸入和輸出特徵 filter 的數目。 
 

Delated Convolution

空洞卷積(atrous convolutions)又名扩张卷積(dilated convolutions),向卷積层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定義了卷積核處理数据时各值的间距。
 
 卷積核为3、扩张率为2和无边界扩充的二维空洞卷積
一个扩张率为2的3×3卷積核,感受与5×5的卷積核相同,而且僅需要9个参数。你可以把它想象成一个5×5的卷積核,每隔一行或一列删除一行或一列。
在相同的计算条件下,空洞卷積提供了更大的感受域。空洞卷積经常用在实时圖像分割中。当網路层需要较大的感受,但计算资源有限而无法提高卷積核数量或大小时,可以考虑空洞卷積。
空洞卷積是補零嗎? 補零效果應該不好。似乎該用 near_neighbor 填補。 
 

Transposed Convolution

轉置卷積(transposed Convolutions)又名反卷積(deconvolution)或是分数步长卷積(fractially straced convolutions)。
反卷積(deconvolutions)这种叫法是不合适的,因为它不符合反卷積的概念。在深度學習中,反卷積确实存在,但是并不常用。实际上,反卷積是卷積操作的逆过程。你可以这么理解这个过程,将某个圖像输入到单个卷積层,取卷積层的输出传递到一个黑盒子中,这个黑盒子输出了原始圖像。那么可以说,这个黑盒子完成了一个反卷積操作,也就是卷積操作的数学逆过程。主要是用在 generative model (e.g. Autoencoder, GAN).
 
轉置卷積与真正的反卷積有点相似,因为两者产生了相同的空间分辨率。然而,这两种卷積对输入数据执行的实际数学运算是不同的。轉置卷積层只执行了常规的卷積操作,但是恢复了其空间分辨率。
 
 卷積核为3、步幅为2和无边界扩充的二维卷積结構
举个例子,假如将一张5×5大小的圖像输入到卷積层,其中步幅为2,卷積核为3×3,无边界扩充。则卷積层会输出2×2的圖像。
若要实现其逆过程,需要相应的数学逆运算,能根据每个输入像素来生成对应的9个值。然后,将步幅设为2,遍历输出圖像,这就是反卷積操作。
 
 卷積核为3×3、步幅为2和无边界扩充的二维轉置卷積
轉置卷積和反卷積的唯一共同点在于两者输出都为5×5大小的圖像,不过轉置卷積执行的仍是常规的卷積操作。为了实现扩充目的,需要对输入以某种方式进行填充。
你可以理解成,至少在数值方面上,轉置卷積不能实现卷積操作的逆过程。
轉置卷積只是为了重建先前的空间分辨率,执行了卷積操作。这不是卷積的数学逆过程,但是用于编码器-解码器结構中,效果仍然很好。这样,轉置卷積可以同时实现圖像的粗粒化和卷積操作,而不是通过两个单独过程来完成。
 

Separable Convolution (2D convolution is separated into 2 1D convolution)

在可分离卷積(separable convolution)中,可将卷積核操作拆分成多个步骤。卷積操作用y=conv(x, k)来表示,其中输出圖像为y,输入圖像为x,卷積核为k。接着,假设k可以由下式计算得出:k=k1.dot(k2)。这就实现了一个可分离卷積操作,因为不用k执行二维卷積操作,而是通过k1和k2分别实现两次一维卷積来取得相同效果。

 X、Y方向上的 Sobel 滤波器
Sobel算子通常被用于圖像處理中,这里以它为例。你可以分别乘以向量[1,0,-1]和[1,2,1]的轉置向量后得到相同的滤波器。完成这个操作,只需要6个参数,而不是二维卷積中的9个参数。
这个例子说明了什么叫做空间可分离卷積,这种方法并不应用在深度學習中,只是用来帮你理解这种结構。
在神經網絡中,我们通常会使用深度可分离卷積结構(depthwise separable convolution)。
这种方法在保持通道分离的前提下,接上一个深度卷積结構,即可实现空间卷積。
 
接下来通过一个例子让大家更好地理解。
假设有一个3×3大小的卷積层,其输入通道为16、输出通道为32。具体为,32个3×3大小的卷積核会遍历16个通道中的每个数据,从而产生16×32=512个特征圖谱。进而通过叠加每个输入通道对应的特征圖谱后融合得到1个特征圖谱。最后可得到所需的32个输出通道。
针对这个例子应用深度可分离卷積,用1个3×3大小的卷積核遍历16通道的数据,得到了16个特征圖谱。在融合操作之前,接着用32个1×1大小的卷積核遍历这16个特征圖谱,进行相加融合。这个过程使用了16×3×3+16×32×1×1=656个参数,远少于上面的16×32×3×3=4608个参数。
这个例子就是深度可分离卷積的具体操作,其中上面的深度乘数(depth multiplier)设为1,这也是目前这类網路层的通用参数。
这么做是为了对空间信息和深度信息进行去耦。从Xception模型的效果可以看出,这种方法是比较有效的。由于能够有效利用参数,因此深度可分离卷積也可以用于移动设备中。
Advertisements