文章目录

  • CNN
    • 1. CNN基本结构
    • 2. 卷积和通道
      • 2.1 分组卷积(Group Convolution)
      • 2.2 Convolution VS Group Convolution
      • 2.3 Group Convolution的用途
      • 2.4 Depthwise Convolution && Pointwise Convolution && Depthwise Separable Convolution
      • 2.5 Group Convolution 和 Depthwise + Pointwise区别
    • 3. 卷积类型
      • 3.1 普通卷积:2D-Convolution
      • 3.2 多尺寸卷积
      • 3.3 深度可分离卷积(Depthwise Separable Convolution)
      • 3.4 空洞卷积(Dilated Convolution)
      • 3.5 特征重标定卷积(Squeeze-and-Excitation)
      • 3.6 可变形卷积(Deformable Convolution)
      • 3.7 卷积比较

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 GC​∗K∗K,卷积核的总数仍为N个,每组的卷积核数量为 N G \frac{N}{G} GN​,卷积核只与其同组的输入map进行卷积,卷积核的总参数量为 N ∗ C G ∗ K ∗ K N*\frac{C}{G}∗K∗K N∗GC​∗K∗K,可见,总参数量减少为原来的 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 GC​∗K∗K,可以将其余 ( C − C G ) ∗ K ∗ K (C-\frac{C}{G})∗K∗K (C−GC​)∗K∗K的参数视为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。

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

  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 1∗1卷积,然后切成三段,分别 3 ∗ 3 3*3 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)

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 卷积比较

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

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

常用的卷积神经网络-1-卷积和通道相关推荐

  1. 【数据挖掘】卷积神经网络 ( 视觉原理 | CNN 模仿视觉 | 卷积神经网络简介 | 卷积神经网络组成 | 整体工作流程 | 卷积计算图示 | 卷积计算简介 | 卷积计算示例 | 卷积计算参数 )

    文章目录 I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VI ...

  2. 深入学习卷积神经网络中卷积层和池化层的意义(转)

    为什么要使用卷积呢? 在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量:需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用 ...

  3. 【卷积神经网络】卷积神经网络(Convolutional Neural Networks, CNN)基础

    卷积神经网络(Convolutional Neural Networks, CNN),是一种 针对图像 的特殊的 神经网络. 卷积神经网络概述 Why not DNN? 图像数据的维数很高,比如 1, ...

  4. 深入学习卷积神经网络中卷积层和池化层的意义

    为什么要使用卷积呢? 在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量:需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用 ...

  5. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

  6. 04.卷积神经网络 W1.卷积神经网络(作业:手动/TensorFlow 实现卷积神经网络)

    文章目录 作业1:实现卷积神经网络 1. 导入一些包 2. 模型框架 3. 卷积神经网络 3.1 Zero-Padding 3.2 单步卷积 3.3 卷积神经网络 - 前向传播 4. 池化层 5. 卷 ...

  7. 卷积神经网络的一般步骤,卷积神经网络采用卷积

    1.卷积神经网络cnn究竟是怎样一步一步工作的 用一个卷积核滑动图片来提取某种特征(比如某个方向的边),然后激活函数用ReLU来压制梯度弥散.对得到的结果用另一个卷积核继续提取+reLU,然后池化(保 ...

  8. 卷积神经网络 图像识别,卷积神经网络图像处理

    街道垃圾识别系统的原理是什么? 不久前上海关于垃圾分类的出台政策大家应该还记得,做好垃圾分类成为了许多人的难题.其实,随着人工智能技术的突飞猛进,自动分类垃圾桶已经出现了. 目前有许多关于人工智能自动 ...

  9. 基于深度卷积神经网络,深度卷积神经网络结构

    1.卷积神经网络算法是什么? 一维构筑.二维构筑.全卷积构筑. 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Fe ...

  10. 什么是卷积神经网络算法,卷积神经网络运算公式

    卷积公式指的是什么? 卷积公式是指两个函数f和g生成第三个函数的一种数学算子.表征函数f与经过翻转和平移的g的重叠部分的累积,如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是滑动平均的推 ...

最新文章

  1. 手机安全卫士——软件管理-用户程序和系统程序
  2. How to Convert Array to ArrayList in Java?
  3. 这项技术是谷歌AI的New Sexy:利于隐私、节能环保,目前最大挑战是布道阐释
  4. 已解决:Connecting to raw.githubusercontent.com |185.199.109.133|:443... Unable to establish SSL connect
  5. 文件寄生——寄生虫自体繁衍的道路
  6. 微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2
  7. 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试
  8. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说
  9. 用S-函数编写Simulink中的正弦模块
  10. 毛概社会实践报告3000字
  11. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...
  12. 由深圳的大树所想到的
  13. 【电子技术实验设计】简易水位控制器设计报告
  14. 用cJSON.h/cJSON.c写JSON
  15. linux 验证码 权限,linux 上验证码无法显示
  16. 剑指Offer对答如流系列 - 把数字翻译成字符串
  17. 开发者如何了解技术前沿? 再也不用看微信公众号的软文了!
  18. Magento 数据表结构 EAV模型详解
  19. 交换机虚拟化和堆叠的区别_企业网络基础EI CCIE设计部署如何理解三层交换和路由器的区别...
  20. 十年架构师留下最完整的Java学习路线

热门文章

  1. 计算机图形学对勾函数,高一数学 : 最全函数图像汇总,不看准后悔!
  2. Open vSwitch ETHERNET相关字段详解(eth_src/dl_src、eth_dst/dl_dst、eth_type/dl_type)
  3. TD源链:让区块链臻于完美
  4. 郑州大学中外合作计算机科学与技术,郑州大学中外合作办学历年分数线
  5. 「大哉数学之为用」优选法——梯级水库灌溉的优化设计
  6. cron表达式解析 + robfig/cron 源码剖析
  7. mac xcode 开发C++
  8. 下拉刷新、上拉获取更多、左右滑动的ListView
  9. Python学习:给类或者类的对象添加打印内容 def __repr__(self)
  10. 延迟加载js有哪些方式