?
彩天堂平台,盛兴北京赛车直播,七星彩到底有没有规律,重庆时时彩预测qq群 凤凰彩票
当前位置: 彩天堂平台 > 幻梦之晓2.2 >

CNN 中千奇百怪的卷积方式大汇总

时间:2017-09-26 12:00来源:未知 作者:admin 点击:
原标题:CNN 中千奇百怪的卷积方式大汇总 雷锋网按:本文原作者Xf Mao,本文原载于知乎。雷锋网 对于表述有误的地方欢迎更正!另外目前仅列举了一些比较著名且实用的卷积操作,对

  原标题:CNN 中千奇百怪的卷积方式大汇总 雷锋网按:本文原作者Xf Mao,本文原载于知乎。雷锋网

  对于表述有误的地方欢迎更正!另外目前仅列举了一些比较著名且实用的卷积操作,对于没提到的,希望大家指出与补充

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

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

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

  Dilation 卷积,通常译作空洞卷积或者卷积核膨胀操作,它是解决 pixel-wise 输出模型的一种常用的卷积方式。一种普遍的认识是,pooling 下采样操作导致的信息丢失是不可逆的,通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑 pooling 会导致损失图像细节信息的问题,但是做像素级的预测时(譬如语义分割),就要考虑到这个问题了。

  所以就要有一种卷积代替 pooling 的作用(成倍的增加感受野),而空洞卷积就是为了做这个的。通过卷积核插 “0” 的方式,它可以比普通的卷积获得更大的感受野,这个 idea 的 motivation 就介绍到这里。具体实现方法和原理可以参考如下链接:

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

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

  可形变卷积的思想很巧妙:它认为规则形状的卷积核(比如一般用的正方形 3*3 卷积)可能会限制特征的提取,如果赋予卷积核形变的特性,让网络根据 label 反传下来的误差自动的调整卷积核的形状,适应网络重点关注的感兴趣的区域,就可以提取更好的特征。

  如下图:网络会根据原位置(a),学习一个 offset 偏移量,得到新的卷积核(b)(c)(d),那么一些特殊情况就会成为这个更泛化的模型的特例,例如图(c)表示从不同尺度物体的识别,图(d)表示旋转物体的识别。

  上图中包含两处卷积,第一处是获取 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 方向上的偏移)所以,如果我们的卷积核是 3*3,那意味着我们需要 3*3 个 offsets,一共需要 2*3*3 个值,取完了这些值,就可以顺利使卷积核形变了。第二处就是使用变形的卷积核来卷积,这个比较常规。(这里还有一个用双线性插值的方法获取某一卷积形变后位置的输入的过程)

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

  首先做普通的卷积,得到了一个的 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 了。

  虽然各大框架现在都还没有扩展这个卷积的 api,但是我们实现它也就几行代码的事,可谓是简单且实用了。

(责任编辑:admin)
顶一?
(0)
0%
踩一?
(0)
0%
------分隔?----------------------------
?