Depth-wise Convolution keras 运行时间缓慢原因

提到depth-wise conv2D 大家都如数家珍,这里我就简单的介绍一下,用两张图就可以概述出来了,大家想要看具体的介绍可以看

A Basic Introduction to Separable Convolutions 这篇文章介绍的很清楚。

上图是一个正常的卷积操作,是一个12×12×3的特征图经过256个卷积核大小为5×5×3的卷积得到了一个8×8×256的特征图。这是正常的卷积。参数量为256 x 5 x 5 x 3 = 19200,乘法次数为256 x 5 x 5 x 3 x 8 x 8 = 1228800。

上图就是一个depthwisie-conv2D 卷积了。可以看到它采用了3个5×5×1的卷积核来操作得到3个8×8 ×3的特征图。其参数量

3 x 5 x 5 x 1 乘法次数为3 x 5 x 5 x 1 x 8 x 8。我们可以看到参数量核乘法次数大大降低了。下面是一个 Point-wise Conv.的操作。这两个加起来就是一个Separable Conv 了。

我们可以看到这两个卷积操作加起来的参数量和正常的卷积操作比起来大大降低了参数量。那么我们是不是可以直接用这个了。都有这么多优点了为啥我见到的用的人比较少昵。当我们使用keras 中的depthwiseconv2D 操作时这个时候发现网络的运行速度大大降低了。不是说好参数量减少了,不是说运行速度提升呀。这个问题我也时一直疑惑的。直到我看到这个文章。

Flops与模型的推理速度。这个文章解释的很清楚了。简单来说,depth-wise卷积的FLOPs更少没错,但是在相同的FLOPs条件下,depth-wise卷积需要的IO读取次数是普通卷积的100倍,因此,由于depth-wise卷积的小尺寸,相同的显存下,我们能放更大的batch来让GPU跑满,但是此时速度的瓶颈已经从计算变成了IO。自然desired小尺寸卷积应该有的快速的特性,也无法实现。

看到这里我终于明白为啥一些大组喜欢用这个卷积了,因为他们有很好的机器的,可以更好的发挥depthwiseconv2D 网络的性能了。

猜你喜欢

转载自blog.csdn.net/nijiayan123/article/details/106938955
今日推荐