返回介绍

数学基础

统计学习

深度学习

工具

Scala

四、Inception

发布于 2023-07-17 23:38:25 字数 24227 浏览 0 评论 0 收藏 0

  1. Inception 网络是卷积神经网络的一个重要里程碑。在Inception 之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使得网络越来越深。这使得网络越来越复杂,参数越来越多,从而导致网络容易出现过拟合,增加计算量。

    Inception 网络考虑的是多种卷积核的并行计算,扩展了网络的宽度。

  2. Inception Net 核心思想是:稀疏连接。因为生物神经连接是稀疏的。

  3. Inception 网络的最大特点是大量使用了Inception 模块。

4.1 Inception v1

4.1.1 网络结构

  1. InceptionNet V1 是一个22层的深度网络。 如果考虑池化层,则有29层。如下图中的depth 列所示。

    网络具有三组Inception 模块,分别为:inception(3a)/inception(3b)inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)inception(5a)、inception(5b)。三组Inception 模块被池化层分隔。

  2. 下图给出了网络的层次结构和参数,其中:

    • type 列:给出了每个模块/层的类型。
    • patch size/stride 列:给出了卷积层/池化层的尺寸和步长。
    • output size 列:给出了每个模块/层的输出尺寸和输出通道数。
    • depth列:给出了每个模块/层包含的、含有训练参数层的数量。
    • #1x1列:给出了每个模块/层包含的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
    • #3x3 reduce列:给出了每个模块/层包含的、放置在3x3 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
    • #3x3列:给出了每个模块/层包含的3x3 卷积核的数量,它就是3x3 卷积核的输出通道数。
    • #5x5 reduce列:给出了每个模块/层包含的、放置在5x5 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
    • #5x5列:给出了每个模块/层包含的5x5 卷积核的数量,它就是5x5卷积核的输出通道数。
    • pool proj列:给出了每个模块/层包含的、放置在池化层之后的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
    • params列:给出了每个模块/层的参数数量。
    • ops列:给出了每个模块/层的计算量。

  3. Inception V1 的参数数量为 697.7 万,其参数数量远远小于AlexNet(6千万)、VGG-Net(超过1亿)。

    Inception V1 参数数量能缩减的一个主要技巧是:在inception(5b)输出到linear之间插入一个平均池化层avg pool

    • 如果没有平均池化层,则inception(5b)linear 之间的参数数量为:7x7x1024x1024,约为 5 千万。
    • 插入了平均池化层之后,inception(5b)linear 之间的参数数量为:1x1x1024x1024,约为 1百万。

4.1.2 Inception 模块

  1. 原始的Inception 模块对输入同时执行:3个不同大小的卷积操作(1x1、3x3、5x5)、1个最大池化操作(3x3 )。所有操作的输出都在深度方向拼接起来,向后一级传递。

    • 三种不同大小卷积:通过不同尺寸的卷积核抓取不同大小的对象的特征。

      使用1x1、3x3、5x5 这些具体尺寸仅仅是为了便利性,事实上也可以使用更多的、其它尺寸的滤波器。

    • 1个最大池化:提取图像的原始特征(不经过过滤器)。

  2. 原始Inception 模块中,模块的输出通道数量为四个子层的输出通道数的叠加。这种叠加不可避免的使得Inception 模块的输出通道数增加,这就增加了Inception 模块中每个卷积的计算量。因此在经过若干个模块之后,计算量会爆炸性增长。

    解决方案是:在3x35x5 卷积层之前额外添加1x1 卷积层,来限制输入给卷积层的输入通道的数量。

    注意:

    • 1x1 卷积是在最大池化层之后,而不是之前。这是因为:池化层是为了提取图像的原始特征,一旦它接在1x1 卷积之后就失去了最初的本意。
    • 1x1 卷积在3x35x5 卷积之前。这是因为:如果1x1 卷积在它们之后,则3x3 卷积、5x5 卷积的输入通道数太大,导致计算量仍然巨大。

