【深度学习】各种各样的卷积形式

开始之前首先学习一个单词热热身:
sibling 英[ˈsɪblɪŋ]
n. 兄; 弟; 姐; 妹;


1、2D卷积

     把普通的卷积过程看作是在输入层中滑动一个三维filter。其中,输入层和filter具有相同的通道数。三维filter仅在图像的两个方向(高度和宽度)上移动,所以称为2D卷积。在每个滑动位置,执行元素相乘并求和,结果是一个数字(放于红格子中)。

     假设输入层有Din通道,希望输出层有Dout通道。可以将Dout个filter应用到输入层。每个滤波器都有Din个通道数。每个filter提供一个输出通道。在应用了Dout个filter之后,便得到了Dout通道,这些通道叠加在一起形成输出层。
在这里插入图片描述
     关于卷积后特征图的大小计算,用s表示stride长度,p表示padding长度,如果原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为:
在这里插入图片描述


2、3D卷积

     三D卷积是二D卷积的推广。在三D卷积中,filter通道数小于输入层通道数。因此,3D filter可以在3个方向(输入的的高度、宽度、通道)移动。在每个位置,元素的乘法和加法都生成一个数字。由于滤波器在三维空间中滑动,因此输出结果也是三维形式,即输出三维数据。


3、1×1卷积

     1×1卷积主要是用来改变输出通道维数的,在Resnet bottleneck中,首先将256维度的通道数由1×1卷积降为64,最后的输出时再由1×1卷积升为256,减小了模型运算参数量。
1×1卷积可以理解为将输入特征图的不同通道间的数据做一个加权求和的过程,得到的这个数值代表了整个输入特征图的不同通道间数据相关联的程度。
在这里插入图片描述


4、转置卷积(反卷积)

     上面两张图一张为正常卷积操作,一张为反卷积操作,总之只要提到卷积操作,一定是将大的特征图在经过卷积核的遍历之后变成小的特征图(无padding情况下),那么反卷积操作一定是先将小的特征图通过一定的插值方式变为大的特征图,再进行正常卷积,那首先怎么获得这个大的特征图呢?——interpolation

假设:

原特征图:width、height

输入的卷积核:kernel_size = sizestride、padding

插值后的新特征图大小:
Height_in = height + (stride - 1) × (height-1)Width同理。

对于插值,第一,插0;第二,位置在原特征图两两数字中间插入stride - 1列。

新的卷积核:kernel_size = SizeStride = 1、Padding = Size - padding - 1

反卷积后的特征图大小:
Height_out = (Height_in + 2 * Padding - Size) / stride + 1 ,该式中参数均针对于插值后的特征图大小,利用原始输入特征图参数代入得到:

Height_out = ( height+ (stride - 1) × (height-1)+ 2 * (Size - padding - 1) - size) / 1 + 1

一个例子:

pytorch中对应的反卷积函数:

nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)

     在语义分割——UNet / UNet++【论文笔记】中详细提到了在神经网络中对特征图进行放大的三种方式,包括上池化、上采样、转置卷积。


5、Dilated Convolution (空洞卷积或扩张卷积)

在这里插入图片描述

     相比原来的正常convolution,dilated convolution 多了一个hyper-parameter 称之为dilation rate指的是kernel的间隔数量(e.g. 正常的 convolution 是dilatation rate=1)。如果dilation rater,那么就会在卷积核的每两个元素之间插入r-1个空洞。空洞卷积多用于语义分割等基于像素分类的任务中。
在这里插入图片描述
     然而 Deep CNN 对于其他任务还有一些致命性的缺陷。较为显著的是 up-sampling 和 pooling layer 的设计。主要问题有:

  1. Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable);
  2. 内部数据结构丢失;空间层级化信息丢失;
  3. 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)

     在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution的设计就良好的避免了这些问题。它可以获取long-ranged information。然而光采用大dilation rate的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。

通向标准化设计:Hybrid Dilated Convolution (HDC)
     第一个特性是,叠加卷积的dilation rate不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积,依然会出现gridding effect
     第二个特性是,将 dilation rate 设计成 锯齿状结构,例如 [1, 2, 5, 1, 2, 5] 循环结构。而这样的锯齿状本身的性质就比较好的来同时满足小物体大物体的分割要求(小dilation rate来关心近距离信息,大dilation rate来关心远距离信息)。

     一个简单的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)

     在相同的计算条件下,空洞卷积提供了更大的感受野。Conv2d函数中的"dilation"参数即为空洞卷积的dilation rate

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

