写点什么

带你认识 9 种常用卷积神经网络

发布于: 2021 年 06 月 28 日

​​​​​​​​​​​​​​​​​​摘要:在卷积神经网络中,通过使用 filters 提取不同的特征,这些 filters 的权重是在训练期间自动学习的,然后将所有这些提取的特征“组合”以做出决策。


本文分享自华为云社区《神经网络常用卷积总结》,原文作者:fdafad  。


进行卷积的目的是从输入中提取有用的特征。在图像处理中,可以选择各种各样的 filters。每种类型的 filter 都有助于从输入图像中提取不同的特征,例如水平/垂直/对角线边缘等特征。在卷积神经网络中,通过使用 filters 提取不同的特征,这些 filters 的权重是在训练期间自动学习的,然后将所有这些提取的特征“组合”以做出决策。

目录:


1.    2D 卷积

2.    3D 卷积

3.    1*1 卷积

4.    空间可分离卷积

5.    深度可分离卷积

6.    分组卷据

7.    扩展卷积

8.    反卷积

9.    Involution

2D 卷积

        

单通道:在深度学习中,卷积本质上是对信号按元素相乘累加得到卷积值。对于具有 1 个通道的图像,下图演示了卷积的运算形式:



​这里的 filter 是一个 3 x 3 的矩阵,元素为[[0,1,2],[2,2,0],[0,1,2]]。filter 在输入数据中滑动。在每个位置,它都在进行逐元素的乘法和加法。每个滑动位置以一个数字结尾,最终输出为 3 x 3 矩阵。

        

多通道:由于图像一般具有 RGB3 个通道,所以卷积一般多用于多通道输入的场景。下图演示了多通道输入场景的运算形式:

        

这里输入层是一个 5 x 5 x 3 矩阵,有 3 个通道,filters 是 3 x 3 x 3 矩阵。首先,filters 中的每个 kernels 分别应用于输入层中的三个通道,执行三次卷积,产生 3 个尺寸为 3×3 的通道:



​然后将这三个通道相加(逐个元素相加)以形成一个单个通道(3 x3 x 1),该通道是使用 filters(3 x3 x 3 矩阵)对输入层(5 x5 x 3 矩阵)进行卷积的结果:



3D 卷积

        

在上一个插图中,可以看出,这实际上是在完成 3D-卷积。但通常意义上,仍然称之为深度学习的 2D-卷积。因为 filters 的深度和输入层的深度相同,3D-filters 仅在 2 个维度上移动(图像的高度和宽度),得到的结果为单通道。通过将 2D-卷积的推广,在 3D-卷积定义为 filters 的深度小于输入层的深度(即卷积核的个数小于输入层通道数),故 3D-filters 需要在三个维度上滑动(输入层的长、宽、高)。在 filters 上滑动的每个位置执行一次卷积操作,得到一个数值。当 filters 滑过整个 3D 空间,输出的结构也是 3D 的。2D-卷积和 3D-卷积的主要区别为 filters 滑动的空间维度,3D-卷积的优势在于描述 3D 空间中的对象关系。3D 关系在某一些应用中十分重要,如 3D-对象的分割以及医学图像的重构等。



1*1 卷积

        

对于 1*1 卷积而言,表面上好像只是 featuremaps 中的每个值乘了一个数,但实际上不仅仅如此,首先由于会经过激活层,所以实际上是进行了非线性映射,其次就是可以改变 featuremaps 的 channel 数目。



上图中描述了:在一个维度为 H x W x D 的输入层上的操作方式。经过大小为 1 x 1 x D 的 filters 的 1 x 1 卷积,输出通道的维度为 H x W x 1。如果我们执行 N 次这样的 1 x 1 卷积,然后将这些结果结合起来,我们能得到一个维度为 H x W x N 的输出层。

空间可分离卷积

        

在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用 y = conv(x,k)表示卷积,其中 y 是输出图像,x 是输入图像,k 是内核。这一步很简单。接下来,我们假设 k 可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对 k1 和 k2 做 2 个一维卷积来取得相同的结果,而不是用 k 做二维卷积。



​以通常用于图像处理的 Sobel 内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1] .T 获得相同的内核。在执行相同的操作时,你只需要 6 个而不是 9 个参数。



深度可分离卷积

        

