Depthwise卷积与Pointwise卷积

1,263 阅读3分钟

Depthwise(DW) 卷积与 Pointwise(PW) 卷积,合起来被称作Depthwise Separable Convolution(参见Google的Xception),该结构和常规卷积操作类似,可用来提取特征,但相比于常规卷积操作,其参数量和运算成本较低。所以在一些轻量级网络中会碰到这种结构如MobileNet。

常规卷积操作(看清操作)

对于一张5×5像素、三通道彩色输入图片(shape为5×5×3)。经过3×3卷积核的卷积层(假设输出通道数为4,则卷积核shape为3×3×3×4),最终输出4个Feature Map,如果有same padding则尺寸与输入层相同(5×5),如果没有则为尺寸变为3×3。

output_5.png

Depthwise Separable Convolution

Depthwise Separable Convolution是将一个完整的卷积运算分解为两步进行,即Depthwise ConvolutionPointwise Convolution

Depthwise Convolution

不同于常规卷积操作,Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积。上面所提到的常规卷积每个卷积核是同时操作输入图片的每个通道。 同样是对于一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,不同于上面的常规卷积,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),如下图所示。

output_6.png

Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。

Pointwise Convolution

Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×MM为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。如下图所示。

output_7.png

针对于上面的两种情况,我的理解如下:
常规卷积:

我们的核数量就是我们最终输出的通道数量,本身的通道数量是images的通道数量,假设图片彩色3通道,我们最终经过卷积之后输出的通道数是100,那么我们有100组3通道大小为3 * 3的卷积核,100 [3,3,3] conv [image_height,image_width,3],同时假设padding = "same",最终输出 [image_height,image_width,100],这就是普通卷积的计算过程。 深度可分离卷积: 我们给每一个通道都配上一个卷积核,假设图片有[image_height,image_width,100],我们就有100个卷积核,每个卷积核都是[3,3],假设padding="same",这样我们还是有[image_height,image_width,100]的特征map,这个部分是Depthwise Convolution完成的,然后我们将我们得到的100个特征map,经过K组[1,1,100]的卷积,第一个map会生成100个中间特征A,第二个map会生成100个中间特征B,第三个map会生成100个中间特征C,将ABC组合到一起就会形成一个长度300的中间特征,在将这300个中间特征按不同权重叠加生成一个新的feature map,以此类推,最终会形成K个不同的feature map。