6、空间可分离卷积(没见用过)

     空间可分离卷积在图像的一个通道维度上进行,即高和宽两个维度。空间可分离卷积将卷积分解为两项单独的操作。下面例子中,一个卷积核为 3x3 的 Sobel 卷积核被拆分成了 3x1 和 1x3的两个卷积核。
在这里插入图片描述
     在卷积中,3x3 卷积核可以直接对图像进行卷积操作。在空间可分离卷积中,首先由 3x1 卷积核对图像进行卷积,之后再应用 1x3 卷积核。相当于在执行相同的操作中,仅需要 6 个参数即可(普通卷积为9个参数)。

     此外,比起卷积,空间可分离卷积执行的矩阵乘法运算次数也更少。举一个具体的例子,如下图用3x3卷积核在 5x5 图像上做卷积操作(stride=1),在每个位置都进行 9 次乘法运算,共执行 9 x 9 = 81 次运算。
在这里插入图片描述
     对于空间可分离卷积,首先在5 x 5图像上用3 x 1卷积计算,总共3× 5 x 3=45 次乘法运算;之后得到 3 x 5 的矩阵,这个矩阵经过 1 x 3 卷积核的卷积操作,这个步骤总共要求 9 x 3=27 次乘法运算。因此,该空间可分离卷积共进行了 45 + 27 = 72 次乘法运算,也比标准的卷积所要进行的乘法运算次数少。

在这里插入图片描述
     归纳一下,对于 m x m 的卷积核、卷积步长stride=1 、填充padding=0 ,对 N x N 图像做卷积操作。传统的卷积需要进行 (N-2) x (N-2) x m x m 次乘法运算,而空间可分离卷积只需要进行 N x (N-2) x m + (N-2) x (N-2) x m = (2N-2) x (N-2) x m 次乘法运算。空间可分离卷积与标准的卷积的计算成本之比为:

     对于图像大小N大远于filter的大小m的情况(N >> m),该比率可近似为2 / m,在这种情况下,对于一个 3x3 的filter,空间可分离卷积与标准的卷积之间的计算成本比率为 2/3;然而,虽然空间可分离卷积节省了计算成本,但很少应用于深度学习中。其原因为filter中的值是通过训练得到的,其很大几率不能被拆分为 2 个更小的卷积核相乘的结果。


7、分组卷积

     分组卷积是在2012年AlexNet网络提出的方法,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
在这里插入图片描述
     在分组卷积中,filter 被拆分为不同的组,每一个组都负责具有一定深度的 2D 卷积的工作。
在这里插入图片描述
     上图表示的是分组数取 2 时的分组卷积。在每个filter中,其深度仅为输入特征图通道数的一半(Din / 2),对于输出,每组包含 Dout /2 个 filter 。最终,每组 filter 都输出了 Dout/2 个通道。最后将输出通道进行堆叠,输出 Dout 个通道特征图。
     关于计算量的减少,对于 m x m 的卷积核、卷积步长stride=1 、填充padding=0 ,对 N x N ×Cin特征图做卷积操作,输出特征图通道数为Cout:
对于传统卷积操作,所需要的乘法运算次为 mxmxCinx(N-2)x(N-2)xCout

     对于分组卷积操作(groups=2),所需要的乘法运算次数为mxmxCin/2x(N-2)x(N-2)xCout/2
即乘法运算次数计算量变为原来的1/2,故使用分组卷积操作的计算量为传统卷积的1/G,其中G为分组数。
     pytorch中Conv2d函数中的"groups"参数即为分组卷积的分组数。在pytorch框架下,当仅有一个GPU训练时,分组数越多,网络训练越慢!深有体会。。

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

8、深度可分离卷积

在这里插入图片描述

     标准的卷积过程中,卷积核的通道数与输入特征图的通道数是相同的,即特征图所有通道均被同时考虑,那么为什么一定要同时考虑图像特征图区域和通道?为什么不能把通道和空间区域分开考虑?

     深度可分离卷积提出了一种新的思路:对于不同的输入特征图通道采取不同的单层卷积核进行卷积,它将标准卷积分解为两个过程:深度卷积(depthwise convolution, DW) + 逐点卷积(pointwise convolution, PW)

