常用的卷积神经网络-1-卷积和通道

CNN

1. CNN基本结构

  • 全连接, 局部连接在这里插入图片描述

  • 权值共享在这里插入图片描述

2. 卷积和通道

参考资料:

https://www.cnblogs.com/shine-lee/p/10243114.html

https://blog.yani.ai/filter-group-tutorial/

https://blog.csdn.net/zhangjunhit/article/details/90762578

2.1 分组卷积(Group Convolution)

Group Convolution分组卷积,最早见于AlexNet——2012年Imagenet的冠军方法,Group Convolution被用来切分网络,使其在2个GPU上并行运行,AlexNet网络结构如下:

在这里插入图片描述

动机:用分组卷积的操作,来缓解对单个处理器的压力。例如,当前一些轻量级的SOTA(State Of The Art)网络。

2.2 Convolution VS Group Convolution

如果输入feature map尺寸为CHW,卷积核有N个,输出feature map与卷积核的数量相同也是N,每个卷积核的尺寸为CKKN个卷积核的总参数量为NCKK,输入map与输出map的连接方式如下图左所示:

在这里插入图片描述

对输入feature map进行分组,然后每组分别卷积。假设输入feature map的尺寸仍为CHW,输出feature map的数量为N个,如果设定要分成G个groups,则每组的输入feature map数量为 C G \frac{C}{G} GC,每组的输出feature map数量为 N G \frac{N}{G} GN,每个卷积核的尺寸为 C G ∗ K ∗ K \frac{C}{G}∗K∗K GCKK,卷积核的总数仍为N个,每组的卷积核数量为 N G \frac{N}{G} GN,卷积核只与其同组的输入map进行卷积,卷积核的总参数量为 N ∗ C G ∗ K ∗ K N*\frac{C}{G}∗K∗K NGCKK,可见,总参数量减少为原来的 1 G \frac{1}{G} G1,其连接方式如上图右所示,group1输出map数为2,有2个卷积核,每个卷积核的channel数为4,与group1的输入map的channel数相同,卷积核只与同组的输入map卷积,而不与其他组的输入map卷积。

2.3 Group Convolution的用途

  1. 减少参数量,分成G组,则该层的参数量减少为原来的 1 G \frac{1}{G} G1

  2. Group Convolution可以看成是structured sparse,每个卷积核的尺寸由CKK变为 C G ∗ K ∗ K \frac{C}{G}∗K∗K GCKK,可以将其余 ( C − C G ) ∗ K ∗ K (C-\frac{C}{G})∗K∗K (CGC)KK的参数视为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。

  3. 当分组数量等于输入map数量,输出map数量也等于输入map数量,即G=N=CN个卷积核每个尺寸为1∗KK时,Group Convolution就成了Depthwise Convolution,参见MobileNetXception等,参数量进一步缩减,如下图所示:

在这里插入图片描述

  1. 更进一步,如果分组数G=N=C,同时卷积核的尺寸与输入map的尺寸相同,即K=H=W,则输出map为C∗1∗1即长度为C的向量,此时称之为Global Depthwise Convolution(GDC),见MobileFaceNet,可以看成是全局加权池化,与 Global Average Pooling(GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同),而GAP每个位置的权重相同,全局取个平均,如下图所示:

在这里插入图片描述

global average pooling(全局平均池化,GAP):当G=C=N且K=H=W.

NIN(Network In Network)论文中提出的全局平均池化,主要是为了区别全连接层。CNN分类的全连接层的作用:将最后一层卷积得到的feature map stretch成向量,对这个向量做乘法,最终降低其维度,然后输入到softmax层中得到对应的每个类别的得分。

全连接存在的问题:参数量过大,降低了训练的速度,且很容易过拟合。全连接层将卷积层展开成向量之后不还是要针对每个feature map进行分类,而GAP的思路就是将上述两个过程合二为一,一起做了。如图所示:

在这里插入图片描述

在这里插入图片描述

论文:Network In Network

论文下载:https://arxiv.org/abs/1312.4400

论文解读:https://www.cnblogs.com/makefile/p/nin.html

2.4 Depthwise Convolution && Pointwise Convolution && Depthwise Separable Convolution

  • 普通卷积:假设输入层为一个大小为64×64像素、三通道彩色图片。经过一个包含4个Filter的卷积层,最终输出4个Feature Map,且尺寸与输入层相同。整个过程可以用下图来概括。

在这里插入图片描述

此时,卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。因此卷积层的参数数量可以用如下公式来计算:N_std = 4 × 3 × 3 × 3 = 108

  • Depthwise Convolution:同样是上述例子,一个大小为64×64像素、三通道彩色图片首先经过第一次卷积运算,不同之处在于此次的卷积完全是在二维平面内进行,且Filter的数量与上一层的Depth相同。所以一个三通道的图像经过运算后生成了3个Feature map,如下图所示。

在这里插入图片描述

其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下:

N_depthwise = 3 × 3 × 3 = 27

Depthwise Convolution完成后的Feature map数量与输入层的depth相同,但是这种运算对输入层的每个channel独立进行卷积运算后就结束了,没有有效的利用不同map在相同空间位置上的信息。因此需要增加另外一步操作来将这些map进行组合生成新的Feature map,即接下来的Pointwise Convolution。

  • Pointwise Convolution:Pointwise Convolution的运算与常规卷积运算非常相似,不同之处在于卷积核的尺寸为 1×1×M,M为上一层的depth。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个Filter就有几个Feature map。如下图所示。

在这里插入图片描述

由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为:

N_pointwise = 1 × 1 × 3 × 4 = 12

经过Pointwise Convolution之后,同样输出了4张Feature map,与常规卷积的输出维度相同。

  • Depthwise Separable Convolution:核心思想是将一个完整的卷积运算分解为两步进行,分别为Depthwise Convolution与Pointwise Convolution。参数个数可以计算为:

    N_separable = N_depthwise + N_pointwise = 39

    相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。

2.5 Group Convolution 和 Depthwise + Pointwise区别

Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把两者应用起来了。因此Group conv和Depthwise +Pointwise并不能划等号。

Depthwise +Pointwise卷积是提供一种把feature map的空间信息(height&width)和通道信息(channel)拆分分别处理的方法,而group卷积只是单纯的通道分组处理,降低复杂度。

3. 卷积类型

3.1 普通卷积:2D-Convolution

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

在这里插入图片描述

代表模型:

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

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

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

在这里插入图片描述

在这里插入图片描述

3.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):加入了残差结构

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

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

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

Inception结构(简化版本):

在这里插入图片描述

上面的简化版本,我们又可以看做,把一整个输入做 1 ∗ 1 1*1 11卷积,然后切成三段,分别 3 ∗ 3 3*3 33卷积后相连,如下图,这两个形式是等价的,即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

3.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):用于语音合成。

3.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

3.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和其他视觉任务比如检测,跟踪相结合。

3.7 卷积比较

卷积类型输出大小参数数量层数切入点代表模型
普通卷积1LeNet, 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

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值