空间可分离卷积(上一小节),而在深度学习中,深度可分离卷积将执行一个空间卷积,同时保持通道独立,然后进行深度卷积操作。假设我们在一个 16 输入通道和 32 输出通道上有一个 3x3 的卷积层。那么将要发生的就是 16 个通道中的每一个都由 32 个 3x3 的内核进行遍历,从而产生 512(16x32)的特征映射。接下来,我们通过将每个输入通道中的特征映射相加从而合成一个大的特征映射。由于我们可以进行此操作 32 次,因此我们得到了期望的 32 个输出通道。那么,针对同一个示例,深度可分离卷积的表现又是怎样的呢?我们遍历 16 个通道,每一个都有一个 3x3 的内核,可以给出 16 个特征映射。现在,在做任何合并操作之前,我们将遍历这 16 个特征映射,每个都含有 32 个 1x1 的卷积,然后才逐此开始添加。这导致与上述 4608(16x32x3x3)个参数相反的 656(16x3x3 + 16x32x1x1)个参数。下面再进行详细说明。前面部分所提到的 2D 卷积核 1x1 卷积。让我们先快速过一下标准的 2D 卷积。举一个具体的案例,假设输入层的大小为 7 x 7 x 3(高 x 宽 x 通道),过滤器大小为 3 x 3 x 3,经过一个过滤器的 2D 卷积后,输出层的大小为 5 x 5 x 1(仅有 1 个通道)。如下图所示:



一般来说,两个神经网络层间应用了多个过滤器,现在假设过滤器个数为 128。128 次 2D 卷积得到了 128 个 5 x 5 x 1 的输出映射。然后将这些映射堆叠为一个大小为 5 x 5 x128 的单个层。空间维度如高和宽缩小了,而深度则扩大了。如下图所示:



​接下来看看使用深度可分离卷积如何实现同样的转换。首先,我们在输入层上应用深度卷积。我们在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3x 3 x 1),而不使用大小为 3x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5x 5 x 3 的图像,最终得出一个大小为 5x 5 x 3 的输出图像。这样的话,图像的深度保持与原来的一样。



​深度可分离卷积—第一步:在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3x 3 x 1),而不使用大小为 3x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5x 5 x 3 的图像,最终得出一个大小为 5x 5 x 3 的输出图像。深度可分离卷积的第二步是扩大深度,我们用大小为 1x1x3 的卷积核做 1x1 卷积。每个 1x1x3 卷积核对 5x 5 x 3 输入图像做卷积后都得出一个大小为 5x 5 x1 的映射。



这样的话,做 128 次 1x1 卷积后,就可以得出一个大小为 5x 5 x 128 的层。



分组卷积

        

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



​下面描述分组卷积是如何实现的。首先,传统的 2D 卷积步骤如下图所示。在这个案例中,通过应用 128 个过滤器(每个过滤器的大小为 3x 3 x 3),大小为 7x 7 x 3 的输入层被转换为大小为 5x 5 x 128 的输出层。针对通用情况,可概括为:通过应用 Dout 个卷积核(每个卷积核的大小为 hx w x Din),可将大小为 Hin x Win x Din 的输入层转换为大小为 Hout x Wout x Dout 的输出层。在分组卷积中,过滤器被拆分为不同的组,每一个组都负责具有一定深度的传统 2D 卷积的工作。下图的案例表示得更清晰一些。



扩张卷积

        

扩张卷积引入另一个卷积层的参数被称为扩张率。这定义了内核中值之间的间距。扩张速率为 2 的 3x3 内核将具有与 5x5 内核相同的视野,而只使用 9 个参数。 想象一下,使用 5x5 内核并删除每个间隔的行和列。(如下图所示)系统能以相同的计算成本,提供更大的感受野。扩张卷积在实时分割领域特别受欢迎。 在需要更大的观察范围,且无法承受多个卷积或更大的内核,可以才用它。



​直观上,空洞卷积通过在卷积核部分之间插入空间让卷积核「膨胀」。这个增加的参数 l(空洞率)表明了我们想要将卷积核放宽到多大。下图显示了当 l=1,2,4 时的卷积核大小。(当 l=1 时,空洞卷积就变成了一个标准的卷积)。



反卷积

        

这里提到的反卷积跟 1 维信号处理的反卷积计算是很不一样的,FCN 作者称为 backwards convolution,有人称 Deconvolution layer isa very unfortunate name and should rather be called a transposed convolutionallayer. 我们可以知道,在 CNN 中有 con layer 与 pool layer,con layer 进行对图像卷积提取特征,pool layer 对图像缩小一半筛选重要特征,对于经典的图像识别 CNN 网络,如 IMAGENET,最后输出结果是 1X1X1000,1000 是类别种类,1x1 得到的是。FCN 作者,或者后来对 end to end 研究的人员,就是对最终 1x1 的结果使用反卷积(事实上 FCN 作者最后的输出不是 1X1,是图片大小的 32 分之一,但不影响反卷积的使用)。这里图像的反卷积与图 6 的 full 卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN 作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现 end to end。



​目前使用得最多的 deconvolution 有 2 种: 

