CNN卷积类型有哪些?

CNN卷积类型有哪些?

1. 卷积类型

1.1 普通卷积:2D-Convolution

原始的conv操作可以看做一个2D版本的无隐层神经网络。

代表模型:

LeNet:最早使用stack单卷积+单池化结构的方式,卷积层来做特征提取,池化来做空间下采样

AlexNet:后来发现单卷积提取到的特征不是很丰富,于是开始stack多卷积+单池化的结构

VGG([1409.1556] Very Deep Convolutional Networks for Large-Scale Image Recognition):结构没怎么变,只是更深了

1.2 多尺寸卷积

每层卷积只能用一种尺寸的卷积核?-- Inception结构

融合了Network In Network的增加隐层提升非线性表达的思想,于是有了这种先用1*1的卷积映射到隐空间,再在隐空间做卷积的结构。同时考虑了多尺度,在单层卷积层中用多个不同大小的卷积核来卷积,再把结果concat起来。

这一结构,被称之为“Inception”。

代表模型:

Inception-v1([1409.4842] Going Deeper with Convolutions):stack以上这种Inception结构

Inception-v2(Accelerating Deep Network Training by Reducing Internal Covariate Shift):加了BatchNormalization正则,去除55卷积,用两个33代替

Inception-v3([1512.00567] Rethinking the Inception Architecture for Computer Vision):77卷积又拆成71+1*7

Inception-v4([1602.07261] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning):加入了残差结构

1.3 深度可分离卷积(Depthwise Separable Convolution)

Depthwise Separable Convolution,可以说是Inception的延续。顾名思义,将depthwise convolution和pointwise convolution两个过程合起来。这个pointwise convolution就是1*1的卷积,可以看做是对那么多分离的通道做了个融合。

从Inception结构来看深度可分离卷积。

Inception结构(简化版本):

上面的简化版本,我们又可以看做,把一整个输入做\(1*1\)卷积,然后切成三段,分别\(3*3\)卷积后相连,如下图,这两个形式是等价的,即Inception的简化版本又可以用如下形式表达:

如果不是分成三段,而是分成5段或者更多,那模型的表达能力是不是更强呢?于是我们就切更多段,切到不能再切了,正好是Output channels的数量(极限版本):

于是,就有了深度卷积(depthwise convolution),深度卷积是对输入的每一个channel独立的用对应channel的所有卷积核去卷积,假设卷积核的shape是[filter_height, filter_width, in_channels, channel_multiplier],那么每个in_channel会输出channel_multiplier那么多个通道,最后的feature map就会有in_channels * channel_multiplier个通道了。反观普通的卷积,输出的feature map一般就只有channel_multiplier那么多个通道。

参考资料:

【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积? - CSDN博客

【Tensorflow】tf.nn.separable_conv2d如何实现深度可分卷积? - CSDN博客

