专栏首页GiantPandaCV【CNN结构设计】深入理解深度可分离卷积

【CNN结构设计】深入理解深度可分离卷积

1. 常规卷积

常规卷积

相信接触过卷积神经网络的都知道常规卷积的操作

我们通过个大小的卷积核

卷积出来的结果为

现在我们来计算一下常规卷积的计算开销(以最简单的stride(步长)为的情况进行讨论)

卷积层每一步操作的开销

一个卷积核做一次卷积操作需要的开销为,这里是卷积核大小,则为通道数。

一个卷积核完整地卷积完一次所需开销为,这里指的是卷积完成后的特征图长宽。

我们一共使用个这样的卷积核进行卷积计算,因此最后总的计算开销为:

2. Depthwise卷积

下面我们来看以下Depthwise卷积的步骤

在常规的卷积中,我们的卷积核都对每个通道进行了一次计算

而Depthwise卷积只对一个通道进行卷积计算,因此Depthwise卷积是不会改变原始特征图的通道数目

深度可分离卷积的Depthwise卷积步骤

原始特征图大小为

我们需要用相同通道数目个卷积核进行卷积

换句话说就是用个的卷积核分别对一个通道进行卷积计算

M个Dk*DK*1的卷积核分别对一个通道进行卷积计算

3. Pointwise卷积

上面的Depthwise卷积有一个问题是,它只让卷积核单独对一个通道进行计算,但是各个通道之间的信息并没有达到交换,从而在网络后续信息流动中会损失通道之间的信息 因此我们加入一个Pointwise操作,来进一步融合通道之间的信息这个操作也十分简单,就是常规的卷积核,形如下图:

1x1卷积核

通过这样一个卷积核,我们能在尽可能减少计算量的情况下,加强通道之间信息的交互

接下来我们继续推导下Pointwise卷积核这部分的计算量

假设一共有个的卷积核

Pointwise卷积示意图

原始特征图为

一个卷积核计算开销为:

一个卷积核卷积完原始特征图的计算开销为:

我们一共使用个卷积核,所以总开销为:

最后我们来看一下Depthwise和Pointwise这两部分的计算量:

Depthwise和Pointwise这两部分的计算量

4. 和传统卷积相比

和传统卷积相比,深度可分离卷积的计算量减少了N倍

可以看到Depthwise + Pointwise卷积的计算量相较于传统卷积减少了倍!

在达到相同目的(即对相邻元素以及通道之间信息进行计算)下,Dpethwise + Pointwise能极大减少卷积计算量,这也导致了大量移动端网络上都采用了这种卷积结构,再加上模型蒸馏,剪枝,能让移动端更高效的计算,推理。

5. 一个延伸

另外华为最近出了一篇GhostNet文章,对移动端网络感兴趣的可以去看看,该文章同时结合了常规卷积和Depthwise卷积,通过普通卷积得出一系列特征图,再通过Depthwise方式在这一系列特征图得出另外一部分特征图,最后「concate」到一起:

GhostNet的模块

6. 代码实现

部分框架有提供Depthwise卷积API,这里就不再赘述了。

其他框架可以参考下面我的PaddlePaddle框架代码来实现:

import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Conv2D, BatchNorm


class DepthwiseConv(fluid.dygraph.Layer):
    """
    通过分组卷积实现Depthwise卷积
    卷积前后通道数不变
    """

    def __init__(self, size, stride):
        """
        :param inputs: 输入张量
        :param size: 卷积核大小
        """
        super(DepthwiseConv, self).__init__()
        self.size = size
        self.stride = stride
        self.padding = (int(self.size - self.stride) + 1) // 2

    def forward(self, inputs):
        channels = inputs.shape[1]  # 获取输入通道数
        # print(channels)
        depthwise = Conv2D(num_channels=channels, filter_size=self.size, stride=self.stride,
                           padding=(self.padding, self.padding), num_filters=channels)
        out = depthwise(inputs)
        return out

本文分享自微信公众号 - GiantPandaCV(BBuf233),作者:zzk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 卷积神经网络学习路线

    ------------------------------------分割线----------------------------------

    BBuf
  • 卷积神经网络学习路线(一)| 卷积神经网络的组件以及卷积层是如何在图像中起作用的?

    这是卷积神经网络学习路线的第一篇文章,这篇文章主要为大家介绍卷积神经网络的组件以及直观的为大家解释一下卷积层是如何在图像中发挥作用的。

    BBuf
  • 卷积神经网络学习路线(二)| 卷积层有哪些参数及常用卷积核类型盘点?

    上一篇推文介绍了卷积神经网络的组成层以及卷积层是如何在图像中起作用的,推文地址为:https://mp.weixin.qq.com/s/MxYjW02rWfRK...

    BBuf
  • 通道洗牌、变形卷积核、可分离卷积?盘点卷积神经网络中十大令人拍案叫绝的操作。

    CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量。我下面会对近几年一些具有变革性的工...

    用户1332428
  • 图像处理论文详解 | Deformable Convolutional Networks | CVPR | 2017

    这个核心贡献在于,为什么卷积过程中卷积核一定要是正方形的?我的检测目标各种形状都有,为什么卷积核一定要是正方形的呢?

    机器学习炼丹术
  • 简谈卷积—幽默笑话谈卷积

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。...

    FPGA技术江湖
  • 吃透空洞卷积(Dilated Convolutions)

    空洞卷积在图像分割需要增加感受野同时保持特征图的尺寸的需求中诞生,本文详细介绍了空洞卷积的诞生、原理、计算过程以及存在的两个潜在的问题,帮助大家将空洞卷积这一算...

    公众号机器学习与生成对抗网络
  • LRNNet:轻量级FCB& SVN实时语义分割

    语义分割可以看作是一种按像素分类的任务,它将特定的预定义类别分配给图像中的每个像素。该任务在自动驾驶和图像编辑等方面具有广泛的应用前景。近年来,轻量化神经网络的...

    3D视觉工坊
  • LRNNet:轻量级FCB& SVN实时语义分割

    语义分割可以看作是一种按像素分类的任务,它将特定的预定义类别分配给图像中的每个像素。该任务在自动驾驶和图像编辑等方面具有广泛的应用前景。近年来,轻量化神经网络的...

    计算机视觉
  • 推荐 | 深度学习反卷积最易懂理解

    普通图像反卷积,跟深度学习中的反卷积是一回事吗?别傻傻分不清!其实它们根本不是一个概念

    OpenCV学堂

扫码关注云+社区

领取腾讯云代金券