深度学习总结:常见卷积神经网络——Inception

2024-04-04 08:58

本文主要是介绍深度学习总结:常见卷积神经网络——Inception,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度学习总结:常见卷积神经网络(2)——Inception

    • Inception v1
    • Inception v2
      • BN层
    • Inception v3
      • 非对称卷积分解
    • Inception v4
    • 总结

  上一篇博客主要回顾了VGG和Resnet,这一篇主要回顾一下GoogLeNet系列。

Inception v1

Inception v1提出于2014年,和VGG是同一年,使用了Inception的结构。
  首先inception v1的层数是22层,但他的参数量却只有Alexnet的十二分之一。提升卷积神经网络的一个有效方法就是加大网络,无非就就是从宽度和深度两方面考虑,但这样会带来两个缺点:1参数变多,同时以造成过拟合,2网络的加深,比较难训练,同时梯度消失不可避免。
  Inception同时从深度和宽度两方面考虑。同时考虑逐层的构造网络,如果数据集的概率分布能够被一个神经网络所表达,那么构造这个网络的最佳方法是逐层构筑网络,即将上一层高度相关的节点连接在一起。几乎所有效果好的深度网络都具有这一点,不管AlexNet VGG堆叠多个卷积,GoogLeNet堆叠多个inception模块,还是ResNet堆叠多个resblock。在构筑网络时,还考虑了稀疏的结构:人脑的神经元连接就是稀疏的,因此大型神经网络的合理连接方式也应该是稀疏的。稀疏的结构对于大型神经网络至关重要,可以减轻计算量并减少过拟合。 卷积操作(局部连接,权值共享)本身就是一种稀疏的结构,相比于全连接网络结构是很稀疏的。
  - 深度:采用了22层的结构,9个inception堆叠,同时为了避免梯度消失的问题,同时将梯度传递到较浅的层,在不同的层增加了辅助分类器输出Loss,这样做的另一个好处是在分类中考虑了中间层和浅层的特征。
在这里插入图片描述
另外,在网络的开始用了7×7的卷积,目的是为了降低图像的特征层的大小,减少后面的计算量。
  - 宽度:Inception结构,利用 size 为 1、 3、 5 不同大小的卷积核,同一层网络在不同通道的卷积核输出结果的相关性极高,1×1的卷积核可以自然地把这些相关性高的同一位置不同通道的特征结合起来,其他尺寸的卷积核保证了特征提取的多样性
在这里插入图片描述
  上图即为Inception Module,其中3 × 3和 5 × 5卷积之前的1 ×1的卷积核和池化层之后的 1 × 1的卷积核的作用是为了减少网络参数,同时方便之后的concat而降维。
  在Inception Module中,通常1×1的卷积比例最高,3×3和5×5的卷积稍低。在整个网络中,会有多个堆叠的Inception Module,希望靠后的Inception Module能捕捉更高阶的抽象特征,因此在靠后的Inception Module中,大卷积的占比变多。
   训练和测试的trick,通过resize和crop对图像进行增强。
   结论,稀疏的结构是有用的,Inception structure 提升了精度,但是计算消耗对比于更浅和更窄的网络增加的较少。

Inception v2

Inception v2 提出于2015年,其主要结构相对于Inception v1的变化不是很大,主要贡献点在于提出了BN层,即BatchNormalization。
  论文的出发点在于,神经网络的在训练过程中,每一层输入数据的分布是不断变化的,网络结构需要不断的去适应由于输入数据分布带来的变化。每层数据的输入,都会受到前面所有层的影响。很小的参数的变化,都会对后面的数据输入造成很大的扰动,层数越深,扰动越大。使得我们在训练网络的时候需要更低的学习率和更小心的进行参数初始化,导致我们难以充分的训练一个具有饱满的非线性模型的结构。因此,作者认为,如果对每一层的数据输入,固定其分布,能够加速深度模型的训练。神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

BN层

在这里插入图片描述
  如果对每一层的数据进行归一化,即变成零均值一方差,由于数据集中到sigmoid的近似线性部分,破坏了网络的非线性。为了解决这个问题,作者在归一化后面加入了尺度的变换和平移,保证模型的非线性能力。其中λ和β都是可以学习的。
