作为一位AI视觉工程师, 除了针对特定的任务设计网络模型之外,对常用的一些网络模型特性,应该要做到如数家珍一样清晰。

本文为总结今年来的卷积神经网络,主要按照时间线和方法类似程度的顺序总结。

开篇先前说下概要,然后展开详细介绍,主要是在densenet、resnext、senet这三个网络上介绍,前面的一系列网络大概讲一下思想。

1、时间轴

时间 团队 论文
2014.09 google Inception v1
2015.02 google Inception v2
2015.12 google Inception v3
2016.02 google Inception v4
时间 团队 论文
2015.12 microsoft ResNet
2016.11 UCSD & Facebook ResNext
时间 团队 论文
2016.08 CORNELL & Tsinghua & Facebook DenseNet
2017.09 momenta SENet
2、关于模型改进的一些个人总结

扩展网络深度,如resnet结构;
扩展网络宽度,如inception结构;
扩展cardinality,如resnext结构;
使用3x3卷积核替换5x5\7x7卷积核;
分解卷积核,nxn->1xn,nx1,减少模型参数;
上面方法进行排列组合;
attention结构,用在batch、channel、pixel上;
Inception系列
1、Inception v1
论文链接:https://arxiv.org/pdf/1409.4842.pdf

1.1 核心思想
传统网络都是通过层的叠加,增加网络深度,这篇论文提出从网络宽度上改进,通过concat操作,将经过不同kernel尺度的feature map进行concat,增加网络对尺度的适应性、增加网络的宽度,提高了网络内部资源的利用率。

inception block结构如下图所示:

网络中除了添加inception block之外,还使用global average pooling代替了全连接层,可以减少参数量,保留显著特征,降低特征维度。

1.2 网络结构

1.3 实验结果

参考链接:

2、Inception v2
论文链接:https://arxiv.org/pdf/1502.03167.pdf

1.1 核心思想
首次提出BN层,减少Internal Covariate Shift,具体BN层的解释可以参考以前的博客,将每一次一个batch中的数据分布控制在均值为0,方差为1。

1.2 网络结构
就是添加了BN层

1.3 实验结果

参考链接:

3、Inception v3
论文链接:https://arxiv.org/pdf/1512.00567.pdf

1.1 核心思想
1、卷积核进行分解:使用两个3x3卷积核代替5x5卷积核,三个3x3卷积核代替7x7卷积核,减少参数量,加快计算。(两个3x3与一个5x5作用是一样的,其感受野都是5)

2、进一步将nxn卷积核分解为1xn和nx1卷积核;

3、减少feature map的size,增加channel数;

1.2 网络结构

1.3 实验结果

参考链接:https://www.cnblogs.com/eniac1946/p/8669937.html

4、Inception v4
论文链接:https://arxiv.org/pdf/1602.07261.pdf

1.1 核心思想
基于inception v3的基础上,引入残差结构,提出了inception-resnet-v1和inception-resnet-v2,并修改inception模块提出了inception v4结构。基于inception v4的网络实验发现在不引入残差结构的基础上也能达到和inception-resnet-v2结构相似的结果,从而认为何凯明等人认为的:“要想得到深度卷积网络必须使用残差结构”这一观点是不完全正确的。

1.2 网络结构

1.2.1 Inception-v4

1.2.2 Inception-resnet-v1

1.2.3 Inception-resnet-v2

1.3 实验结果
在inception-resnet-v1与inception v3的对比中,inception-resnet-v1虽然训练速度更快,不过最后结果有那么一丢丢的差于inception v3;
在inception-resnet-v2与inception v4的对比中,inception-resnet-v2的训练速度更块,而且结果比inception v4也更好一点。所以最后胜出的就是inception-resnet-v2。

参考链接:

1、https://www.cnblogs.com/shouhuxianjian/p/7786760.html

2、https://blog.csdn.net/loveliuzz/article/details/79135583

ResNet系列
5、ResNet
论文链接:https://arxiv.org/pdf/1512.03385v1.pdf

1.1 核心思想
第一次提出残差结构,主要解决两个问题

梯度消失
随着网络深度增加,性能没有提升反而有所下降
如下图,本来要学习H(x),现在转换为F(x)+x,二者效果相同,但是优化难度下降,并且因为多了一个x,使得求导时总有1,避免了梯度消失问题。

进一步拓展残差结构:

