- 卷积只能在同一组进行吗?-- Group convolution
- 卷积核一定越大越好?-- 3×3卷积核
- 每层卷积只能用一种尺寸的卷积核?-- Inception结构
- 怎样才能减少卷积层参数量?-- Bottleneck
- 越深的网络就越难训练吗?-- Resnet残差网络
- 卷积操作时必须同时考虑通道和区域吗?-- DepthWise操作(Xception)
- 分组卷积能否对通道进行随机分组?-- ShuffleNet
- 通道间的特征都是平等的吗? -- SEnet
- 能否让固定大小的卷积核看到更大范围的区域?-- Dilated convolution
- 卷积核形状一定是矩形吗?-- Deformable convolution 可变形卷积核
1.空洞卷积(dilated conv)
空洞卷积也可以叫扩张卷积。在图像分割领域,图像输入到CNN(典型的网络比如FCN)中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作,deconv可参见知乎答案如何理解深度学习中的deconvolution networks:https://www.zhihu.com/question/43609045/answer/132235276),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。
(a)图对应3x3的1-dilated conv,和普通的卷积操作一样
(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv)
(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。
重新思考卷积: Rethinking Convolution
在赢得其中一届ImageNet比赛里VGG网络的文章中,他最大的贡献并不是VGG网络本身,而是他对于卷积叠加的一个巧妙观察。
This (stack of three 3 × 3 conv layers) can be seen as imposing a regularisation on the 7 × 7 conv. filters, forcing them to have a decomposition through the 3 × 3 filters (with non-linearity injected in between).
这里意思是 7 x 7 的卷积层的正则等效于 3 个 3 x 3 的卷积层的叠加。而这样的设计不仅可以大幅度的减少参数,其本身带有正则性质的 convolution map 能够更容易学一个 generlisable, expressive feature space。这也是现在绝大部分基于卷积的深层网络都在用小卷积核的原因。
然而 Deep CNN 对于其他任务还有一些致命性的缺陷。较为著名的是 up-sampling 和 pooling layer 的设计。这个在 Hinton 的演讲里也一直提到过。
主要问题有:
- Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable)
- 内部数据结构丢失;空间层级化信息丢失。
- 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。对于 dilated convolution, 我们已经可以发现他的优点,即内部数据结构的保留和避免使用 down-sampling 这样的特性。但是完全基于 dilated convolution 的结构如何设计则是一个新的问题。
空洞卷积gridding问题
是的,空洞卷积是存在理论问题的,论文中称为gridding,其实就是网格效应/棋盘问题。因为空洞卷积得到的某一层的结果中,邻近的像素是从相互独立的子集中卷积得到的,相互之间缺少依赖。
局部信息丢失:由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。
远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。
解决方案
-
(通向标准化设计:Hybrid Dilated Convolution (HDC))Panqu Wang,Pengfei Chen, et al.Understanding Convolution for Semantic Segmentation.//WACV 2018
通过图a解释了空洞卷积存在的问题,从左到右属于top-bottom关系,三层卷积均为r=2的dilatedConv,可以看出最上层的红色像素的感受野为13且参与实际计算的只有75%,很容易看出其存在的问题。
使用HDC的方案解决该问题,不同于采用相同的空洞率的deeplab方案,该方案将一定数量的layer形成一个组,然后每个组使用连续增加的空洞率,其他组重复。如deeplab使用rate=2,而HDC采用r=1,r=2,r=3三个空洞率组合,这两种方案感受野都是13。但HDC方案可以从更广阔的像素范围获取信息,避免了grid问题。同时该方案也可以通过修改rate任意调整感受野。
- Fisher Yu, et al. Dilated Residual Networks. //CVPR 2017
- Removing max pooling:由于maxpool会引入更高频的激活,这样的激活会随着卷积层往后传播,使得grid问题更明显。
- Adding layers:在网络最后增加更小空洞率的残参block, 有点类似于HDC。
- Removing residual connections:去掉残参连接,防止之前层的高频信号往后传播。
更多请参考空洞卷积 ~
2.Deformable Convolutional Networks-v1-v2(可变形卷积网络)
《Deformable Convolutional Networks》是一篇2017年Microsoft Research Asia的研究。基本思想也是卷积核的采样方式是可以通过学习得到的。作者提出了两种新的op:deformable convolution和deformable roi pooling,主要是通过给传统卷积采样点加offsets的方式来获得新的采样点。
论文引入了两种新的模块来提高卷积神经网络 (CNN) 对变换的建模能力:可变形卷积 (deformable convolution) 和可变形兴趣区域池化 (deformable ROI pooling)
可变形卷积 Deformable Convolution
先看传统卷积的一个定义:
R代表一个receptive field的grid: R={(−1,−1),(−1,0),...,(0,1),(1,1)},以3*3为例。 对于输出中每一个像素position P0,一般的卷积就是
而可变形卷积做的是:
图中,把原来的卷积过程分成两路,上面一路学习offset Δpn,得到H*W*2N的输出(offset),N=|R|表示grid中像素个数,2N的意思是有x,y两个方向的offset。有了这个offset以后,对于原始卷积的每一个卷积窗口,都不再是原来规整的sliding window(图1中的绿框),而是经过平移后的window(蓝框),取到数据后计算过程和卷积一致。Δpn不是整数像素,而是一个高精度的小数,不能直接获取像素坐标,而如果采用简单粗暴的取整又会有一定误差,因此就采用了和STN中一样的做法——双线性插值,插出每个点的像素值。
可变形兴趣区域池化 Deformable RoI Pooling
区别在于用的是FC,原因是ROI pooling之后的结果是固定大小的k*k,直接用FC得到k *k个offset。但是这些offset不能直接用,因为ROI区域大小不一,并且input feature map的w和h也是大小不一。作者提出的方法是用一个scale r:
下面是roi pooling原来的公式(用的是average?这个比较奇怪,一般都是用max的,当然按照这个逻辑,max pooling也很容易推出)
有了offset之后就可以这样做:
和前面一样,因为offset是带小数的,不能直接得到像素,需要用双线性插值算法得到每一个像素值。注意,这里的offset只有k*k个,而不是每一个像素一个。
【改进】:专栏 | MSRA视觉计算组提出第二代可变形卷积网络,增强形变,更好效果
3. Octave conv
近期,来自 Facebook AI、新加坡国立大学、奇虎 360 的研究人员联合提出了一种新的卷积操作 (OctConv),用于替代现有的通用卷积。这款新卷积不仅占用更少的内存和计算,还有助于提高性能。卷积神经网络(CNN)在很多计算机视觉任务中都取得了卓越的成就,然而高准确率的背后,却是很高的冗余度和不可忽视的计算开销。
对于一个卷积操作而言(图 ),每个位置都是由一个 D 维特征向量 表示,而特征提取,则是通过滑动卷积,对每个位置分别处理得到对应的特征。
但是,这种为每个位置都分别存储一份特征表达,并分别一一处理的策略明显是不合理的。因为,对于图像而言,相邻位置往往描述的是同一个语义,从而共享一部分特征。
与此同时,CNN 所学习到的卷积核,也并非全是高频卷积核,如图 2 所示。这意味着,一部分卷积专注于提取「低频特征」,而另一部分则专注于提取「高频特征」。对于低频卷积所对应的特征图而言,我们也许只需要保留它的低频信号即可,没必要存储在高分辨率下的特征图。
如图 3 所示,本文提出将特征图分为两组:低频特征(蓝色)和 高频特征(橙红),并将空间上变化较为缓慢的「低频特征图」存储在低分辨率的张量中,共享相邻位置间的特征。而本文所提出的 OctConv 则是一种可以直接作用在该特征表达下的卷积操作。它包含每个频率自身状态的更新(绿色箭头),以及频率间的信息交互(红色箭头)。
Octave Convolution(OctConv)的命名应该是受到了 SIFT 特征的启发。而 Octave 是八个音阶的意思,音乐里降 8 个音阶代表频率减半。本文通过一个 Octave 将 高频 和 低频 特征隔离到不同的组中,并将低频的分辨率减半。
研究人员指出 OctConv 可以直接用于替代现有卷积,并且即插即用,无需调参,也不影响 CNN 的网络结构以及模型大小。由于 OctConv 专注于降低 CNN 空间维度上的冗余,因此它与现有专注于网络拓补结构设计,以及减少网络特征容易的方法是正交和互补的。
【详细参考】:即插即用新卷积:提升CNN性能、速度翻倍
参考链接:
https://www.zhihu.com/question/54149221/answer/192025860
https://www.zhihu.com/question/54149221/answer/323880412
通过简单代码来回顾卷积块的历史
如何理解空洞卷积(dilated convolution)?
https://www.cnblogs.com/ranjiewen/p/10040410.html