在这里插入图片描述
  归一化具有可导性,因此可以端到端的训练。
  在inference时,
在这里插入图片描述在这里插入图片描述
  另外,归一化的过程中,由于需要减去均值的操作,z=g(Wu+b)中的b可以省去,变成z=g(BN(Wu))。
BN层的好处:

  • 减小了internal covariance shift的影响,隐藏层不用浪费时间对付变化的输入分布,模型训练收敛的更快。
  • 由于相对而言,优化算法面对的问题简单了,learning rate可以比没有BN的网络稍大一些,模型训练收敛的更快。
  • 网络权重的初始化比没有BN的时候更容易,敏感度下降。
  • minibatch的均值方差有一定统计涨落,能起到regularization的作用,可以取代dropout。
    其他trick
  1. 增大了学习率,因为BN层的存在,不用担心因学习率过大而导致的小变化引起的大扰动问题。
  2. 借鉴了VGG,采用两个3×3的卷积层代替5×5的卷积层。
  3. BN层具有很强的泛化能力,可以替代dropout。
  4. 使用了随机梯度下降SGD,作者在论文一开始就说了大段SGD的好处。
  5. 由于BN层的存在,可以去除LRN

结论,BN层可以解决数据分布变化的问题(covariate shift)。可以增大学习率,加快了训练的速度。

Inception v3

Inception v3提出于2015年,和v2一样,其基本框架结构和v1一致,主要是对原来结构的优化和改进。
首先,论文介绍了卷积神经网络的主要设计原则,这些原则主要是通过大量的实验的出来的:

  • 要避免表示的瓶颈,尤其是在网络的前面层,网络中特征层的尺寸越来越小,但是这个过程要平稳,前面的层不能压缩的太过,
  • 高维度的特征更容易处理,增加维度有利于生成更多解耦的信息,方便训练的更快。
  • 在低维度进行空间的聚合,可以减少信息的损失,因为低维度空间中相近的信息相互关联。
  • 要平衡好深度和宽度,虽然同时增加有利于提高网络的性能,但是会增加计算的消耗。
    Inception v3的主要贡献点在于卷积的分解,同时增加了一些减少计算量的结构上的改变。
    在VGG中,提出,可以用两个3×3来代替一个5×5的卷积核,可以证明,其感受野是一致的。
    在这里插入图片描述

非对称卷积分解

受到之前vgg的启发,作者将原来3×3的卷积进一步分解,用3×1+1×3的卷积来代替3×3的卷积。如下图所示
在这里插入图片描述
这种卷积分解的方法可以进一步减少网络的参数,加快网络的速度。
相应的,原始版本的Inception Module也变为下图所示
在这里插入图片描述
实验证明,上述的结构在网络的前面几层效果一般,但是在中间层可以取得很好的效果。
其他trick:

  • 辅助分类器如果加入BN层或者,dropout,网络效果会变得更好,regularizer的作用。
  • 降低特征图的尺寸,双线性操作(一边卷积,一边池化),在降低特征尺度的同时,增加了channel。图10
  • 在需要升维并降低特征图尺寸的地方,先池化再卷积可以减少计算量。图9
  • 真对不同尺度大小的特征层,设计了几种不同的Inception块,具体见论文。
    在这里插入图片描述
    结论,作者提出了几条扩大网络规模的设计准则,同时提出了卷积核分解的方法,另外其他的trick也都提高了网络的性能。

Inception v4

之前介绍的v2,v3版本在结构上相比于v1并不是很大,而v4版本结构的变化较大,针对不同大小的特征层,针对性的提出了不同的Inception Module。论文里不仅提出了 Inception V4的,还提出了基于inception 和Resnet 的Inception-Resnet-v1和Inception-Resnet-v2,其中的Inception Module都带有残差连接。
由于Inception v4的改进主要是网络结构的改进,这里不再细说,详细结构自行查阅论文。其主要贡献点在于使用并行的结构,不对称的卷积,并且用了大量的1×1的卷积核进行维度的变换。
v4版本的inception主要有以下三种,
在这里插入图片描述

总结

本文主要总结了inception从v1的提出,到v2 v3 v4不同版本的改进,简单介绍了每篇论文的创新点和改进点。

这篇关于深度学习总结:常见卷积神经网络——Inception的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875356

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操