4.1.3 辅助分类器

  1. 为了缓解梯度消失的问题,InceptionNet V1 给出了两个辅助分类器。这两个辅助分类器被添加到网络的中间层,它们和主分类器共享同一套训练数据及其标记。其中:

    • 第一个辅助分类器位于Inception(4a) 之后,Inception(4a) 模块的输出作为它的输入。

    • 第二个辅助分类器位于Inception(4d) 之后,Inception(4d) 模块的输出作为它的输入。

    • 两个辅助分类器的结构相同,包括以下组件:

      • 一个尺寸为5x5、步长为3的平均池化层。
      • 一个尺寸为1x1、输出通道数为128 的卷积层。
      • 一个具有1024 个单元的全连接层。
      • 一个drop rate = 70%dropout 层。
      • 一个使用softmax 损失的线性层作为输出层。
  2. 在训练期间,两个辅助分类器的损失函数的权重是0.3,它们的损失被叠加到网络的整体损失上。在推断期间,这两个辅助网络被丢弃。

    Inception v3 的实验中表明:辅助网络的影响相对较小,只需要其中一个就能够取得同样的效果。

    事实上辅助分类器在训练早期并没有多少贡献。只有在训练接近结束,辅助分支网络开始发挥作用,获得超出无辅助分类器网络的结果。

  3. 两个辅助分类器的作用:提供正则化的同时,克服了梯度消失问题。

4.2 Inception v2

  1. Inception v2 的主要贡献是提出了Batch Normalization 。论文指出,使用了Batch Normalization 之后:

    • 可以加速网络的学习。

      相比Inception v1,训练速度提升了14倍。因为应用了BN 之后,网络可以使用更高的学习率,同时删除了某些层。

    • 网络具有更好的泛化能力。

      ImageNet 分类问题的top5 上达到4.8%,超过了人类标注 top5 的准确率。

  2. Inception V2 网络训练的技巧有:

    • 使用更高的学习率。
    • 删除dropout层、LRN 层。
    • 减小L2 正则化的系数。
    • 更快的衰减学习率。学习率以指数形式衰减。
    • 更彻底的混洗训练样本,使得一组样本在不同的epoch 中处于不同的mini batch 中。
    • 减少图片的形变。
  3. Inception v2 的网络结构比Inception v1 有少量改动:

    • 5x5 卷积被两个3x3 卷积替代。

      这使得网络的最大深度增加了 9 层,同时网络参数数量增加 25%,计算量增加 30%。

    • 28x28inception 模块从2个增加到3个。

    • inception 模块中,有的采用最大池化,有的采用平均池化。

    • inception 模块之间取消了用作连接的池化层。

    • inception(3c),inception(4e) 的子层采用步长为 2 的卷积/池化。

    Pool+proj 列给出了inception 中的池化操作。

    • avg+32 意义为:平均池化层后接一个尺寸1x1、输出通道32 的卷积层。
    • max+pass through 意义为:最大池化层后接一个尺寸1x1、输出通道数等于输入通道数的卷积层。

  4. Inception V2 的网络参数约为1126 万。

    参数数量
    conv19408
    conv2114688
    inception-3a218094
    inception-3b259072
    inception-3c384000
    inception-4a608193
    inception-4b663552
    inception-4c912384
    inception-4d1140736
    inception-4e1447936
    inception-5a2205696
    inception-5b2276352
    fc1024000
    11264111
  5. Inception V2ImageNet 测试集上的误差率:

4.3 Inception v3

  1. 虽然Inception v1 的参数较少,但是它的结构比较复杂,难以进行修改。原因有以下两点:

    • 如果单纯的放大网络(如增加Inception 模块的数量、扩展Inception 模块的大小),则参数的数量会显著增长,计算代价太大。
    • Inception v1 结构中的各种设计,其对最终结果的贡献尚未明确。

    因此Inception v3 的论文重点探讨了网络结构设计的原则。

