摘要:在卷积神经网络中,经过使用filters提取不一样的特征,这些filters的权重是在训练期间自动学习的,而后将全部这些提取的特征“组合”以作出决策。
本文分享自华为云社区《神经网络经常使用卷积总结》,原文做者:fdafad 。git
进行卷积的目的是从输入中提取有用的特征。在图像处理中,能够选择各类各样的filters。每种类型的filter都有助于从输入图像中提取不一样的特征,例如水平/垂直/对角线边缘等特征。在卷积神经网络中,经过使用filters提取不一样的特征,这些filters的权重是在训练期间自动学习的,而后将全部这些提取的特征“组合”以作出决策。github
目录:
- 2D卷积
- 3D卷积
- 1*1卷积
- 空间可分离卷积
- 深度可分离卷积
- 分组卷据
- 扩展卷积
- 反卷积
- 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 x 3 x 1),该通道是使用filters(3 x 3 x 3矩阵)对输入层(5 x 5 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卷积而言,表面上好像只是feature maps中的每一个值乘了一个数,但实际上不只仅如此,首先因为会通过激活层,因此其实是进行了非线性映射,其次就是能够改变feature maps的channel数目。url
上图中描述了:在一个维度为 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 的输出层。spa
空间可分离卷积
在一个可分离卷积中,咱们能够将内核操做拆分红多个步骤。咱们用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 x 128 的单个层。空间维度如高和宽缩小了,而深度则扩大了。以下图所示:
接下来看看使用深度可分离卷积如何实现一样的转换。首先,咱们在输入层上应用深度卷积。咱们在 2D 卷积中分别使用 3 个卷积核(每一个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每一个卷积核仅对输入层的 1 个通道作卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,以后再将这些映射堆叠在一块儿建立一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。这样的话,图像的深度保持与原来的同样。
深度可分离卷积—第一步:在 2D 卷积中分别使用 3 个卷积核(每一个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每一个卷积核仅对输入层的 1 个通道作卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,以后再将这些映射堆叠在一块儿建立一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。深度可分离卷积的第二步是扩大深度,咱们用大小为 1x1x3 的卷积核作 1x1 卷积。每一个 1x1x3 卷积核对 5 x 5 x 3 输入图像作卷积后都得出一个大小为 5 x 5 x1 的映射。
这样的话,作 128 次 1x1 卷积后,就能够得出一个大小为 5 x 5 x 128 的层。
分组卷积
Group convolution 分组卷积,最先在AlexNet中出现,因为当时的硬件资源有限,训练AlexNet时卷积操做不能所有放在同一个GPU处理,所以做者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
下面描述分组卷积是如何实现的。首先,传统的 2D 卷积步骤以下图所示。在这个案例中,经过应用 128 个过滤器(每一个过滤器的大小为 3 x 3 x 3),大小为 7 x 7 x 3 的输入层被转换为大小为 5 x 5 x 128 的输出层。针对通用状况,可归纳为:经过应用 Dout 个卷积核(每一个卷积核的大小为 h x 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 is a very unfortunate name and should rather be called a transposed convolutional layer. 咱们能够知道,在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的计算过程以下图所示:
针对输入feature map的一个坐标点上的特征向量,先经过 ∅ (FC-BN-ReLU-FC)和reshape (channel-to-space)变换展开成kernel的形状,从而获得这个坐标点上对应的involution kernel,再和输入feature map上这个坐标点邻域的特征向量进行Multiply-Add获得最终输出的feature map。具体操做流程和tensor形状变化以下:
另外做者基于MM系列代码,实现了mmclassficton、mmsegmentation、mmdetection中的部分模型。