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

文章转载自知乎,版权归属作者 目录:

1 LeNet
2 AlexNet
3 VGG
4 GoogLeNet
5 ResNet
6 DenseNet
7 Non-Local Networks
8 Deformable Convolutional Networks
9 Dilated Convolutional Networks

10 SENET

本文原文:

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


GitHub地址:

https://github.com/liuyuemaicha/cnn_model

GitHub代码依赖:python 2.7, Pytorch 0.3.1

1

LeNet

LeNet虽然不是CNN的起点,但却是后来CNN兴起的标志模型。LeNet-5是1998年YannLeCun设计用于手写数字识别的模型。

图1.1:LeNet-5网络结构
图1.2:LeNet-5网络结构

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

特点:

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

2.设计了maxpool来提取特征。

2

AlexNet

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

图2.1: AlexNet网络
图2.2: AlexNet网络

特点:

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

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

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

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

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

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

3

VGGNet

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

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

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

图3.1: VGGNet网络结构图

4

GoogLeNet

4.1 GoogLeNet v1

GoogLeNet v1版本诞生于2014年,在ILSVRC 比赛中获得冠军,其性能与同年诞生的VGG差不多,但参数量少于VGG。该模型并没有单纯的将网络加深,而是引入了Inception概念,通过多个卷积核提取图像不同尺度的信息,最后进行融合,可以得到图像更好的表征

特点:

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

2.采用Network in Network中用Average pool来代替全连接层的思想。实际在最后一层还是添加了一个全连接层,是为了大家做finetune。

3.另外增加了两个辅助的softmax分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求导为0,链式求导结果则为0。二是将中间某一层输出用作分类,起到模型融合作用。最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。实际测试时,这两个辅助softmax分支会被去掉。

图4.1: Inception
图4.2
图4.3: GoogLeNet V1整体结构

4.2 GoogLeNet V2,V3

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

V2特点:

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

    (下图Figure5)

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

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

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

    (下图Figure6)

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

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

    (下图Figure7)

图4.4: 3种Inception结构
图4.5: GoogLeNet v2结构

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

  1. RMSProp优化器。

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

  3. 辅助分类器中的BatchNorm。

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

    简单介绍一下BN算法。

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

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

    防止过度拟合)。

4.3 GoogLeNet V4 ,Inception-ResNet v1和v2

图4.6: V4版本 3种Inception结构

图4.7: 4种Reduction结构

图4.8: 3种Inception-ResNet-V1结构

图4.9: 3种Inception-ResNet-V2结构

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

4.11: Stem与最终网络结构图

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

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

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

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

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

Inception-ResNet V1和V2特点:

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

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

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

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

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

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

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

    Reduction Block A与Inception v4中的相同。

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

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

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

  7. 结果发现,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)

图5.1 ResNet中的block示意图

从图5.1可以看出:相比传统网络:y=f(x),ResNet Block公式为:y=f(x) + x,可以称之为skip connect。

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

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

图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。

图6.1 ResNet Block与DenseNetBlock区别

图6.2DenseNet Block示意图
图6.3 DenseNet 各网络结构图

图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可以在每层计算中参考全局信息。

该方法属于自注意力机制的范畴

图7.1 non-local means 滤波示意图:non-local顾名思义,将这个邻域扩展到全图。如上图p作为中心像素,q1,q2,q3对p的滤波都有贡献,实际上图像上任意一个点都有贡献。

图7.2 None-local的实现方式

图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
图7.4 Non-local 网络结构

特点:

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

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

8

Deformable Convolutional Networks

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

首次在卷积神经网络(convolutional neutral networks,CNN)中引入了学习空间几何形变的能力,得到可变形卷积网络(deformable convolutional networks),从而更好地解决了具有空间形变的图像识别任务。研究员们通过大量的实验结果验证了该方法在复杂的计算机视觉任务(如目标检测和语义分割)上的有效性,首次表明在深度卷积神经网络(deep CNN)中学习空间上密集的几何形变是可行的。
作者:微软亚洲研究院
链接:https://www.zhihu.com/question/57493889/answer/184578752

当前深度模型对物体的几何形变适应能力几乎还是来自于数据本身的多样性,模型内部并不具有适应几何形变的机制。作者认为造成这样的问题是卷积操作本身就是固定的几何结构。

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

图7.6 示例图


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原始论文中的示意图:

(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的感受野是指数级的增长。

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的特征信息。作者的设计如下图所示:

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

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

图中Fscale是一个Reweight操作。完成了每个channel的特征图权重计算。

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

参考文献:

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

推荐阅读

人工智能学习梳理和总结

  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的Scikit-Learn库提供了一个快速而灵活的框架,可以轻松地构建卷积神经网络(CNN模型。要搭建一个CNN模型,我们需要遵循以下步骤: 1.准备数据:首先,我们需要加载和处理数据集。当前常用的是数据框架格式,可用Pandas处理,但如果需要使用TensorFlow中的Keras,那么就需要使用它的内置数据加载和预处理功能,来获得更高的效率。 2.构建模型结构:在此步骤中,我们可以选择使用Keras,定义CNN模型。在论文中,也可以引用LeNet或AlexNet这样的循环卷积网络结构。 3.编译模型:在此步骤中,我们需要定义损失函数、优化器和评估指标,以便用于训练模型。 4.训练模型:在此步骤中,我们将数据集喂给模型,通过调整参数来最小化损失函数进行迭代训练。 5.评估模型:完成训练后,我们需要评估模型的性能,看看它在新数据上的表现情况。可以采用交叉验证和测试集等方法评估模型。 6.预测数据:最后,我们可以使用训练好的模型来进行预测,在新数据集上进行推断。 在构建CNN模型时,需要特别注意调整超参数和模型架构,以便获得最佳性能。同时,也要注意过拟合和欠拟合问题,并采取相应的解决方案。 ### 回答2: Python中的sklearn库提供了许多机器学习算法的实现,包括卷积神经网络(CNN)。搭建CNN模型的基本步骤如下: 1.导入sklearn库中神经网络模块: ``` from sklearn.neural_network import MLPClassifier ``` 2.准备数据: CNN是一种非常适合处理图像的神经网络,因此在搭建CNN模型之前,需要准确地处理图像数据。可以使用numpy加载图片并将其转换为多维数组。通常可以使用OpenCV或Pillow等库来加载图片数据集。 3.定义模型: 使用MLPClassifier类来定义模型。MLPClassifier是多层神经网络的分类器。在此类中,包含许多参数,例如隐层层数、每层神经元数和激活函数等。 4.训练和测试模型: 定义好模型后,使用fit()方法对模型进行训练,使用predict()方法对模型进行测试。在训练和测试时,需要传递样本和标签数据。通常会将数据分成训练集和测试集。 5.评估模型: 完成模型训练和测试后,可以使用sklearn库中的准确率(accuracy)函数,对模型进行评估。 总之,使用sklearn库中的MLPClassifier类创建CNN模型,并将数据集用于训练和测试,最后通过准确率函数对模型进行评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值