方法 1:full 卷积, 完整的卷积可以使得原来的定义域变大

方法 2:记录 pooling index,然后扩大空间,再用卷积填充。图像的 deconvolution 过程如下:



输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7       


即输入为 2x2 的图片经过 4x4 的卷积核进行步长为 3 的反卷积的过程        


1.输入图片每个像素进行一次 full 卷积,根据 full 卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4, 即 4x4 大小的特征图,输入有 4 个像素所以 4 个 4x4 的特征图        


2.将 4 个特征图进行步长为 3 的 fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是在原来的位置(右上角),步长为 3 是指每隔 3 个像素进行 fusion,重叠部分进行相加,即输出的第 1 行第 4 列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。

        

可以看出反卷积的大小是由卷积核大小与滑动步长决定, in 是输入大小, k 是卷积核大小, s 是滑动步长, out 是输出大小        

得到 out = (in- 1) * s + k        

上图过程就是, (2 - 1) *3 + 4 = 7

Involution


论文:Involution:Inverting the Inherence of Convolution for Visual Recognition (CVPR'21)

代码开源地址:https://github.com/d-li14/involution

        

尽管神经网络体系结构发展迅速,但卷积仍然是深度神经网络架构构建的主要组件。从经典的图像滤波方法中得到的灵感,卷积核具有 2 个显著的特性 Spatial-agnostic 和 Channel-specific。在 Spatial 上,前者的性质保证了卷积核在不同位置之间的共享,实现了平移不变性。在 Channel 域中,卷积核的频谱负责收集编码在不同 Channel 中的不同信息,满足后一种特性。此外,自从 VGGNet 出现以来,现代神经网络通过限制卷积核的空间跨度不超过 3*3 来满足卷积核的紧凑性。

        

一方面,尽管 Spatial-Agnostic 和 Spatial-Compact 的性质在提高效率和解释平移不变性等价方面有意义,但它剥夺了卷积核适应不同空间位置的不同视觉模式的能力。此外,局部性限制了卷积的感受野,对小目标或者模糊图像构成了挑战。另一方面,众所周知,卷积核内部的通道间冗余在许多经典深度神经网络中都很突出,这使得卷积核对于不同通道的灵活性受到限制。

        

为了克服上述限制,本文作者提出了被称为 involution 的操作,与标准卷积相比,involution 具有对称反向特性,即 Spatial-Specific 和 Channel-Agnostic。具体地说,involution 核在空间范围上是不同的,但在通道上是共享的。由于 involution 核的空间特性,如果将其参数化为卷积核等固定大小的矩阵,并使用反向传播算法进行更新,则会阻碍学习到的对合核在不同分辨率的输入图像之间的传输。在处理可变特征分辨率的最后,属于特定空间位置的 involution 核可能仅在对应位置本身的传入特征向量的条件下作为实例生成。此外,作者还通过在通道维数上共享 involution 核来减少核的冗余。

        

综合上述 2 个因素,involution 运算的计算复杂度随特征通道数量线性增加,动态参数化 involution 核在空间维度上具有广泛的覆盖。通过逆向设计方案,本文提出的 involution 具有卷积的双重优势:

        

1:involution 可以在更广阔的空间中聚合上下文,从而克服了对远程交互进行建模的困难

2:involution 可以在不同位置上自适应地分配权重,从而对空间域中信息最丰富的视觉元素进行优先排序。

        

大家也都知道最近基于 Self-Attention 进一步的研究表明,很多任务为了捕获特征的长期依赖关系提出使用 Transformer 来进行建模。在这些研究中,纯粹的 Self-Attention 可以被用来构建具有良好性能的独立模型。而本文将揭示 Self-Attention 是通过一个复杂的关于核结构的公式来对邻近像素之间的关系进行建模,其实也就是 involution 化的特殊情况。相比之下,本文所采用的核是根据单个像素生成的,而不是它与相邻像素的关系。更进一步,作者在实验中证明,即使使用简单版本,也可以实现 Self-Attention 的精确。

        

involution 的计算过程如下图所示:



​针对输入 featuremap 的一个坐标点上的特征向量,先通过 ∅ (FC-BN-ReLU-FC)和 reshape(channel-to-space)变换展开成 kernel 的形状,从而得到这个坐标点上对应的 involutionkernel,再和输入 featuremap 上这个坐标点邻域的特征向量进行 Multiply-Add 得到最终输出的 featuremap。具体操作流程和 tensor 形状变化如下:​



​另外作者基于 MM 系列代码,实现了 mmclassficton、mmsegmentation、mmdetection 中的部分模型。










点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 06 月 28 日阅读数: 12
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
带你认识9种常用卷积神经网络