深度学习总结:常见卷积神经网络——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

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a