深度学习系列(一)常见的卷积类型
人工智能的发展突飞猛进,主要得益于深度卷积神经网络,其在计算机视觉领域取得了巨大的成就,卷积神经网络依靠卷积操作对输入图像进行特征提取,卷积是一种线性的、具有平移不变性的局部加权运算,卷积运算也有很多改进方法,目的是提高运算速度或者提高网络的准确率。
目录
1、Convolution卷积2、Deconvolution(transposed Convolutions)反卷积(转置卷积)3、1x1/Pointwise Convolutions点级卷积4、Spatial and Cross-Channel Convolutions空间和跨通道卷积5、Grouped Convolutions组卷积6、Separable Convolutions可分离卷积6.1 Spatially Separable Convolutions空间可分离卷积6.2 Depthwise Separable Convolutions深度可分离卷积7、Flattened Convolutions扁平化卷积8、Shuffled Grouped Convolutions混洗分组卷积9、Pointwise grouped convolution逐点分组卷积10、Dilated Convolution(Atrous Convolution)空洞卷积(扩张卷积)11、Deformable Convolution可变形卷积
1、Convolution卷积
在进行图像处理时,传统上采用一阶微分算子或者二阶算子来提取诸如水平、垂直、边缘、纹理等图像的抽象特征,可以将这种线性操作称为卷积操作。 卷积的连续定义为:
离散的定义为:
直观的说,如果卷积核为3x3,那么在卷积核对输入图形进行滑动运算时,每个3x3像素区域对应相乘求和,得到的值为中心位置像素的值,在卷积神经网络中,卷积核的参数是由网络迭代自动更新学习的,且卷积具有权重共享的特性,卷积的一个示例如下图所示:
Python代码:
代码语言:javascript复制import torch
import torch.nn as nn
import torch.nn.functional as F
x = torch.randn(10, 16, 30, 32) # batch, channel , height , width
print(x.shape)
m = nn.Conv2d(16, 33, (3, 2), (2,1)) # in_channel, out_channel ,kennel_size,stride
print(m)
y = m(x)
print(y.shape)
原图像的高宽为h和w,卷积运算后新的图像大小计算过程: h/w = (h/w - kennel_size 2 x padding) / stride 1 x = ([10,16,30,32]),其中h=30,w=32,对于卷积核长分别是 3和2;对于步长分别2和1;padding默认0; h = (30 - 3 2 x 0)/ 2 1 = 27/2 1 = 13 1 =14 w = (32 - 2 2 x 0)/ 1 1 = 30/1 1 = 30 1 =31 batch = 10, out_channel = 33 所以卷积后的图像形状为y= ([10, 33, 14, 31])。
代表模型: LeNet:采用单卷积 单池化连接结构的方式,卷积核的尺寸(5x5,3x3)卷积层来做特征提取,池化来做空间下采样。 AlexNet:1)采用多个卷积 单池化的连接结构,增大卷积核的尺寸(11x11,7x7,5x5),使得提取的特征更加丰富。2)使用dropout来抑制过拟合。3)采用RELU激活函数替换之前的Sigmoid。 VGG:主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能,VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,提升神经网络的效果,而且代价还比较小(参数更少)。VGG16包含了16个隐藏层(13个卷积层和3个全连接层),VGG19包含了19个隐藏层(16个卷积层和3个全连接层)。但VGG也有缺点,更深的网络导致需要更多的模型参数和计算资源,注意绝大部分参数来自于第一个全连接层。
2、Deconvolution(transposed Convolutions)反卷积(转置卷积)
反卷积就是卷积的逆过程,其在提出后被使用,后来并不常用,反卷积就是将卷积的输出重新还原为原来大小,但其value是无法还原的,因此称为转置卷积更合适,因为并没有完全返回去。
下面给一个输出特征图大小的计算方式: 假设我们做转置卷积的输入特征图大小为 n×n,,卷积核大小为 k×k,步长stride为s,那么转置卷积需要在四周每个边缘补0的数量为s−1,边缘和内部插空补0后输入特征图大小变为s×n s−1,使用大小为k的卷积核进行卷积(滑动步长为1),得到的输出特征图大小为:(s×n s−1−k 1)/1=s×n (s−k),转置卷积并不是严格将输入特征图变为了s倍,而是还相差了个s−k。在实际的实现中,还有不同的padding, stride和dilation配置,输出图像大小也会随之改变。 代表模型: Deconvolutional networks
3、1x1/Pointwise Convolutions点级卷积
其实就是卷积核大小为1x1,主要通过将原来的3x3卷积变为1x1和3x3,约束通道个数进行数据降维,降低计算量。 代表模型: GoogLeNet(Inception)
4、Spatial and Cross-Channel Convolutions空间和跨通道卷积
主要是将跨通道相关性和空间相关性的操作拆分为一系列独立的操作,先使用1x1 Convolution来约束通道个数,降低计算量,然后每个分支都是用3x3卷积,最终使用concat的方式融合特征。
代表模型: Inception
5、Grouped Convolutions组卷积
组卷积最早出现在AlexNet,一般的卷积操作对输入图像进行整体的卷积计算,如下
而组卷积将输入图像分成多组,只是针对通道数(深度)进行分组,用每组的卷积核与对应组内的输入数据部分进行卷积计算,得到每组的输出数据之后通过Concat组合起来,如下:
分组卷积可以极大减少模型参数,同时增大卷积之间的对角相关性,不容易过拟合,相当于正则的效果。当输入通道为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,是原来的八分之一。
通过分为不同的组,每个组都负责一部分传统 2D 卷积的工作,显著减少了整个操作步骤。如下所示,过滤器分成了 3 组。过滤器组分别对输入层的红色、绿色和蓝色部分做卷积运算,每个过滤器组中的卷积核深度仅为输入层整个通道的 1/3。在这个案例中,进行第一个分组卷积 GConv1 后,输入层被映射到中间的特征映射上,之后特征映射又通过第一个分组卷积 GConv2 被映射到输出层上。
代表模型: ResNeXt是ResNet和Inception的结合,其每个分支都采用的相同的拓扑结构。ResNeXt本质是使用组卷积(Grouped Convolutions),通过基数( cardinality )来控制组的数量。
6、Separable Convolutions可分离卷积
6.1 Spatially Separable Convolutions空间可分离卷积
是在图像宽和高两个维度进行操作,就是将原来的nxn的卷积,变为1xn和nx1两步,以3x3卷积核为例,
采用2个3次乘法来替代9次乘法,计算复杂性降低,最著名的可在空间上分离的卷积是用于边缘检测的sobel滤波:
空间可分离卷积实用性并不强,主要是因为并非全部卷积都能分离成2个小卷积核,且会带来一定程度的信息损失。
6.2 Depthwise Separable Convolutions深度可分离卷积
其应用在是在数据的每个通道维度进行操作,如下是将通道深度分成3段,比如原通道为81,分成三个通道为27的卷积。
如果是要分成7段,模型可以变为如下:
后面加了一个1x1的pointwise convolution的卷积,可以看做是对那么多分离的通道做了个融合。 代表模型: Xception或者MobileNet
7、Flattened Convolutions扁平化卷积
其将标准的卷积核拆分成3个1D卷积核,(Flattened Convolutional Neural Networks for Feedforward Acceleration,链接:https://arxiv.org/abs/1412.5474),
该方法可以通过扁平化网络在3D空间的所有方向上训练模型,学习参数显著减少,但能获得与标准卷积相当的性能。 代表模型: Flattened Net
8、Shuffled Grouped Convolutions混洗分组卷积
最早由旷视研究院的 ShuffleNet 论文(ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices,https://arxiv.org/abs/1707.01083)提出,channel shuffle是为了消除Group Convolution组卷积中存在的副作用,组卷积将通道分组后,每个滤波器组织学习一部分特定的特性,阻碍特征信息在通道之间的传播,而channel shuffle通过随机打乱通道顺序解决以上问题。
下图中,第一个分组卷积 GConv1 后所得到的特征映射在进入到第二个分组卷积之前,先将每个组中的通道拆分为几个小组,然后再混合这些小组,不仅特征信息可以进行随机流通,模型可以获得更好的特征表示。
代表模型: MobileNet 、ResNeXt
9、Pointwise grouped convolution逐点分组卷积
也是来自ShuffleNet 论文(ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices,https://arxiv.org/abs/1707.01083)。在 MobileNet 或 ResNeXt 中的分组卷积中,分组卷积在 3x3 的空间卷积而不是 1x1 卷积上执行。该文章认为 1x1 卷积的计算成本也很高,提议也对 1x1 卷积进行分组,计算成本明显下降,以相对较小的计算成本以及良好的模型性能广受欢迎。
代表模型: ShuffleNet
10、Dilated Convolution(Atrous Convolution)空洞卷积(扩张卷积)
空洞卷积在Multi-scale context aggregation by dilated convolutions,https://arxiv.org/abs/1511.07122)提出,通过在卷积核中插入空洞使得卷积核膨胀(扩张),在不增加计算量的情况下,增加模型的感受野。pooling下采样操作会导致的信息丢失是不可逆的,在像素级预测语义分割中很重要,而空洞卷积可以代替pooling下采样。 标准的离散卷积公式为:
空洞卷积的公式为:
这里当l=1时,公式为标准卷积,下图为l=1,2,4时的卷积核大小,其实就是在3 x3的卷积核中插入l-1个空格,当l=1时,感受野为 3 x 3;l=2 时,感受野是 7 x 7;l=3 时,感受野增至 15x15。有趣的是,伴随这些操作的参数数量本质上是相同的,不需要增加参数运算成本就能「观察」大的感受野。
空洞卷积常被用以低成本地增加输出单元上的感受野,同时还不需要增加卷积核大小,当多个空洞卷积一个接一个堆叠在一起时,这种方式是非常有效的。空洞卷积可以用于多尺度的信息提取,有利于处理大目标的但缺点是会存在kernel不连续的情况,也就是并非所有点都能被计算,会导致信息的连续性有损失,这对致密的信息处理不友好。 代表模型: Dilated Convolution net
11、Deformable Convolution可变形卷积
可变形卷积是在基础卷积核的上添加一些位移量,根据数据的学习情况,自动调整偏移,卷积核可以在任意方向进行伸缩,改变感受野的范围,该位移量是靠额外的一个卷积层进行自动学习的,如下图,(a)是普通的卷积,卷积核大小为3*3,采样点排列非常规则,是一个正方形。(b)是可变形的卷积,给每个采样点加一个offset(这个offset通过额外的卷积层学习得到),排列变得不规则。(c)和(d)是可变形卷积的两种特例。对于(c)加上offset,达到尺度变换的效果;对于(d)加上offset,达到旋转变换的效果。
某一点P0经过标准卷积后结果为
而经过可变形卷积后的结果为:
这里Pm = P0 Pn ∆Pn,∆Pn为卷积核的偏移量offset。可变形卷积更能适应目标的各种形变。 代表模型: Deform U-Net
Reference: https://www.leiphone.com/news/201902/biIqSBpehsaXFwpN.html?viewType=weixin https://mp.weixin.qq.com/s/ZicrOwumqAEWwpaC3HvnuA https://blog.csdn.net/isMarvellous/article/details/80087705 https://github.com/Minerva-jiezhao/D-MEM