50

10 大 CNN 核心模型完全解析(附源代码,已全部跑通)

 4 years ago
source link: https://www.tuicool.com/articles/6Rrqiaz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1. LeNet

LeNet虽然不是CNN的起点,但却是后来CNN兴起的标志模型。

LeNet-5是1998年YannLeCun设计用于手写数字识别的模型。

ZfIjErf.jpg!web

图1.1 LeNet-5网络结构

v2u6RrM.jpg!web

图1.2 LeNet-5网络结构

在当年神经网络还是MLP(Multilayer Perceptron,多层感知机)大行其道时,能设计出这样的模型已实属不易,也为后来CNN模型的发展奠定了基础。

特点:

相比MLP,LeNet使用了相对更少的参数,获得了更好的结果。

设计了maxpool来提取特征。

2. AlexNet

AlexNet是Hinton和他的学生Alex在2012设计的网络,并获得了当年的ImageNet竞赛冠军。

NFrYj2R.jpg!web

图2.1: AlexNet网络

ZveMR3U.jpg!web


图2.2 AlexNet网络

特点:

相比LeNet,AlexNet设计了更深层的网络。

在每个卷机后面添加了Relu激活函数,解决了Sigmoid的梯度消失问题,使收敛更快。

添加了归一化LRN(Local Response Normalization,局部响应归一化)层,使准确率更高。

设计并使用了dropout层,减轻了模型的过拟合。

通过裁剪,旋转等方式增强了训练数据。

受于当时的算力限制,Alexnet创新地将图像分为上下两块分别训练,然后在全连接层合并在一起(AlexNet网络图1,可以看到有上下两部分)。

3. VGGNet

VGGNet在2014年的ImageNet比赛中,分别在定位和分类跟踪任务中取得第一名和第二名。

特点:

探索了更深层次的网络结构图,可以看成是AlexNet的加强版本。

在卷机设计上,使用了更小的卷机核,验证了小尺寸的卷机核在深度网络中,不仅减少了参数,也达到了更好的效果。

zuaieaB.jpg!web


图3.1 VGGNet网络结构图

4. GoogLeNet

4.1 GoogLeNet v1

GoogLeNet v1版本诞生于2014年,在ILSVRC 比赛中获得冠军,其性能与同年诞生的VGG差不多,但参数量少于VGG。

该模型并没有单纯的将网络加深,而是引入了Inception概念, 通过多个卷积核提取图像不同尺度的信息,最后进行融合,可以得到图像更好的表征。

特点:

引入Inception概念,在当时流行模型‘加深’情况下,设计了‘加宽’的思路

采用Network in Network中用Average pool来代替全连接层的思想。

实际在最后一层还是添加了一个全连接层,是为了大家做finetune。

另外增加了两个辅助的softmax分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。

反向传播时如果有一层求导为0,链式求导结果则为0。

二是将中间某一层输出用作分类,起到模型融合作用。

最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。

实际测试时,这两个辅助softmax分支会被去掉。

A7NjmeJ.jpg!web


图4.1 Inception

2Q7FRzF.jpg!web


图4.2

nEZ3mqU.jpg!web


图4.3 GoogLeNet V1整体结构

4.2 GoogLeNet V2,V3

在2015年,同篇论文中发布了 GoogLeNet V2和V3版本。

特点:

学习VGGNet的特点,用两个3*3卷积代替5*5卷积,降低参数量,提高计算速度,从而提升性能。

(下图Figure5)

它们将滤波器大小nxn的卷积分解为1xn和nx1卷积的组合。

例如,3×3卷积相当于首先执行1×3卷积,然后在其输出上执行3×1卷积。

他们发现这种方法比单个3×3卷积便宜33%。

(下图Figure6)

模块中的滤波器组被扩展(更宽而不是更深)以消除代表性瓶颈。

如果模块变得更深,则尺寸会过度减少,从而导致信息丢失。

(下图Figure7)

neYJRvn.jpg!web


图4.4 3种Inception结构

nYnqMjM.jpg!web


图4.5 GoogLeNet v2结构

V3包含了为V2规定的所有上述改进,另外还使用了以下内容:

RMSProp优化器。