4.3.1 网络结构

  1. Inception v3 的网络深度为42层,它相对于Inception v1 网络主要做了以下改动:

    • 7x7 卷积替换为3个3x3 卷积。

    • 3个Inception模块:模块中的5x5 卷积替换为2个3x3 卷积,同时使用后面描述的网格尺寸缩减技术。

    • 5个Inception 模块:模块中的5x5 卷积替换为2个3x3 卷积之后,所有的nxn 卷积进行非对称分解,同时使用后面描述的网格尺寸缩减技术。

    • 2个Inception 模块:结构如下。它也使用了卷积分解技术,以及网格尺寸缩减技术。

  2. Inception v3 的网络结构如下所示:

    • 3xInception 表示三个Inception 模块,4xInception 表示四个Inception 模块,5xInception 表示五个Inception 模块。

    • conv padded 表示使用0填充的卷积,它可以保持feature map 的尺寸。

      Inception 模块内的卷积也使用0填充,所有其它的卷积/池化不再使用填充。

  3. 3xInception 模块的输出之后设有一个辅助分类器。其结构如下:

  4. Inception v3 整体参数数量约 23,626,728万(论文Xception: Deep Learning with Depthwise Separable Convolutions)。

4.3.2 设计技巧

  1. Inception v3 总结出网络设计的一套通用设计原则:

    • 避免representation 瓶颈:representation 的大小应该从输入到输出缓缓减小,避免极端压缩。在缩小feature map 尺寸的同时,应该增加feature map 的通道数。

      representation 大小通常指的是feature map 的容量,即feature mapwidth x height x channel

    • 空间聚合:可以通过空间聚合来完成低维嵌入,而不会在表达能力上有较大的损失。因此通常在nxn 卷积之前,先利用1x1 卷积来降低输入维度。

      猜测的原因是:空间维度之间的强相关性导致了空间聚合过程中的信息丢失较少。

    • 平衡网络的宽度和深度:增加网络的宽度或者深度都可以提高网络的泛化能力,因此计算资源需要在网络的深度和宽度之间取得平衡。

4.3.2.1 卷积尺寸分解

  1. 大卷积核的分解:将大卷积核分解为多个小的卷积核。

    如:使用2个3x3 卷积替换5x5 卷积,则其参数数量大约是1个5x5 卷积的 72% 。

  2. nxn 卷积核的非对称分解:将nxn 卷积替换为1xn 卷积和nx1 卷积。

    • 这种非对称分解的参数数量是原始卷积数量的 $ MathJax-Element-72 $ 。随着n 的增加,计算成本的节省非常显著。
    • 论文指出:对于较大的feature map ,这种分解不能很好的工作;但是对于中等大小的 feature map (尺寸在12~20 之间),这种分解效果非常好。

4.3.2.2 网格尺寸缩减

  1. 假设输入的feature map 尺寸为dxd,通道数为k。如果希望输出的feature map 尺寸为d/2 x d/2,通道数为2k。则有以下的两种方式:

    • 首先使用2k1x1 的卷积核,执行步长为1的卷积。然后执行一个2x2 的、步长为2的池化操作。

      该方式需要执行 $ MathJax-Element-73 $ 次乘-加操作,计算代价较大。

    • 直接使用2k1x1 的卷积核,执行步长为2的卷积。

      该方式需要执行 $ MathJax-Element-74 $ 次乘-加操作,计算代价相对较小。但是表征能力下降,产生了表征瓶颈。

    事实上每个Inception 模块都会使得feature map 尺寸缩半、通道翻倍,因此在这个过程中需要仔细设计网络,使得既能够保证网络的表征能力,又不至于计算代价太大。

  2. 解决方案是:采用两个模块PC

    • 模块P :使用k1x1 的卷积核,执行步长为2的卷积。其输出feature map 尺寸为d/2 x d/2,通道数为k
    • 模块C:使用步长为2的池化。其输出feature map 尺寸为d/2 x d/2,通道数为k

    将模块P 和模块C 的输出按照通道数拼接,产生最终的输出feature map