“Depthwise separable convolution are made up of two layers: depthwise convolutions and pointwise convolutions”.

      深度卷积: 就是把标准卷积中的卷积核变成单通道卷积核,若输入有 M 个通道数,就需要 M 个单层卷积核,每个通道分别进行卷积,最后做叠加:

      逐点卷积: 在进行 pointwise 卷积时使用了 output_channels种 维度为in_channels 1×1 的卷积核进行特征组合,普通卷积不同 depth 层的权重是按照 1:1:1…:1的比例进行相加的,而在这里不同 depth 层的权重是按照 不同比例(可学习的参数) 进行相加的。

      标准卷积与深度可分离卷积的过程对比如下:

      首先计算一下标准卷积的参数量与计算量:

      接下来计算深度可分离卷积的参数量和计算量:

      总体来说,采用深度可分离卷积后的模型参数及模型计算量缩减为原来的:

      我们采用的DK通常为3,故模型参数及计算量均缩减到原来的九分之一左右。

以上内容来自于轻量化网络—— MobileNet_v1【论文笔记】


9、可变形卷积

在这里插入图片描述
      可变形卷积, Deformable Convolution。
      传统/常规卷积基于定义的滤波器大小,在输入图像或一组输入特征图的预定义矩形网格上操作。该网格的大小可以是3×3和5×5等。然而,想要检测和分类的对象可能会在图像中变形或被遮挡。
      在DCN中,网格是可变形的,因为每个网格点都可以通过一个可学习的偏移量移动。卷积作用于这些移动的网格点上,因此称为可变形卷积,类似于可变形RoI池化的情况。

在这里插入图片描述

  • 规则的卷积是在一个规则的网格R上操作的。
  • 对R进行可变形卷积运算,但每个点都增加一个可学习的偏移∆pn。
  • 卷积生成2N个特征图,对应N个2D个偏移量∆pn(每个偏移量对应有x-方向和y-方向)。

可变形卷积由输入特征学习得到的偏移量来改变标准卷积的采样位置。
在这里插入图片描述PS:偏移量特征的分辨率与输入特征的分辨率相同,且通道数为采样点个数的两倍(即每个位置都有x和y两个方向的偏移量)。
在这里插入图片描述
      如上所示,可变形卷积将根据输入图像或特征图在不同位置为卷积选择值。

      顺便学习一下可变形池化:
在这里插入图片描述

  • 常规RoI Pooling将任意大小的输入矩形区域转换为固定大小的特征。
  • 在Deformable RoI Pooling中,首先,在top path中,仍然需要常规的RoI Pooling来生成池化的feature map。
  • 然后,使用一个全连接(fc)层生成归一化的偏移∆p̂ij,然后转化为偏移∆pij(方程在右下角)其中γ= 0.1。
  • 偏移量归一化是必要的,使偏移量的学习不受RoI大小的影响。
  • 最后,在底部路径执行deformable RoI pooling。输出特征图是基于具有增强偏移量的区域进行池化的。
    在这里插入图片描述
    PS:fc层的输出为bin个数的两倍(即每个bin都有x和y两个方向的偏移量)。

10 对齐卷积 Alignment Convolution

      在论文"Align Deep Features for Oriented Object Detection"中由武大提出的对齐卷积,可看成是可变形卷积的一种变体,该论文是解决遥感目标检测中针对于旋转目标的检测。
在这里插入图片描述
      这篇论文设计的网络叫做S2ANet,其主干网络为RetinaNet;与RetinaNet不同是的,在FPN之后的每一层预测网特征图上的每个网格中预先定义一个anchor,通过下图的ARN(Anchor Refinement Network)来学习HBB(Horizontal bbox)向OBB(Oriented bbox)转换的offset(▲x, ▲y, ▲w, ▲h, ▲θ)。
在这里插入图片描述
      可变形卷积中的offset是通过经过一个卷积层之后得到通道数为2N的特征图来得到相对于输入特征图的offset;而对于Alignment Convolution,直接采取ARN预测出的对于anchor的offset来作为变形卷积的offset。下图中的18表示采用3×3的卷积核有9个参数,且每个参数有offset_x和offset_y。这样经过变形后的卷积和微调后的anchor形状更加匹配,可以更加完整的学习物体的特征。
在这里插入图片描述
在这里插入图片描述

参考博客

欢迎关注【OAOA

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值