查看原文
其他

对深度可分离卷积、分组卷积、空洞卷积的通俗理解(上篇)

草yang年华 机器学习与python集中营 2021-09-10


python进阶教程

机器学习

深度学习

长按二维码关注

进入正文


对深度可分离卷积、分组卷积、空洞卷积的通俗理解

声明:卷积神经网络经过这些年的发展已经非常成熟,有着非常繁多的网络类型,其核心机制都在于“卷积核”的设计,现在涌现出了非常多的卷积思想,在各个领域各领风骚,比如深度可分离卷积、分组卷积、空洞(扩张)卷积、转置(反)卷积、可变性卷积、通道加权卷积等。这里只介绍这六种,限于篇幅,将分为两篇系列文章进行说明,本篇为上篇,介绍前三个。

文章较长,阅读全文约20min。


目录

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

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

1.2 深度可分卷积的过程

1.3 深度可分卷积的优点

二 分组卷积(Group convolution)

2.1 什么是分组卷积

2.2 分组卷积具体的例子

三 空洞(扩张)卷积

(Dilated/Atrous Convolution)

3.1 图说空洞卷积的概念

3.2 空洞卷积的动态过程

3.3 Dilated Convolution感受野指数级增长


01

深度可分离卷积

传统标准卷积:

同时考虑到了图像的区域和通道,即一个卷积核需要对所有的通道进行相同的卷积操作,然后再进行加和,最后得到这个卷积核的一个输出。

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



在《Python深度学习》(Keras之父执笔)这本书里看到:

注意,大部分(或全部)普通卷积很可能不久后会被深度可分离卷积(depthwise separable convolution)所替代, 后者与前者等效,但速度更快,表示效率更高。

深度可分离卷积的成功应用就是Google的Xception网络,Xception网络的提出者也就是keras之父,真大牛。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” ,缩写“DW”。

这种操作是相当有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,而且也同时减少了大量的参数。后面会有例子的。

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


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

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

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



深度可分卷积的过程

而应用深度可分离卷积的过程是①用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个参数。

这是不是远远小于前面的4068个参数


深度可分卷积的优点

(1)可以看出运用深度可分离卷积比普通卷积减少了所需要的参数;

(2)重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道。实现了通道和区域的分离。这样做的理论前提是,我们在标准卷积中默认了各个通道间的关系是一样的,但是事实真的就是如此吗?并不一定,所以可以各个通道分开进行卷积运算;

(3)深度可分离卷积也是有通道信息融合的,它的过程分为两个部分,depthwise(逐层)+pointwise(逐像素)。前者负责卷积运算,后者使用1x1卷积核进行通道间的像素融合。



02

分组卷积(Group convolution)


Group convolution 分组卷积,最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。



什么是分组卷积

在说明分组卷积之前我们用一张图来体会一下一般的卷积操作。

从上图可以看出,一般的卷积会对输入数据的整体一起做卷积操作,即输入数据:H1×W1×C1;而卷积核大小为h1×w1,一共有C2个,然后卷积得到的输出数据就是H2×W2×C2。这里我们假设输出和输出的分辨率是不变的。主要看这个过程是一气呵成的,这对于存储器的容量提出了更高的要求。
但是分组卷积明显就没有那么多的参数。先用图片直观地感受一下分组卷积的过程。对于上面所说的同样的一个问题,分组卷积就如下图所示。 

可以看到,图中将输入数据分成了2组(组数为g),需要注意的是,这种分组只是在深度(即通道上)上进行划分,即某几个通道编为一组,这个具体的数量由(C1/g)决定。因为输出数据的改变,相应的,卷积核也需要做出同样的改变。即每组中卷积核的深度也就变成了(C1/g),而卷积核的大小是不需要改变的,此时每组的卷积核的个数就变成了(C2/g)个,而不是原来的C2了。然后用每组的卷积核同它们对应组内的输入数据卷积,得到了输出数据以后,再用concatenate的方式组合起来,最终的输出数据的通道仍旧是C2。也就是说,分组数g决定以后,那么我们将并行的运算g个相同的卷积过程,每个过程里(每组),输入数据为H1×W1×C1/g,卷积核大小为h1×w1×C1/g,一共有C2/g个,输出数据为H2×W2×C2/g。