代表模型:Xception(Xception: Deep Learning with Depthwise Separable Convolutions

1.4 空洞卷积(Dilated Convolution)

在图像分割领域,图像输入到CNN(典型的网络比如FCN)中,图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?

Dilation卷积,空洞卷积,是解决pixel-wise输出模型的一种常用的卷积方式。一种普遍的认识是,pooling下采样操作导致的信息丢失是不可逆的,通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑pooling会导致损失图像细节信息的问题,但是做像素级的预测时(譬如语义分割),就要考虑到这个问题了。所以就要有一种卷积代替pooling的作用(成倍的增加感受野),而空洞卷积就是为了做这个的。通过卷积核插“0”的方式,它可以比普通的卷积获得更大的感受野,这个idea的motivation就介绍到这里。

参考资料:

如何理解空洞卷积(dilated convolution)?

膨胀卷积--Multi-scale context aggregation by dilated convolutions

【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积? - CSDN博客

标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。dilated conv原论文中的结构如图所示:

上图b可以理解为卷积核大小依然是3×3,但是每个卷积点之间有1个空洞,也就是在绿色7×7区域里面,只有9个红色点位置作了卷积处理,其余点权重为0。这样即使卷积核大小不变,但它看到的区域变得更大了。

dilated convolution的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息,在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用dilated conv。

代表模型:

FCN([1411.4038] Fully Convolutional Networks for Semantic Segmentation):Fully convolutional networks,顾名思义,整个网络就只有卷积组成,在语义分割的任务中,因为卷积输出的feature map是有spatial信息的,所以最后的全连接层全部替换成了卷积层。

Wavenet(WaveNet: A Generative Model for Raw Audio):用于语音合成。

1.5 特征重标定卷积(Squeeze-and-Excitation)

这是ImageNet 2017 竞赛 Image Classification 任务的冠军模型SENet的核心模块,原文叫做”Squeeze-and-Excitation“,暂且把这个卷积称作”特征重标定卷积“。

和前面不同的是,这个卷积是对特征维度作改进的。一个卷积层中往往有数以千计的卷积核,而且我们知道卷积核对应了特征,于是乎那么多特征要怎么区分?这个方法就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照计算出来的重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

首先做普通的卷积,得到了一个的output feature map,它的shape为[C,H,W],根据paper的观点,这个feature map的特征很混乱。然后为了获得重要性的评价指标,直接对这个feature map做一个Global Average Pooling,然后我们就得到了长度为C的向量。(这里还涉及到一个额外的东西,如果你了解卷积,你就会发现一旦某一特征经常被激活,那么Global Average Pooling计算出来的值会比较大,说明它对结果的影响也比较大,反之越小的值,对结果的影响就越小)

然后我们对这个向量加两个FC层,做非线性映射,这俩FC层的参数,也就是网络需要额外学习的参数。

最后输出的向量,我们可以看做特征的重要性程度,然后与feature map对应channel相乘就得到特征有序的feature map了。

另外它还可以和几个主流网络结构结合起来一起用,比如Inception和Res:

代表模型:Squeeze-and-Excitation Networks(Squeeze-and-Excitation Networks

1.6 可变形卷积(Deformable Convolution)

卷积核形状一定是矩形吗?-- Deformable convolution

传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。

要做到这个操作,可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。

详细MSRA的解读可以看这个链接:可变形卷积网络:计算机新“视”界。

上图中包含两处卷积,第一处是获取offsets的卷积,即我们对input feature map做卷积,得到一个输出(offset field),然后再在这个输出上取对应位置的一组值作为offsets。假设input feature map的shape为[batch,height,width,channels],我们指定输出通道变成两倍,卷积得到的offset field就是[batch,height,width,2×channels],为什么指定通道变成两倍呢?因为我们需要在这个offset field里面取一组卷积核的offsets,而一个offset肯定不能一个值就表示的,最少也要用两个值(x方向上的偏移和y方向上的偏移)所以,如果我们的卷积核是33,那意味着我们需要33个offsets,一共需要233个值,取完了这些值,就可以顺利使卷积核形变了。第二处就是使用变形的卷积核来卷积,这个比较常规。(这里还有一个用双线性插值的方法获取某一卷积形变后位置的输入的过程)

这里有一个介绍性的Slide:http://prlab.tudelft.nl/sites/default/files/Deformable_CNN.pdf

代表模型:Deformable Convolutional Networks(Deformable Convolutional Networks):暂时还没有其他模型使用这种卷积,期待后续会有更多的工作把这个idea和其他视觉任务比如检测,跟踪相结合。

1.7 卷积比较

卷积类型 输出大小 参数数量 层数 切入点 代表模型
普通卷积 1 LeNet, AleNet, VGG
多尺寸卷积 变大 增加很多 >=2 多尺度(空间维度) Inception V1, Inception V2, Inception V3, Inception V4
空洞卷积(Dialated Conv) 与普通卷积保持一致 与普通卷积保持一致 1 感受野(空间维度) FCN, Wavenet
深度可分离卷积(Depthwise Separate Conv) 变大 略微增加 >=2 空间维度/特征维度 Xception
可变形卷积(Deformable Conv) 增加 >=2 空间维度 Deformable Convolutional Networks
特征重标定卷积 增加 >=2 特征维度 SENet

参考资料:

https://www.cnblogs.com/shixiangwan/p/7536369.html

https://zhuanlan.zhihu.com/p/29367273

2. CNN总结

  1. CNN模型的发展趋势:从巨型网络到轻量化网络。现在工业界追求的重点已经不是准确率的提升(因为都已经很高了),都聚焦于速度与准确率的trade off,都希望模型又快又准。因此从原来AlexNet、VGGnet,到体积小一点的Inception、Resnet系列,到目前能移植到移动端的MobileNet、ShuffleNet(体积能降低到0.5mb!)。

  2. 卷积核:

    1. 大卷积核用多个小卷积核代替;
    2. 单一尺寸卷积核用多尺寸卷积核代替;
    3. 固定形状卷积核趋于使用可变形卷积核;
    4. 使用1×1卷积核(bottleneck结构)。
  3. 卷积层连接:

    1. 使用skip connection,让模型更深;
    2. densely connection,使每一层都融合上其它层的特征输出(DenseNet)
  4. 卷积层通道:

    1. 标准卷积用depthwise卷积代替;
    2. 使用分组卷积;
    3. 分组卷积前使用channel shuffle;
    4. 通道加权计算。
  5. 启发

    类比到通道加权操作,卷积层跨层连接能否也进行加权处理?bottleneck + Group conv + channel shuffle + depthwise的结合会不会成为以后降低参数量的标准配置?

posted @ 2021-04-22 19:15  MissHsu  阅读(1826)  评论(0编辑  收藏  举报