4.3.2.3 标签平滑正则化

  1. 标签平滑正则化的原理:假设样本的真实标记存在一定程度上的噪声。即:样本的真实标记不一定是可信的。

    对给定的样本 $ MathJax-Element-698 $ ,其真实标记为 $ MathJax-Element-82 $ 。在普通的训练中,该样本的类别分布为一个 $ MathJax-Element-77 $ 函数: $ MathJax-Element-78 $ 。记做 $ MathJax-Element-79 $ 。

    采用标签平滑正则化(LSR:Label Smoothing Regularization)之后,该样本的类别分布为:

    $ P(Y=k\mid X=\mathbf{\vec x})=(1-\epsilon)\delta_{k,y}+\frac \epsilon K,\quad k=1,2,\cdots,K $

    其中 $ MathJax-Element-80 $ 是一个很小的正数(如 0.1),其物理意义为:样本标签不可信的比例。

    该类别分布的物理意义为:

    • 样本 $ MathJax-Element-698 $ 的类别为 $ MathJax-Element-82 $ 的概率为 $ MathJax-Element-83 $ 。
    • 样本 $ MathJax-Element-698 $ 的类别为 $ MathJax-Element-85 $ 的概率均 $ MathJax-Element-86 $ 。
  2. 论文指出:标签平滑正则化对top-1 错误率和top-5 错误率提升了大约 0.2% 。

4.4 Inception v4 & Inception - ResNet

  1. Inception v4Inception-ResNet 在同一篇论文中给出。论文通过实验证明了:结合残差连接可以显著加速Inception 的训练。

  2. 性能比较:(综合采用了 144 crops/dense 评估的结果,数据集:ILSVRC 2012 的验证集 )

    网络cropsTop-1 ErrorTop-5 Error
    ResNet-151dense19.4%4.5%
    Inception-v314418.9%4.3%
    Inception-ResNet-v114418.8%4.3%
    Inception-v414417.7%3.8%
    Inception-ResNet-v214417.8%3.7%
  3. Inception-ResNet-v2 参数数量约为 5500万,Inception-ResNet-v1/Inception-v4 的参数数量也在该量级。

4.4.1 Inception v4

  1. Inception v4 结构的主要改动:

    • 修改了 stem 部分。

    • 引入了Inception-AInception-BInception-C 三个模块。这些模块看起来和Inception v3 变体非常相似。

      Inception-A/B/C 模块中,输入feature map 和输出feature map 形状相同。而Reduction-A/B 模块中,输出feature map 的宽/高减半、通道数增加。

    • 引入了专用的“缩减块”(reduction block),它被用于缩减feature map 的宽、高。

      早期的版本并没有明确使用缩减块,但是也实现了其功能。

  2. Inception v4 结构如下:(没有标记V 的卷积使用same填充;标记V 的卷积使用valid 填充)

    • stem 部分的结构:

    • Inception-A模块(这样的模块有4个):

    • Inception-B模块(这样的模块有7个):

    • Inception-C模块(这样的模块有3个):

    • Reduction-A模块:(其中 $ MathJax-Element-87 $ 分别表示滤波器的数量)

      网络klmn
      Inception-v4192224256384
      Inception-ResNet-v1192192256384
      Inception-ResNet-v2256256256384
    • Reduction-B模块:

4.4.2 Inception-ResNet

  1. Inception-ResNet 中,使用了更廉价的Inception 块:inception 模块的池化运算由残差连接替代。

    Reduction 模块中能够找到池化运算。

  1. Inception ResNet 有两个版本:v1v2

    • v1 的计算成本和Inception v3 的接近,v2 的计算成本和Inception v4 的接近。
    • v1v2 具有不同的stem
    • 两个版本都有相同的模块A、B、C 和缩减块结构,唯一不同在于超参数设置。
  2. Inception-ResNet-v1 结构如下:

    • stem 部分的结构:

    • Inception-ResNet-A模块(这样的模块有5个):

    • Inception-B模块(这样的模块有10个):

    • Inception-C模块(这样的模块有5个):

    • Reduction-A模块:同inception_v4Reduction-A模块

    • Reduction-B模块:

  3. Inception-ResNet-v2 结构与Inception-ResNet-v1 基本相同 :

    • stem 部分的结构:同inception_v4stem 部分。

      Inception-ResNet-v2 使用了inception v4stem 部分,因此后续的通道数量与Inception-ResNet-v1 不同。

    • Inception-ResNet-A模块(这样的模块有5个):它的结构与Inception-ResNet-v1Inception-ResNet-A相同,只是通道数发生了改变。

    • Inception-B模块(这样的模块有10个):它的结构与Inception-ResNet-v1Inception-ResNet-B相同,只是通道数发生了改变。

    • Inception-C模块(这样的模块有5个):它的结构与Inception-ResNet-v1Inception-ResNet-C相同,只是通道数发生了改变。

    • Reduction-A模块:同inception_v4Reduction-A模块。

    • Reduction-B模块:它的结构与Inception-ResNet-v1Reduction-B相同,只是通道数发生了改变。

  4. 如果滤波器数量超过1000,则残差网络开始出现不稳定,同时网络会在训练过程早期出现“死亡”:经过成千上万次迭代之后,在平均池化之前的层开始只生成 0 。

    解决方案:在残差模块添加到activation 激活层之前,对其进行缩放能够稳定训练。降低学习率或者增加额外的BN都无法避免这种状况。

    这就是Inception ResNet 中的 Inception-A,Inception-B,Inception-C 为何如此设计的原因。

    • Inception-A,Inception-B,Inception-C 放置在两个Relu activation 之间。
    • 通过线性的1x1 Conv(不带激活函数)来执行对残差的线性缩放。

4.5 Xception

  1. 一个常规的卷积核尝试在三维空间中使用滤波器抽取特征,包括:两个空间维度(宽度和高度)、一个通道维度。因此单个卷积核的任务是:同时映射跨通道的相关性和空间相关性。

    Inception 将这个过程明确的分解为一系列独立的相关性的映射:要么考虑跨通道相关性,要么考虑空间相关性。Inception 的做法是:

    • 首先通过一组1x1 卷积来查看跨通道的相关性,将输入数据映射到比原始输入空间小的三个或者四个独立空间。
    • 然后通过常规的3x3 或者 5x5 卷积,将所有的相关性(包含了跨通道相关性和空间相关性)映射到这些较小的三维空间中。

    一个典型的Inception 模块(Inception V3 )如下:

    可以简化为:

  2. Xception 将这一思想发挥到极致:首先使用1x1 卷积来映射跨通道相关性,然后分别映射每个输出通道的空间相关性,从而将跨通道相关性和空间相关性解耦。因此该网络被称作Xception:Extreme Inception ,其中的Inception 块被称作 Xception 块。

  3. Xception 块类似于深度可分离卷积,但是它与深度可分离卷积之间有两个细微的差异:

    • 操作顺序不同:

      • 深度可分离卷积通常首先执行channel-wise 空间卷积,然后再执行1x1 卷积。
      • Xception 块首先执行1x1 卷积,然后再进行channel-wise 空间卷积。
    • 第一次卷积操作之后是否存在非线性:

      • 深度可分离卷积只有第二个卷积(1x1 )使用了ReLU 非线性激活函数,channel-wise 空间卷积不使用非线性激活函数。
      • Xception 块的两个卷积(1x13x3 )都使用了ReLU 非线性激活函数。

    其中第二个差异更为重要。

  4. Xception 进行以下的修改,都可以加快网络收敛速度,并获取更高的准确率:

    • 引入类似ResNet 的残差连接机制。
    • 1x1 卷积和3x3 卷积之间不加入任何非线性。
  5. Xception 的参数数量与Inception V3 相同,但是性能表现显著优于Inception V3 。这表明Xception 更加高效的利用了模型参数。

    • 根据论文Xception: Deep Learning with Depthwise Separable ConvolutionsInception V3 参数数量为 23626728,Xception 参数数量为 22855952 。

    • ImageNet 上的benchmark 为(单个模型,单次crop ):

      模型top-1 accuracytop-5 accuracy
      VGG-1671.5%90.1%
      ResNet-15277.0%93.3%
      Inception V378.2%94.1%
      Xception79.0%94.5%

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文