1.2 网络结构
1、首先是vgg网络、plain 网络和残差网络的结构比较;

2、本文中的网络结构

1.3 实验结果

参考链接:

6、ResNext
论文链接::https://arxiv.org/pdf/1611.05431.pdf

6.1 核心思想
主要是采用了VGG堆叠思想和Inception的split-transform-merge思想,在不增加参数复杂度的前提下提高准确率。

对比于之前提高准确率的方法,大都是在depth和width上改进,本文提出一种新的方式,命名为cardinality,基数。即得到上一次feature map后,假设cardinality=32,则取32组1x1卷积核,每组4个,分别进行卷积,得到32组feature map,然后再分别进行3x3卷积,最后再通过1x1卷积把通道数还原回来。

具体残差结构如下所示:

上图右图中可以进行变体,下图中这三种结构是完全相等的,

图A就是上面所说的结构;
图B是在3x3卷积后进行了concat,然后再通过统一的1x1卷积操作,这个有点类似于inception-resnet;
C图结构更简洁且速度更快。采用组卷积。采用32个group,每个group的输入输出的通道数都是4;

6.2 网络结构
1、网络结构

resnext与resnet50/101参数量差不多,但是准确率却提升了。

6.3 实验结果
增加Cardinality和增加深度或宽度的对比实验,证明增加Cardinality确实效果比较好。

参考链接:https://blog.csdn.net/u014380165/article/details/71667916

其他
7、DenseNet
论文链接:https://arxiv.org/pdf/1608.06993.pdf

7.1 核心思想
densenet紧接着在resnet之后提出,结合了resnet的思想。网络改进除了像resnet和inception在深度和宽度上做文章外,densenet通过利用feature来减少参数的同时提高效果,对feature进行有效利用并加强feature的传递。

主要思想是将每一层都与后面的层连接起来,如果一个网络中有L层,那么会有L(L+1)/2个连接,具体连接如下图所示:

引用参考链接中的一段话:

DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。

给出resnet和resnext两个结构的公式比较:

resnet:前一层经过非线性变换后与前一层相加得到本层的结果。

densenet:前n层所有的结果进行concat,然后再进行非线性转换。

为了保证feature map的channel不会太大,而且size要保持统一才能concat,将上述作为一个dense block,每个block之间通过池化层相连。

7.2 网络结构
1、引入dense block后的结构图

2、网络结构,图中k表示每个dense block中每层输出的feature map个数

3、bottleneck layer和translation layer

此外,在dense block中引入bottleneck layer,即卷积3x3前增加1x1卷积,以此来减少feature map数量。结构为:

BN -> Relu -> Conv 1x1 -> BN -> Relu -> Conv 3x3

由于feature map通道数量可能还是很大,在每个dense block之间,增加了translation layer,通过1x1卷积核来实现。

BN -> Relu -> Conv 1x1 -> Pooling

7.3 实验结果

参考链接:https://blog.csdn.net/u014380165/article/details/75142664

8、SENet
论文链接:https://arxiv.org/pdf/1709.01507.pdf

8.1 核心思想
从特征通道之间的关系入手,对特征通道之间的关系进行建模表示,根据重要程度增强有用的特征、抑制没有用的特征。

个人感觉像是在通道上做权重,类似于通道上的attention。

主要分为两个过程,如下图所示,squeeze挤压和excitation激励。

8.1.1 Squeeze
如下图所示,对通道进行了挤压,即通过全局平均池化,将shape为[H, W, C]的feature map变为[1, 1, C]。

顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

8.1.2 Excitation
得到挤压后的feature map后,进行激励,使用sigmoid函数。。

首先通过一个全连接层进行降维,即如下公式中的W1z,然后经过relu激活函数。即δ(W1z),再经过全连接进行升维,即W2(δ(W1z)),然后通过sigmoid进行权重激活。

它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

8.1.3 Reweight
最后通过scale相乘,得到se block的结果。

将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

8.1.4 se block
block结构图如下所示:

进一步,变为残差se block,

8.2 网络结构
整个网路结构如下图所示:分别为resnet-50,se-resnet-50,se-resnext-50;

8.3 实验结果
在主流网络上进行了复现,并加了se block结构后进行了比较。

参考链接:

1、https://blog.csdn.net/xjz18298268521/article/details/79078551

2、http://www.sohu.com/a/161633191_465975