目标检测 --- Depthwise Convolution(深度可分离卷积)原理与思考

目标检测 — Depthwise Convolution(深度可分离卷积)原理与思考

最近在研究mobilenet,其中有一层网络结构–Depthwise Convolution(深度可分离卷积),然后就拎出来仔细研究下~

参考:https://cloud.tencent.com/developer/article/1453992
https://www.zhihu.com/question/265434464

一、算法原理

1、先说一下常规的卷积操作
目标检测 --- Depthwise Convolution(深度可分离卷积)原理与思考_第1张图片
假设输入的feature map的shape为(64,64,3),想经过卷积之后得到的feature map的channels为4。那么常规的卷积就是利用4组(3,3,3)的卷积核进行卷积,那么最终所需要的参数大小为:

Convolution参数大小为:3 * 3 * 3 * 4 = 108

2、Depthwise Convolution(深度可分离卷积)
还是用上述的例子~
目标检测 --- Depthwise Convolution(深度可分离卷积)原理与思考_第2张图片
首先,先用一个3 * 3 * 3的卷积核在二维平面channels维度上依次与input feature map进行卷积,那么这个时候,output feature map的w和h已经与目标的feature map相同了,但是channels并没有达到目标,生成的feature map的channels还是3。
目标检测 --- Depthwise Convolution(深度可分离卷积)原理与思考_第3张图片
然后,基于上述生成的feature map,利用4组1 * 1 * 3的卷积核进行卷积,目的当然是改变channel为4(这一步其实还是常规的卷积操作,只不过卷积核的w和h都是1,这一点比较特殊)。
最后,生成的feature map与常规的卷积生成的feature map的shape完全相同。让我们来看下Depthwise Convolution(深度可分离卷积)所需要的参数大小:

Depthwise Convolution参数大小:3 * 3 * 3 + 1 * 1 * 3 * 4 = 27 + 12 = 39

相同的输入,同样是得到4张Feature map,Depthwise Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Depthwise Depthwise 的神经网络层数可以做的更深。

二、思考

最开始的时候,我并没有用Depthwise Convolution层(下载地址:https://github.com/yonghenglh6/DepthwiseConvolution.git)进行实现,是用常规的Convolution中group近似替代的。但是训练速度就超级超级慢~然后在知乎上一顿搜索,看看大神咋说的。最后,总结了几点:

1.caffe-ssd源码支持group convolution(即用group近似支持Depthwise Convolution),但是速度极慢,因为Depthwise Convolution在进行上述第一步的时候,是在channels维度进行for循环遍历将每一个channel进行卷积(理论上来说是可以用gpu实现for循环,但是作者并没有这么做,我也不清楚原因是为啥)
2.如果用Depthwise Convolution层去实现的话,速度大概会较group convolution提升4倍左右。

你可能感兴趣的:(目标检测,目标检测--小细节问题,Caffe,caffe,深度学习,神经网络)