学习Factorization into small convolutions的思想,将7×7分解成两个一维的卷积(1×7,7×1),3×3也是一样(1×3,3×1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224×224变为了299×299,更加精细设计了35×35/17×17/8×8的模块。

辅助分类器中的BatchNorm。

BN算法是一个正则化方法,可以提高大网络的收敛速度。

简单介绍一下BN算法。

就是对输入层信息分布标准化处理,使得规范化为N(0,1)的高斯分布,收敛速度大大提高。

标签平滑(添加到损失公式中的一种正规化组件,可防止网络对类过于自信。

防止过度拟合)。

4.3 GoogLeNet V4 ,Inception-ResNet v1和v2

BZ3yiab.jpg!web

图4.6 V4版本 3种Inception结构

MVzQreU.jpg!web

图4.7 4种Reduction结构

q6JZV3E.jpg!web

图4.8 3种Inception-ResNet-V1结构

7ZJZbe6.jpg!web

图4.9 3种Inception-ResNet-V2结构

AjUrAfJ.jpg!web

图4.10 Inception-ResNet结构中加入 Activation Scaling,防止网络“死亡”

VFjy6jz.jpg!web


4.11 Stem与最终网络结构图

V4与之前的V3,V2版本主要改动有:

修改了stem,这里的stem是指在引入Inception块之前执行的初始操作集。

V4引入了专门的“Reduction Blocks”,用于改变网格的宽度和高度。

早期版本没有显式Reduction Blocks,但实现了类似功能。

V4版本的3种Inception与之前版本的3种Inception非常相似,但也做了细节的修改。

Inception-ResNet V1和V2特点:

在Inception设计中加入了ResNet思想。

从图4.8和图4.9可以看到,V1和V2中的3种Inception-ResNet结构相同,不同的

只是超参数。

Inception-ResNet V1与V2的整体结构不同,Inception-ResNet V1的计算成本与Inception v3类似,Inception-ResNet V2的计算成本与Inception v4类似。

为了实现残差加法,卷积后的输入和输出必须具有相同的尺寸。

因此,我们在Inception卷积之后使用1×1卷积来匹配深度大小(卷积后的深度增加)。

主要Inception模块内的池化操作被替换为有利于残差连接。

但是,您仍然可以在reduction blocks中找到这些操作。

Reduction Block A与Inception v4中的相同。

如果滤波器的数量超过1000,那幺网络架构中更深的残差单元会导致网络“死亡”。

因此,为了增加稳定性,作者将残差激活量调整,系数为0.1到0.3,如图4.10。

为了在单个GPU上训练模型,原始论文在求和之后没有使用BatchNorm(以使整个模型适合单个GPU)。

结果发现,Inception-ResNet模型能够再用较少的epoch时获得更高的精度。

5. ResNet

随着算力的不断更新,越来越深的网络能够得到计算,但研究者发现随着网络的加深,模型变得越来越不能够训练,遇到了梯度消失或爆炸问题。

在ResNet出现之前,人们通过BN,Relu等方式去缓解此问题,但仍然不能把网络做到足够深。

15年何恺明提出了ResNet网络,该思路启发于LSTM的控制门的思想。

y = H(x,WH)•T(x,WT) + X•(1- T(x,WT))

可以看出,当T(x,WT) = 0,y=x,当T(x,WT) = 1,y= H(x,WH)

ZV77zi6.jpg!web


图5.1 ResNet中的block示意图

从图5.1可以看出:

相比传统网络:

y=f(x),ResNet Block公式为:

y=f(x) + x,可以称之为skip connect。

MjANvqN.jpg!web

图5.2 ResNet网络中使用的两种Block

7jANVvV.jpg!web


图5.3 不同层数的ResNet设计方式

aMbMR3z.jpg!web


图5.4 34层ResNet与其他网络的比较

题外话:

Orhan等发表的论文《Skip connections eliminate singularities》提出 神经网络的退化才是难以训练深层网络根本原因所在,而不是梯度消散。

虽然梯度范数大,但是如果网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。

并且随着网络层数的增加,连乘后使得整个秩变的更低。

这也是我们常说的网络退化问题,虽然是一个很高维的矩阵,但是大部分维度却没有信息,表达能力没有看起来那幺强大。

残差连接正是强制打破了网络的对称性。

总的来说一句话,打破了网络的对称性,提升了网络的表征能力。

也可查看文献《Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units》。

6. DenseNet

从图6.1中可以看出,DenseNet是借鉴了ResNet,是ResNet的升级版,从上述ResNet可以看到,一般每个Block会有一个skip connect,而DenseNet会在每层conv间有一个skip connect。

jm2iIz7.jpg!web

图6.1 ResNet Block与DenseNetBlock区别

i6ZNfyz.jpg!web


图6.2 DenseNet Block示意图

eM7VzmI.jpg!web

图6.3 DenseNet 各网络结构图

myQbIrr.jpg!web


图6.4 DenseNet 网络

神经网络越深,网络的能力越强,就越有可能过度学习数据集,导致过拟合。

大家应该还记得,作为第一个深层网络Alexnet网络,它提出了重要的策略dropout,对于提高模型的泛化能力非常有效。

alexnet网络至今仍然可以用于很多的任务,这足以说明其鲁棒性。后来BN和数据增强等正则化策略替代dropout也在一定程度上缓解了过拟合的问题。

文《Deep networks with stochastic depth》(Huang G, Sun Y, Liu Z, et al. )是DenseNet作者们早期的研究,它们通过训练时随机丢掉一些网络层,提高了ResNet的泛化性能。

从这里可以看出来一个重要特性,这也是神经网络中大家比较关心的问题,网络的冗余性绝对是存在的,而且不小,通过探索dropout值的比例对性能的影响可以去估算这个冗余。

既然丢掉某些层间连接或者整个层不影响性能,就说明这一层学习到的非线性转变很小,既然转变很小,那幺每一层学习几百个通道,还有必要吗?

这几百个通道,正是万恶的计算量所在。

考虑到这一点,densenet就同时做了两件事情,一是将网络中的每一层都直接与其前面层相连,提高特征的利用率;

二是把网络的每一层设计得很窄,也就是卷积的输出通道数通常很小,只有几十,该层学习非常少的特征图并与输入concat使用。

这实现了资源的最大化利用和计算量的压缩。

ImageNet分类数据集上达到同样的准确率,DenseNet 所需的参数量不到ResNet的一半,所需的计算量也只有ResNet的一半左右。

引用自【模型解读】“全连接”的卷积网络,有什幺好?

7. Non-Local Networks

Non-Local Networks启发于non-local means滤波算法,该滤波算法是经典的图像去噪算法之一。

在CNN模型中不论是conv层还是pool层(全局pool除外),它们对数据的感受野都是局部的。

为了增大conv或pool的感受野,传统方式是增加网络的深度(网络越深,后面conv和pool的感受野越大),但这样会增加训练的难度(越深越难训练),而且降低效率(参数增加)。

该论文提出的Non-local Networks可以在每层计算中参考全局信息。

该方法属于 自注意力机制

的范畴

ArQRBfB.jpg!web

图7.1 non-local means 滤波示意图:


non-local顾名思义,将这个邻域扩展到全图。

如上图p作为中心像素,q1,q2,q3对p的滤波都有贡献,实际上图像上任意一个点都有贡献。

vUfiUrZ.jpg!web

图7.2 None-local的实现方式

UVV7FvN.jpg!web


图7.3 None-local公式

Non-Local Networks 代码(pytorch):

self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)

