Depthwise Separable convlution | 举例详细解释

例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。

 

一 基本理解

先上一张图

      下图就是depthwise separable convolution的示意图,其实就是将传统的卷积操作分成两步,假设原来是3*3的卷积,那么depthwise separable convolution就是先用M个3*3卷积核一对一卷积输入的M个feature map,不求和,生成M个结果;然后用N个1*1的卷积核正常卷积前面生成的M个结果,求和,最后生成N个结果。因此文章中将depthwise separable convolution分成两步,一步叫depthwise convolution,就是下图的(b),另一步是pointwise convolution,就是下图的(c)。

这里写图片描述

     

         假设,输入的feature map大小为DF * DF,维度为M,滤波器的大小为DK * DK,维度为N,并且假设padding为1,stride为1。则,

原始的卷积操作,需要进行的矩阵运算次数为DK · DK · M · N · DF · DF,卷积核参数为DK · DK · N · M

depthwise separable convolutions需要进行的矩阵运算次数为DK · DK ·M · DF · DF + M · N · DF · DF,卷积核参数为DK · DK · M+N · M

由于卷积的过程,主要是一个spatial dimensions减少,channel dimension增加的过程,即N>M,所以,DK · DK · N · M> DK · DK · M+N · M。

二、举例

       直观上来看,这种分解在效果上确实是等价的。比如,把上图的代号化为实际的数字,输入图片维度是11 × 11 × 3,标准卷积为3 × 3 × 3 ×16(假设stride为2,padding为1),那么可以得到输出为6 × 6 × 16的输出结果。现在输入图片不变,先通过一个维度是3 × 3 × 1 × 3的深度卷积(输入是3通道,这里有3个卷积核,对应着进行计算,理解成for循环),得到6 × 6 × 3的中间输出,然后再通过一个维度是1 × 1 × 3 ×16的1 ×1卷积,同样得到输出为6 × 6 × 16。以上解析还可以借助一幅经典的GIF图来理解,先放这里了。此处的矩阵运算计算量是原来:11x11x3x3x3x16 =522272 ; 现在是11x11x3x3x3+11x11x3x16 = 9075.我自己理解现在是11x11x3x3x3+6x6x3x16 = 5995,因为中间输出的尺寸是6x6.

è¿éåå¾çæè¿°

 

参考:

CNN网络优化学习总结——从MobileNet到ShuffleNet

你可能感兴趣的:(mobilenet)