CNN从2012年的AlexNet发展至今,科学家们发明出各类各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量。我下面会对近几年一些具备变革性的工做进行简单盘点,从这些充满革新性的工做中探讨往后的CNN变革方向。git
注:水平所限,下面的看法或许有误差,望大牛指正。另外只介绍其中具备表明性的模型,一些著名的模型因为原理相同将不做介绍,如有遗漏也欢迎指出。github
Group convolution 分组卷积,最先在AlexNet中出现,因为当时的硬件资源有限,训练AlexNet时卷积操做不能所有放在同一个GPU处理,所以做者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。网络
alexnet架构
分组卷积的思想影响比较深远,当前一些轻量级的SOTA(State Of The Art)网络,都用到了分组卷积的操做,以节省计算量。但题主有个疑问是,若是分组卷积是分在不一样GPU上的话,每一个GPU的计算量就下降到 1/groups,但若是依然在同一个GPU上计算,最终总体的计算量是否不变?找了pytorch上有关组卷积操做的介绍,望读者解答个人疑问。app
pytroch githubide
EDIT:性能
关于这个问题,知乎用户朋友 学习
提出了他的看法:我感受group conv自己应该就大大减小了参数,好比当input channel为256,output channel也为256,kernel size为3*3,不作group conv参数为256*3*3*256,若group为8,每一个group的input channel和output channel均为32,参数为8*32*3*3*32,是原来的八分之一。这是个人理解。
个人理解是分组卷积最后每一组输出的feature maps应该是以concatenate的方式组合,而不是element-wise add,因此每组输出的channel是 input channels / #groups,这样参数量就大大减小了。idea
AlexNet中用到了一些很是大的卷积核,好比11×十一、5×5卷积核,以前人们的观念是,卷积核越大,receptive field(感觉野)越大,看到的图片信息越多,所以得到的特征越好。虽然说如此,可是大的卷积核会致使计算量的暴增,不利于模型深度的增长,计算性能也会下降。因而在VGG(最先使用)、Inception网络中,利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,同时参数量(3×3×2+1 VS 5×5×1+1)被下降,所以后来3×3卷积核被普遍应用在各类模型中。spa
传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map能够分别使用多个不一样尺寸的卷积核,以得到不一样尺度的特征,再把这些特征结合起来,获得的特征每每比使用单一卷积核的要好,谷歌的GoogleNet,或者说Inception系列的网络,就使用了多个卷积核的结构:
最第一版本的Inception结构
如上图所示,一个输入的feature map分别同时通过1×一、3×三、5×5的卷积核的处理,得出的特征再组合起来,得到更佳的特征。但这个结构会存在一个严重的问题:参数量比单个卷积核要多不少,如此庞大的计算量会使得模型效率低下。这就引出了一个新的结构:
发明GoogleNet的团队发现,若是仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如图所示:
加入1×1卷积核的Inception结构
根据上图,咱们来作个对比计算,假设输入feature map的维度为256维,要求输出维度也是256维。有如下两种操做:
1×1卷积核也被认为是影响深远的操做,日后大型的网络为了下降参数量都会应用上1×1卷积核。
ResNet skip connection
传统的卷积层层叠网络会遇到一个问题,当层数加深时,网络的表现愈来愈差,很大程度上的缘由是由于当层数加深时,梯度消散得愈来愈严重,以致于反向传播很难训练到浅层的网络。为了解决这个问题,何凯明大神想出了一个“残差网络”,使得梯度更容易地流动到浅层的网络当中去,并且这种“skip connection”能带来更多的好处,这里能够参考一个PPT:极深网络(ResNet/DenseNet): Skip Connection为什么有效及其它 ,以及个人一篇文章:为何ResNet和DenseNet能够这么深?一文详解残差块为什么能解决梯度弥散问题。 ,你们能够结合下面的评论进行思考。
标准的卷积过程能够看上图,一个2×2的卷积核在卷积时,对应图像区域中的全部通道均被同时考虑,问题在于,为何必定要同时考虑图像区域和通道?咱们为何不能把通道和空间区域分开考虑?
Xception网络就是基于以上的问题发明而来。咱们首先对每个通道进行各自的卷积操做,有多少个通道就有多少个过滤器。获得新的通道feature maps以后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操做。这种操做被称为 “DepthWise convolution” ,缩写“DW”。
这种操做是至关有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,并且也同时减小了大量的参数,咱们来算一算,假设输入通道数为3,要求输出通道数为256,两种作法:
1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912
2.DW操做,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量下降到九分之一!
所以,一个depthwise操做比标准的卷积操做下降很多的参数量,同时论文中指出这个模型获得了更好的分类效果。
EDIT:2017.08.25
本文在发出12小时后,一位知乎用户私信了我,向我介绍了Depthwise和Pointwise的历史工做,而Xception和Mobilenet也引用了他们16年的工做,就是Min Wang et al 的Factorized Convolutional Neural Networks,这篇论文的Depthwise中,每一通道输出的feature map(称为“基层”)能够不止一个,而Xception中的Depthwise separable Convolution, 正是这篇工做中“单一基层”的状况。推荐有兴趣的读者关注下他们的工做,这里有篇介绍博文:【深度学习】卷积层提速Factorized Convolutional Neural Networks。而最先关于separable convolution的介绍,Xception做者提到,应该追溯到Lau- rent Sifre 2014年的工做 Rigid-Motion Scattering For Image Classification 6.2章节。
在AlexNet的Group Convolution当中,特征的通道被平均分到不一样组里面,最后再经过两个全链接层来融合特征,这样一来,就只能在最后时刻才融合不一样组之间的特征,对模型的泛化性是至关不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不一样组当中。进行完一次group conv以后,再一次channel shuffle,而后分到下一层组卷积当中,以此循环。
来自ShuffleNet论文
通过channel shuffle以后,Group conv输出的特征能考虑到更多通道,输出的特征天然表明性就更高。另外,AlexNet的分组卷积,其实是标准卷积操做,而在ShuffleNet里面的分组卷积操做是depthwise卷积,所以结合了通道洗牌和分组depthwise卷积的ShuffleNet,能获得超少许的参数以及超越mobilenet、媲美AlexNet的准确率!
另外值得一提的是,微软亚洲研究院MSRA最近也有相似的工做,他们提出了一个IGC单元(Interleaved Group Convolution),即通用卷积神经网络交错组卷积,形式上相似进行了两次组卷积,Xception 模块能够看做交错组卷积的一个特例,特别推荐看看这篇文章:王井东详解ICCV 2017入选论文:通用卷积神经网络交错组卷积
要注意的是,Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把二者应用起来了。所以Group conv和Depthwise +Pointwise并不能划等号。
不管是在Inception、DenseNet或者ShuffleNet里面,咱们对全部通道产生的特征都是不分权重直接结合的,那为何要认为全部通道的特征对模型的做用就是相等的呢? 这是一个好问题,因而,ImageNet2017 冠军SEnet就出来了。
SEnet 结构
一组特征在上一层被输出,这时候分两条路线,第一条直接经过,第二条首先进行Squeeze操做(Global Average Pooling),把每一个通道2维的特征压缩成一个1维,从而获得一个特征通道向量(每一个数字表明对应通道的特征)。而后进行Excitation操做,把这一列特征通道向量输入两个全链接层和sigmoid,建模出特征通道间的相关性,获得的输出其实就是每一个通道对应的权重,把这些权重经过Scale乘法通道加权到原来的特征上(第一条路),这样就完成了特征通道的权重分配。做者详细解释能够看这篇文章:专栏 | Momenta详解ImageNet 2017夺冠架构SENet
标准的3×3卷积核只能看到对应区域3×3的大小,可是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。dilated conv原论文中的结构如图所示:
上图b能够理解为卷积核大小依然是3×3,可是每一个卷积点之间有1个空洞,也就是在绿色7×7区域里面,只有9个红色点位置做了卷积处理,其他点权重为0。这样即便卷积核大小不变,但它看到的区域变得更大了。详细解释能够看这个回答:如何理解空洞卷积(dilated convolution)?
图来自微软亚洲研究院公众号
传统的卷积核通常都是长方形或正方形,但MSRA提出了一个至关反直觉的看法,认为卷积核的形状能够是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。
图来自微软亚洲研究院公众号要作到这个操做,能够直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增长了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增长的计算量是至关少的,但能实现可变形卷积核,识别特征的效果更好。详细MSRA的解读能够看这个连接:可变形卷积网络:计算机新“视”界。
如今愈来愈多的CNN模型从巨型网络到轻量化网络一步步演变,模型准确率也愈来愈高。如今工业界追求的重点已经不是准确率的提高(由于都已经很高了),都聚焦于速度与准确率的trade off,都但愿模型又快又准。所以从原来AlexNet、VGGnet,到体积小一点的Inception、Resnet系列,到目前能移植到移动端的mobilenet、ShuffleNet(体积能下降到0.5mb!),咱们能够看到这样一些趋势:
卷积核方面:
卷积层通道方面:
卷积层链接方面:
启发
类比到通道加权操做,卷积层跨层链接可否也进行加权处理?bottleneck + Group conv + channel shuffle + depthwise的结合会不会成为之后下降参数量的标准配置?
若是你有更多的想法或意见,欢迎评论留言,好的idea值得交流传播。