精华内容
下载资源
问答
  • 深度可分离卷积

    千次阅读 多人点赞 2019-03-22 09:06:25
    下面这个文章介绍了深度可分离卷积是...(我记得有一片文章证明了深度可分离卷积和正常卷积是等效的,但是暂时没找到链接。) 正常卷积 原始图像是12x12的,由于是RGB格式的,所以有三个通道。其输入图片格式是:12...

    下面这个文章介绍了深度可分离卷积是怎么做的:
    https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728
    https://eli.thegreenplace.net/2018/depthwise-separable-convolutions-for-machine-learning/
    本文的很多内容都是在这两个文章的基础上整理的。

    卷积基础

    描述一个二维矩阵,使用row col。三维的,使用channel row col。四维则多了一个参数:batch channel row col。batch channel row col的逻辑顺序则和数据格式有关,常见的有NHWC和NCHW:https://mp.weixin.qq.com/s/I4Q1Bv7yecqYXUra49o7tw?

    2D卷积

    2D卷积只有col row的概念。(略)

    3D卷积和4D卷积

    我们先看3D卷积。
    假设过滤器窗口是3x3x3(其中一个3代表了in_depth)。有四个这样的窗口,用于提取同一个图片的四个属性(out_depth 0…3指定,对应输出Out channel 0…3)。那么,针对图片里面的某个Batch(譬如Batch 0),四个过滤器窗口的处理流程如下(请注意:四个过滤器,操作的都是同一组数据,即都是Batch 0):
    在这里插入图片描述
    参考的源码实现里面,i,j代表了输出的某个属性的任意位置的值。这个值,是窗口和输入卷积得来的。

    参考的源代码(Copy 自引文):

    def conv2d_multi_channel(input, w):
        """Two-dimensional convolution with multiple channels.
    
        Uses SAME padding with 0s, a stride of 1 and no dilation.
    
        input: input array with shape (height, width, in_depth)
        w: filter array with shape (fd, fd, in_depth, out_depth) with odd fd.
           in_depth is the number of input channels, and has the be the same as
           input's in_depth; out_depth is the number of output channels.
    
        Returns a result with shape (height, width, out_depth).
        """
        assert w.shape[0] == w.shape[1] and w.shape[0] % 2 == 1
    
        padw = w.shape[0] // 2
        padded_input = np.pad(input,
                              pad_width=((padw, padw), (padw, padw), (0, 0)),
                              mode='constant',
                              constant_values=0)
    
        height, width, in_depth = input.shape
        assert in_depth == w.shape[2]
        out_depth = w.shape[3]
        output = np.zeros((height, width, out_depth))
    
        for out_c in range(out_depth):
            # For each output channel, perform 2d convolution summed across all
            # input channels.
            for i in range(height):
                for j in range(width):
                    # Now the inner loop also works across all input channels.
                    # 卷积操作是用窗口和输入的所有通道做乘加运算。
                    for c in range(in_depth):
                        #下面这段应该封装为一个新的函数:用于求解输出的某个属性的卷积。
                        for fi in range(w.shape[0]):
                            for fj in range(w.shape[1]):
                                w_element = w[fi, fj, c, out_c]
                                output[i, j, out_c] += (
                                    padded_input[i + fi, j + fj, c] * w_element)
        return output
    

    所谓4D,就是对每个Batch重复上面的过程。

    参考文献:
    https://eli.thegreenplace.net/2018/depthwise-separable-convolutions-for-machine-learning/

    正常卷积

    原始图像是二维的,大小是12x12。由于是RGB格式的,所以有三个通道,这相当于是一个3维的图片。其输入图片格式是:12x12x3。滤波器窗口大小是5x5x3。这样的话,得到的输出图像大小是8x8x1(padding模式是valid)。

    12x12x3 * 5x5x3 => 8x8x1

    在这里插入图片描述

    一个5x5x3滤波器得到的输出图像8x8x1,仅仅提取到的图片里面的一个属性。如果希望获取图片更多的属性,譬如要提取256个属性,则需要:

    12x12x3 * 5x5x3x256 => 8x8x256

    如下图(图片引用自原网站。感觉应该将8x8x256那个立方体绘制成256个8x8x1,因为他们不是一体的,代表了256个属性):

    在这里插入图片描述

    正常卷积的问题在于,它的卷积核是针对图片的所有通道设计的(通道的总数就是depth)。那么,每要求增加检测图片的一个属性,卷积核就要增加一个。所以正常卷积,卷积参数的总数=属性的总数x卷积核的大小。

    深度可分离卷积

    深度可分离卷积的方法有所不同。正常卷积核是对3个通道同时做卷积。也就是说,3个通道,在一次卷积后,输出一个数。
    深度可分离卷积分为两步:

    • 第一步用三个卷积对三个通道分别做卷积,这样在一次卷积后,输出3个数。
    • 这输出的三个数,再通过一个1x1x3的卷积核(pointwise核),得到一个数。

    所以深度可分离卷积其实是通过两次卷积实现的。

    第一步,对三个通道分别做卷积,输出三个通道的属性:
    在这里插入图片描述
    第二步,用卷积核1x1x3对三个通道再次做卷积,这个时候的输出就和正常卷积一样,是8x8x1:
    在这里插入图片描述

    如果要提取更多的属性,则需要设计更多的1x1x3卷积核心就可以(图片引用自原网站。感觉应该将8x8x256那个立方体绘制成256个8x8x1,因为他们不是一体的,代表了256个属性)::
    在这里插入图片描述
    可以看到,如果仅仅是提取一个属性,深度可分离卷积的方法,不如正常卷积。随着要提取的属性越来越多,深度可分离卷积就能够节省更多的参数。

    证明过程

    有一篇文章证明了深度可分离卷积和正常卷积是等效的(如果有需要的话,我再整理):
    https://arxiv.org/abs/1808.05517
    https://arxiv.org/abs/1610.02357

    参数的选择过程

    展开全文
  • 点击蓝字关注我们AI研习图书馆,发现不一样的世界深度可分离卷积深度可分离卷积(depthwise separable convolution)在可分离卷积(separable convolution)中,通常将卷积操作拆分成多个步骤。而在神经网络中通常使用的...
    0404f73013d78c34a612eb2c6abeeb75.gif点击蓝字关注我们

    AI研习图书馆,发现不一样的世界

    深度可分离卷积

    深度可分离卷积(depthwise separable convolution)

    在可分离卷积(separable convolution)中,通常将卷积操作拆分成多个步骤。而在神经网络中通常使用的就是深度可分离卷积(depthwise separable convolution)。

    举个例子,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。

    那么一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到的输出是只有一个通道的数据。之所以会得到一通道的数据,是因为刚开始3×3×16的卷积核的每个通道会在输入数据的每个对应通道上做卷积,然后叠加每一个通道对应位置的值,使之变成了单通道,那么32个卷积核一共需要(3×3×16)×32 =4068个参数。

    标准卷积与深度可分离卷积的不同

    用一张图来解释深度可分离卷积,如下:

    801839155b0a8849537b1c4d7ddd7697.png

    可以看到每一个通道用一个filter卷积之后得到对应一个通道的输出,然后再进行信息的融合。而以往标准的卷积过程可以用下面的图来表示:

    4a3e877b8941958545e03d19d527736e.png

    深度可分离卷积的过程

    举例说明,应用深度可分离卷积的过程:

    ①用16个3×3大小的卷积核(1通道)分别与输入的16通道的数据做卷积(这里使用了16个1通道的卷积核,输入数据的每个通道用1个3×3的卷积核卷积),得到了16个通道的特征图,我们说该步操作是depthwise(逐层)的,在叠加16个特征图之前;

    ②接着用32个1×1大小的卷积核(16通道)在这16个特征图进行卷积运算,将16个通道的信息进行融合(用1×1的卷积进行不同通道间的信息融合),我们说该步操作是pointwise(逐像素)的。这样我们可以算出整个过程使用了3×3×16+(1×1×16)×32 =656个参数。

    深度可分离卷积的优点

    可以看出,运用深度可分离卷积比普通卷积减少了所需要的参数。重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道,实现了通道和区域的分离。

    使用深度可分离卷积,可以加速训练进程,并且训练出来的模型参数更少,速度更快,适用于轻量化模型。

    神经网络系列学习笔记不断更新中,学习笔记,在此记录~

    推荐阅读文章

    [1] AI入门-人工智能的前世今生[2] AI入门-深度学习综述[3] AI入门-计算机视觉学习指南[附资源][4] 深度学习框架总结—国际篇[5] 深度学习-CNN结构设计技巧[6] 资源分享-深度学习及数据分析等资源合集

    [7] 今日分享—统计学习方法

    [8] 算法总结—人脸检测算法

    [9] 目标检测算法-YOLOv4 

    [10] 项目总结—人脸检测

    [11] 项目实战-人脸口罩检测

    [12] 深度学习基础-二十种损失函数

    [13] 深度学习-目标检测的十九个研究方向

    [14] 项目实战-车辆检测案例实现

    [15] Python学习-实战小案例

    [16] 数据结构与算法-Python语言案例实现

       ......

    eef3dd43c50b5264ac1d47a92cfd072a.giff62b18a40e5fcdb6364de94ef3b0a71c.png点击"在看"了解更多精彩内容985c17562dc16d013d82723738737f78.pngdb0cf7a2355ecafb0ee2e7cc40c56d05.png转载是一种动力 分享是一种美德034a3ecd2b114829709307696fa8733c.png公众号 :AI研习图书馆CSDN博客:算法之美DLGitHub:statisticszhang5ad0c931baba582fbfcdedaf1b7aaa5b.png

    关注AI研习图书馆,发现不一样的精彩世界

    f3897419a6ad82f735238473cac6ee3d.png

    dc4fbbe9be4df0cd8454953926e57da1.png
    展开全文
  • 1、什么是深度可分离卷积? 2、传统卷积的参数和计算量: 可分离卷积包括两部(逐通道卷积+逐点卷积) 3、参数对比 4、计算量对比

    1、什么是深度可分离卷积?

    2、传统卷积的参数和计算量:

    可分离卷积包括两部(逐通道卷积+逐点卷积) 

    3、参数对比

     

    4、计算量对比

    展开全文
  • 深度可分离卷积的过程:先深度卷积,再点态卷积 (对卷积中的通道数不了解的请参考:关于卷积中的通道数问题) 1. 深度卷积过程:对于一个12*12*3的像素图用一个3通道的5*5*1的卷积核进行卷积。(而不是用一个5*...
    • 空间可分离卷积:将一个卷积核分为两部分(降低计算复杂度,但并非所有的卷积核都可以分)

         

          

    • 深度可分离卷积的过程:先深度卷积,再点态卷积

    对卷积中的通道数不了解的请参考:关于卷积中的通道数问题

    1. 深度卷积过程:对于一个12*12*3的像素图用一个3通道的5*5*1的卷积核进行卷积。(而不是用一个5*5*3的卷积核进行卷积)

    注意:每个5*5*1的卷积核卷积图像的一个通道,得到一个8*8*1的像素图,将这些图像叠加才是一个8*8*3的图。

    2. 点态卷积:将多通道的图像转换为单通道图像,因为使用的是1*1大小的卷积核,所以叫点态卷积。

    注意:因为最终结果的通道数只与卷积核的个数有关,所以可以用1*1*3的卷积核将深度卷积的结果8*8*3进行点态卷积,得到8*8*1的图像。

    如果要得到256通道的8*8*1图像,就用256个1*1*3的卷积核进行卷积

     

     

    深度可分离卷积有什么用:关于深度可分离卷积可以减少计算量的问题

    展开全文
  • 深度可分卷积与深度可分离卷积 之前在网上看了很多的关于深度可分卷积和深度可分离卷积的名词,但是关于这两个的到底是不是同一个卷积,都没有看到解释。 深度可分卷积(Depthwise Separable Convolution)是将普通...
  • 空间可分离卷积、深度可分离卷积、分组卷积联系区别 空间可分离卷积将卷积核矩阵M分解为m1和m2,对输入图片先用m1卷积,在对m1卷积的结果用m2卷积。 深度可分离卷积:对输入图像的每个通道分别设置一个卷积核,...
  • 如,GoogLeNet中提到的Inception结构中将普通的3x3卷积替换为连续的1x3和3x1卷积,实际完成的是空间可分离卷积spatial separable convolution,如MobileNet、ShuffleNet、EffNet,都使用了深度可分离卷积depthwise ...
  • 理解深度可分离卷积

    2020-03-11 10:16:52
    看了几篇别人的文章,记录一下对深度可分离卷积的理解。 说到深度可分离卷积前,需要说下分组卷积。 1.分组卷积 图1:标准卷积操作 图2:分组卷积操作 2.深度可分离卷积(Depthwise separable convolution) 图3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 759
精华内容 303
关键字:

深度可分离卷积