卷积方式 | 特点 | 代表 |
---|---|---|
传统卷积 | LeNet、AlexNet、VGG | |
多隐层非线性 | Inception-v1、v2、v3、v4 | |
空洞卷积 | FCN | |
深度可分离卷积 | Xception | |
可变形卷积 | Deformable Convolutional Networks | |
特征重标定卷积 | SqueezeNet |
1.基本卷积
传统的卷积就是按照上边动图显示的方式进行卷积,将卷积核按照一定的顺序对相应位置的数值进行相乘累加在一起。中间可能牵扯到卷积核的大小、卷积步长等参数。
代表模型:
模型 | 特点 |
---|---|
LeNet | 最早使用stack单卷积+单池化结构的方式,卷积层来做特征提取,池化来做空间下采样 |
AlexNet | 后来发现单卷积提取到的特征不是很丰富,于是开始stack多卷积+单池化的结构 |
VGG | 结构没怎么变,只是更深了 |
2.多隐层非线性
多隐层非线性卷积最杰出的代表就是Inception。首先使用1*1的卷积映射到隐空间,再在隐空间做卷积的结构。最后使用多个不同大小的卷积核进行卷积到相同的维度,最后进行连接起来。
代表模型:
模型 | 特点 |
---|---|
Inception-v1 | stack以上这种Inception结构 |
Inception-v2 | 加了BatchNormalization正则,去除55卷积,用两个33代替 |
Inception-v3 | 77卷积又拆成71+1*7 |
Inception-v4 | 加入了残差结构 |
3.空洞卷积
Dilation卷积,通常译作空洞卷积或者卷积核膨胀操作,它是解决pixel-wise输出模型的一种常用的卷积方式。
一种普遍的认识是,pooling下采样操作导致的信息丢失是不可逆的,通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑pooling会导致损失图像细节信息的问题,Dilated Convolution起源于语义分割,大部分文章也用于语义分割,具体能否对其他应用有价值姑且还不知道,但确实是一个不错的探究方向。在WaveNet, ByteNet 也用到了 dilated convolution 确实是一个很有趣的发现,因为本身 sequence-to-sequence learning 也是一个需要关注多尺度关系的问题。则在 sequence-to-sequence learning 如何实现,如何设计,跟分割或其他应用的关联是我们可以重新需要考虑的问题。
所以就要有一种卷积代替pooling的作用(成倍的增加感受野),而空洞卷积就是为了做这个的。通过卷积核插“0”的方式,它可以比普通的卷积获得更大的感受野,这个idea的motivation就介绍到这里。
代表模型:
模型 | 特点 |
---|---|
FCN | 整个网络就只有卷积组成,在语义分割的任务中,因为卷积输出的feature map是有spatial信息的,所以最后的全连接层全部替换成了卷积层 |
Wavenet | 语音合成 |
4.深度可分离卷积
Depthwise Separable Convolution,目前已被CVPR2017收录,这个工作可以说是Inception的延续,它是Inception结构的极限版本。
为了更好的解释,让我们重新回顾一下Inception结构(简化版本):
上面的简化版本,我们又可以看做,把一整个输入做11卷积,然后切成三段,分别33卷积后相连,如下图,这两个形式是等价的,即Inception的简化版本又可以用如下形式表达:
OK,现在我们想,如果不是分成三段,而是分成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那么多个通道。
既然叫深度可分离卷积,光做depthwise convolution肯定是不够的,原文在深度卷积后面又加了pointwise convolution,这个pointwise convolution就是1*1的卷积,可以看做是对那么多分离的通道做了个融合。
这两个过程合起来,就称为Depthwise Separable Convolution了:
【Tensorflow】tf.nn.separable_conv2d如何实现深度可分卷积? - CSDN博客
代表模型:
Xception(Xception: Deep Learning with Depthwise Separable Convolutions)
5.可变形卷积
可形变卷积的思想很巧妙:它认为规则形状的卷积核(比如一般用的正方形3*3卷积)可能会限制特征的提取,如果赋予卷积核形变的特性,让网络根据label反传下来的误差自动的调整卷积核的形状,适应网络重点关注的感兴趣的区域,就可以提取更好的特征。
如下图:网络会根据原位置(a),学习一个offset偏移量,得到新的卷积核(b)(c)(d),那么一些特殊情况就会成为这个更泛化的模型的特例,例如图(c)表示从不同尺度物体的识别,图(d)表示旋转物体的识别。
这个idea的实现方法也很常规:
上图中包含两处卷积,第一处是获取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和其他视觉任务比如检测,跟踪相结合。
6.特征重标定卷积
这是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了。
虽然各大框架现在都还没有扩展这个卷积的api,但是我们实现它也就几行代码的事,可谓是简单且实用了。
另外它还可以和几个主流网络结构结合起来一起用,比如Inception和Res:
代表模型:Squeeze-and-Excitation Networks(Squeeze-and-Excitation Networks)