self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)

self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)

self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0)

g_x = self.g(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)

theta_x = self.theta(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)

phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)

f = torch.matmul(theta_x, phi_x)

f_div_C = F.softmax(f, dim=-1)

y = torch.matmul(f_div_C, g_x).permute(0, 2, 1).contiguous()

y = y.view(batch_size, self.inter_channels, *x.size()[2:])

W_y = self.W(y)

z = W_y + x

N3mMNfy.jpg!web


图7.4 Non-local 网络结构

特点:

对于视频分类,non-local会好于相应的一般网络,毕竟没有大的感受野未必能很鲁棒的捕捉一个动作到底是跳高还是跳水。

依据作者们的结论,在网络浅层效果会更好,毕竟随着网络深度增加,传统网络感受野也会增加了,Non-local的效果也就不再明显。

补充:

这里的Non-Local和NLP中的Self-Attention有异曲同工之妙,它们本质是一样的,NLP是当前token与上下文的关系,此处图片是当前像素与全图像素的关系。

NLP中的Self-Attention计算图如下:

JJFFj2I.jpg!web

NLP在计算Self-Attention时,会生成3个向量:

查询向量q,键向量k和值向量v;

步骤:

询向量q*键向量k,得到上下文的全局token与当前token的关联度,再通过求均值和softmax将关联度做归一化;

上下文的每个token向量乘以其对应的关联度,再求和,从而得到当前token的word embedding。

Non-Local与NLP self-attention的共同点:

Non-Local代码中的theta_x和phi_x相当于NLP中的查询向量和键向量, 通过torch.matmul(theta_x, phi_x)得到全图像素与当前像素的关联度,再通过 F.softmax(f, dim=-1)做关联度的归一化;

全图像素乘以其对应的关联度,再求和,从而得到当前的像素值(特征值)。

8. Deformable Convolutional Networks

同样的物体在图像中可能呈现出不同的大小、姿态、视角变化甚至非刚体形变,如何适应这些复杂的几何形变是物体识别的主要难点。而Deformable Conv模型尝试着解决这类问题。

