文章目录
https://towardsdatascience.com/types-of-convolution-kernels-simplified-f040cb307c37
直观介绍了各种迷人的CNN层
一个简短的介绍
卷积使用“kernel”从输入图像中提取某些“特征”。kernel是一个矩阵,可在图像上滑动并与输入相乘,从而以某种我们期望的方式增强输出。看下面的GIF。
上面的kernel可用于锐化图像。但是这个kernel有什么特别之处呢?考虑下图所示的两个输入图像。第一个图像,中心值为3 * 5 + 2 * -1 + 2 * -1 + 2 * -1 + 2 * -1 =7,值3增加到7。第二个图像,输出是1 * 5 + 2 * -1 + 2 * -1 + 2 * -1 + 2 * -1 = -3,值1减少到-3。显然,3和1之间的对比度增加到了7和-3,图像将更清晰锐利。
通过深层 CNN,我们无需再用手工设计的kernel来提取特征,而是可以直接学习这些可提取潜在特征的kernel值。
Kernel与Filter
在深入探讨之前,我想先明确区分“kernel”和“filter”这两个术语,因为我已经看到很多人把它们混为一谈。如前所述,kernel是权重矩阵,将权重矩阵与输入相乘以提取相关特征。卷积名称就是kernel矩阵的维数。例如,2D卷积的kernel矩阵就是2D矩阵。
但是,filter是多个kernel的串联,每个kernel分配给输入的特定通道。filter总是比kernel大一维。例如,在2D卷积中,filter是3D矩阵(本质上是2D矩阵(即kernel)的串联)。因此,对于具有kernel尺寸h * w和输入通道k的CNN层,filter尺寸为k * h * w。
一个普通的卷积层实际上由多个这样的filter组成。为了简化下面的讨论,除非另有说明,否则假定仅存在一个filter,因为所有filter都会重复相同的操作。
1D,2D和3D卷积
一维卷积通常用于时间序列数据分析(因为这种情况下的输入为一维)。如前所述,一维数据输入可以具有多个通道。滤波器只能沿一个方向移动,因此输出为1D。参见下面的单通道一维卷积示例。
我们已经在帖子的开头看到了一个单通道2D卷积的示例,因此让我们可视化一个多通道2D卷积,并尝试理解它。在下图中,kernel尺寸为3 * 3,并且filter中有多个这样的kernel(标记为黄色)。这是因为输入中有多个通道(标记为蓝色),并且我们有一个kernel对应于输入中的每个通道。显然,这里的filter可以在两个方向上移动,因此最终输出是2D。2D卷积是最常见的卷积,在计算机视觉中大量使用。
很难可视化3D filter(因为它是4D矩阵),因此我们在这里只讨论单通道3D卷积。如下图所示,在3D卷积中,kernel可以在3个方向上移动,因此获得的输出也是3D。
在修改和自定义CNN层方面所做的大多数工作都只集中在2D卷积上,因此从现在开始,我只讨论2D卷积的变种。
转置(Transposed)卷积
在CNN中,转置卷积是一种上采样(up-sampling)的常见方法。
上采样有诸多方法,举例如下.
最近邻插值(Nearest neighbor interpolation)
双线性插值(Bi-linear interpolation)
双立方插值(Bi-cubic interpolation)
但是, 上述的方法都需要插值操作, 而这些插值的操作都充满了人为设计和特征工程的气息, 而且也没有网络进行学习的余地.
为何需要转置卷积?
如果我们想要网络去学出一种最优的上采样方法
,我们可以使用转置卷积.它与基于插值的方法不同,它有可以学习的参数
.转置卷积也被称作: "反卷积(Deconvolution)”.
从信息论的角度看,卷积是不可逆的.所以这里说的并不是从output矩阵和kernel矩阵计算出原始的input矩阵.而是计算出一个保持了位置性关系的矩阵
https://blog.csdn.net/lanadeus/article/details/82534425?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162623437516780269883100%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162623437516780269883100&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~hot_rank-1-82534425.first_rank_v2_pc_rank_v29&utm_term=%E8%BD%AC%E7%BD%AE%28Transposed%29%E5%8D%B7%E7%A7%AF&spm=1018.2226.3001.4187
https://blog.csdn.net/tsyccnh/article/details/87357447
为了使用卷积实现此目标,我们使用了称为转置卷积或反卷积(它并不是真正的“逆转”卷积运算,所以很多人不喜欢使用反卷积这个术语)的卷积修改版。下面的GIF中的虚线块表示padding。
DepthWise convolution(Xception)
卷积操作时必须同时考虑通道和区域吗?为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?
Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” ,缩写“DW”。
可分离卷积(空间、深度可分离卷积)
可分离卷积是指将卷积kernel分解为低维kernel。可分离卷积有两种主要类型。
空间上可分离的卷积,如下,空间可分离的卷积在深度学习中并不常见。
深度可分离卷积,即:先深度卷积,再点态卷积。被广泛用于轻量级CNN模型中,并提供了非常好的性能。一些轻量级的网络,如mobilenet中,会有深度可分离卷积depthwise separable convolution,由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map
https://zhuanlan.zhihu.com/p/92134485
- 逐通道卷积
Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积
一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),如下图所示。
其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下:
N_depthwise = 3 × 3 × 3 = 27
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map
- 逐点卷积
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map
由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为:
N_pointwise = 1 × 1 × 3 × 4 = 12
经过Pointwise Convolution之后,同样输出了4张Feature map,与常规卷积的输出维度相同
参数对比
回顾一下,常规卷积的参数个数为:
N_std = 4 × 3 × 3 × 3 = 108
Separable Convolution的参数由两部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39
相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。
但是为什么用可分离的卷积呢?效率!!
使用可分离卷积可以显著减少所需参数的数量。随着当今我们的深度学习网络的复杂性不断提高和规模越来越大,迫切需要以更少的参数提供相似的性能。
扩张/空洞(Dilated/Atrous)卷积
https://www.zhihu.com/question/54149221
https://zhuanlan.zhihu.com/p/113285797?utm_source=cn.wps.moffice_eng
如你在以上所有卷积层中所见,无一例外,它们将一起处理所有相邻值。但是,有时跳过某些输入值可能更好,这就是为什么引入扩张卷积(也称为空洞卷积)的原因。这样的修改允许kernel在不增加参数数量的情况下增加其感受野。
显然,可以从上面的动画中注意到,kernel能够使用与之前相同的9个参数来处理更广阔的邻域。这也意味着由于无法处理细粒度的信息(因为它跳过某些值)而导致信息丢失。但是,在某些应用中,总体效果是正面的。
可变形(Deformable)卷积
https://zhuanlan.zhihu.com/p/28749411
传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。
可变形卷积是在基础卷积核的上添加一些位移量,根据数据的学习情况,自动调整偏移,卷积核可以在任意方向进行伸缩,改变感受野的范围,该位移量是靠额外的一个卷积层进行自动学习的,如下图,(a)是普通的卷积,卷积核大小为3*3,采样点排列非常规则,是一个正方形。(b)是可变形的卷积,给每个采样点加一个offset(这个offset通过额外的卷积层学习得到),排列变得不规则。(c)和(d)是可变形卷积的两种特例。对于(c)加上offset,达到尺度变换的效果;对于(d)加上offset,达到旋转变换的效果。
就特征提取的形状而言,卷积非常严格。也就是说,kernel形状仅为正方形/矩形(或其他一些需要手动确定的形状),因此它们只能在这种模式下使用。如果卷积的形状本身是可学习的呢?这是引入可变形卷积背后的核心思想。
实际上,可变形卷积的实现非常简单。每个kernel都用两个不同的矩阵表示。第一分支学习从原点预测“偏移”。此偏移量表示要处理原点周围的哪些输入。由于每个偏移量都是独立预测的,它们之间无需形成任何刚性形状,因此具有可变形的特性。第二个分支只是卷积分支,其输入是这些偏移量处的值。
某一点P0经过标准卷积后结果为
而经过可变形卷积后的结果为:
分组卷积(Group convolution)
混洗分组卷积(ShuffleNet)
在AlexNet的Group Convolution当中,特征的通道被平均分到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。
代表模型:
MobileNet 、ResNeXt
空间和跨通道卷积(Inception结构)
传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好,谷歌的GoogleNet,或者说Inception系列的网络,就使用了多个卷积核的结构:
但这个结构会存在一个严重的问题:参数量比单个卷积核要多很多,如此庞大的计算量会使得模型效率低下。这就引出了一个新的结构:
Bottleneck(减少卷积层参数量)
发明GoogleNet的团队发现,如果仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如图所示:
加入1×1卷积核的Inception结构
根据上图,我们来做个对比计算,假设输入feature map的维度为256维,要求输出维度也是256维。有以下两种操作:
- 256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map,那么参数量为:256×3×3×256 =589,824
- 256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一!
1×1卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应用上1×1卷积核。
Xception结构
“极端形式”同SeparableConv的区别主要有两点:
- 3x3卷积和1x1卷积的先后顺序。 原来的Inception结构是先1x1卷积,后3x3卷积。作者认为这里的区别并不重要。
- 两个卷积层之间是否有激活函数。 原来的Inception中间是有ReLU激活的。 但实验结果证明不加激活效果更好。
扁平化卷积(Flattened Convolutions)
其将标准的卷积核拆分成3个1D卷积核,(Flattened Convolutional Neural Networks for Feedforward Acceleration,链接:https://arxiv.org/abs/1412.5474)
该方法可以通过扁平化网络在3D空间的所有方向上训练模型,学习参数显著减少,但能获得与标准卷积相当的性能。