分组卷积具体的例子

从一个具体的例子来看,Group conv本身就极大地减少了参数。比如当输入通道为256,输出通道也为256,kernel size为3×3,不做Group conv参数为256×3×3×256。实施分组卷积时,若group为8,每个group的input channel和output channel均为32,参数为8×32×3×3×32,是原来的八分之一。而Group conv最后每一组输出的feature maps应该是以concatenate的方式组合。

Alex认为group conv的方式能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。

分组卷积的进阶应用ShuffleNet

在AlexNet的Group Convolution当中,特征的通道被平均分配到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。

经过channel shuffle之后,Group conv输出的特征能考虑到更多通道,输出的特征自然代表性就更高。另外,AlexNet的分组卷积,实际上是标准卷积操作,而在ShuffleNet里面的分组卷积操作是depthwise卷积,因此结合了通道洗牌和分组depthwise卷积的ShuffleNet,能得到超少量的参数以及超越mobilenet、媲美AlexNet的准确率!

另外值得一提的是,微软亚洲研究院MSRA最近也有类似的工作,他们提出了一个IGC单元(Interleaved Group Convolution),即通用卷积神经网络交错组卷积,形式上类似进行了两次组卷积,Xception 模块可以看作交错组卷积的一个特例,特别推荐看看这篇文章:王井东详解ICCV 2017入选论文:通用卷积神经网络交错组卷积

要注意的是,Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把两者应用起来了。因此Group conv和Depthwise +Pointwise并不能划等号。

总结:ShuffleNet=

Group Convolution+Depthwise +Pointwise



03

空洞(扩张)卷积

空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3

x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,【正常的convolution 的 dilatation rate为 1】。

图说空洞卷积的概念

(a)图对应3x3的1-dilated conv,和普通的卷积操作一样。(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,需要注意的是空洞的位置全填进去0,填入0之后再卷积即可。【此变化见下图】(c)图是4-dilated conv操作。
在上图中扩张卷积的感受野可以由以下公式计算得到;其中i+1表示dilated rate。
比如上图中(a),dilated=1,F(dilated) = 3×3;图(b)中,dilated=2,F(dilated)=7×7;图(c)中,dilated=4, F(dilated)=15×15。
dilated=2时具体的操作,即按照下图在空洞位置填入0之后,然后直接卷积就可以了。



空洞卷积的动态过程

在二维图像上直观地感受一下扩张卷积的过程:

上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。
在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。



Dilated Convolution感受野
           指数级增长
对于标准卷积核情况,比如用3×3卷积核连续卷积2次,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了多少个Feature点呢?

第3层:

      

第2层:

第1层:

   

第一层的一个5×5大小的区域经过2次3×3的标准卷积之后,变成了一个点。也就是说从size上来讲,2层3*3卷积转换相当于1层5*5卷积。题外话,从以上图的演化也可以看出,一个5×5的卷积核是可以由2次连续的3×3的卷积代替。
但对于dilated=2,3*3的扩张卷积核呢?
第3层的一个点:

第2层:

可以看到第一层13×13的区域,经过2次3×3的扩张卷积之后,变成了一个点。即从size上来讲,连续2层的3×3空洞卷积转换相当于1层13×13卷积。



推 荐 阅 读

生成对抗网络入门指南(内含资源和代码)
python协程系列(六)——asyncio+tkinter开发无阻塞程序以及timer的模拟
python协程系列(五)——asyncio的核心概念与基本架构

机器学习面试真题1000题详细讲解(八)

2018 开源软件最受欢迎 TOP 50


赶紧关注我们吧

您的点赞和分享是我们进步的动力!

↘↘↘

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存