首次在卷积神经网络(convolutional neutral networks,CNN)中引入了学习空间几何形变的能力,得到可变形卷积网络(deformable convolutional networks),从而更好地解决了具有空间形变的图像识别任务。

研究员们通过大量的实验结果验证了该方法在复杂的计算机视觉任务(如目标检测和语义分割)上的有效性,首次表明在深度卷积神经网络(deep CNN)中学习空间上密集的几何形变是可行的。

作者:

微软亚洲研究院

链接:

https://www.zhihu.com/question/57493889/answer/184578752

当前深度模型对物体的几何形变适应能力几乎还是来自于数据本身的多样性,模型内部并不具有适应几何形变的机制。

作者认为造成这样的问题是卷积操作本身就是固定的几何结构。

uUbEr2Z.jpg!web

图7.5 展示了卷积核大小为 3×3 的正常卷积和可变形卷积的采样方式,(a) 所示的正常卷积规律的采样 9 个点(绿点),(b)(c)(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中(c)(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换的特殊情况作

JJnMj2R.jpg!web

图7.6 示例图

uqiaequ.jpg!webvyMNBbE.jpg!web

9. Dilated Convolutional Networks

Dilated Convolution 被中文翻译为“空洞卷积”或“膨胀卷积”,我更倾向于称之为“膨胀卷积”。

该模型最早由Fisher Yu在2016年ICLR上发表的论文《Multi-Scale Context Aggregation by Dilation Convolutions》中提出。

该模型最早应用于图像分割,因为传统CNN模型需要通过pooling层来缩小图像尺寸,并扩大下一层的感受野,即进行下采样(down sampling);

这一过程肯定会有信息丢失。

因为图像分割是pixel-wise的,且在图像预测时还需要进行上采样(up sampling)操作,丢失的信息在上采样过程中也很难再找回。

为了解决上述问题,Fisher Yu提出了Dilated Convolution方法,通过Dilated Convolution来替代pooling层进行下采样操作,不仅扩大了感受野,也不会丢失信息。

下面看一下dilated conv原始论文中的示意图:

A7jeAjU.jpg!web

(a)图对应3×3的1-dilated conv,和普通的卷积操作一样

(b)图对应3×3的2-dilated conv,实际的卷积kernel size还是3×3,但是空洞为1,也就是对于一个7×7的图像patch,只有9个红色的点和3×3的kernel发生卷积操作,其余的点略过。

也可以理解为kernel的size为7×7,但是只有图中的9个点的权重不为0,其余都为0。

可以看到虽然kernel size只有3×3,但是这个卷积的感受野已经增大到了7×7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那幺每个红点就是1-dilated的卷积输出,所以感受野为3×3,所以1-dilated和2-dilated合起来就能达到7×7的conv)

(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15×15的感受野。

对比传统的conv操作,3层3×3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

10. SENET

SENET在ImageNet 2017中的Image Classification夺得冠军。

并在CVPR 2017中发表论文《Squeeze-and-excitation networks》。

作者大概总结了前人对CNN模型的改进:

卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。

卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

近很多工作被提出来从空间维度层面来提升网络的性能,如Inception结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;

还如Non-local,deformable conv,dilated conv等都是在空间层面进行改进。

本文提到的SENet另辟蹊径,尝试着从channel特征中寻找优化点。

作者认为在每层卷积中输出的每个channel,其信息重要性是不同的,我们需要为每个channel的feature map设置一个权重,来重新量化每个channel的特征信息。

作者的设计如下图所示:

6FziEfN.jpg!web

图中Fsq为Squeeze操作,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。

图中Fex为Excitation操作,它是一个类似于循环神经网络中门的机制。

通过参数 来为每个特征通道生成权重,其中参数 被学习用来显式地建模特征通道间的相关性。

图中Fscale是一个Reweight操作。

完成了每个channel的特征图权重计算。

SE作为一个模块,可以跟其他CNN模型进行组合使用,下图是分别于Inception和ResNet进行组合。

YFjmMjv.jpg!web

参考文献:

https://mp.weixin.qq.com/s/IMkvod2Lj2VOIWbFtAirzA

https://zhuanlan.zhihu.com/p/45189981

https://www.zhihu.com/question/312556066

https://www.zhihu.com/question/57493889/answer/184578752

https://www.zhihu.com/question/54149221/answer/192025860

GitHub地址:https://github.com/liuyuemaicha/cnn_model


GitHub代码依赖:

python 2.7, Pytorch 0.3.1


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK