社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【深度学习】基础知识--CNN:图像分类(中)

机器学习初学者 • 3 年前 • 967 次点击  

作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!

六、ResNet 变种

6.1 恒等映射修正

  1. 在论文《Identity Mappings in Deep Residual Networks》中,ResNet 的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。

6.1.1 新残差块

  1. 新的残差单元中,恒等映射添加到ReLU 激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。

  2. 假设 是第 l 个残差单元的输入特征; 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量; 代表残差函数。则第 个残差单元的输出为(它也等价于第 个残差单元的输入):

    考虑递归,对于任意深的残差单元 ,则有:

    因此,对任意深的单元 ,其输入特征 可以表示为浅层单元 的特征 加上一个形如 的残差函数。

    这意味着:任意单元 之间都具有残差性。

  3. 对于任意深的单元 ,其输入特征 可以表示为: 。即:之前所有残差函数输出的总和,再加上

    与之形成鲜明对比的是常规网络中,输入特征 是一系列矩阵向量的乘积。即为: (忽略了激活函数和 BN )。

  4. 新的残差单元也更具有良好的反向传播特性。对于损失函数 ,有:

    可以看到:

  • 梯度 可以分解为两个部分:

  • :直接传递信息而不涉及任何权重。它保证了信息能够直接传回给任意浅层

  • :通过各权重层来传递。

  • 在一个mini-batch 中,不可能出现梯度消失的情况。

    可能对于某个样本,存在 的情况,但是不可能出现mini-batch 中所有的样本满足

    这意味着:哪怕权重是任意小的,也不可能出现梯度消失的情况。

    对于旧的残差单元,由于恒等映射还需要经过ReLU 激活函数,因此当 时饱和,其梯度为0 。

  • 根据3.4. 的讨论表明:在前向和反向阶段,信号都能够直接传递到任意单元。

  • 6.1.2 快捷连接验证

    1. 假设可以对快捷连接执行缩放(如线性的1x1 卷积),第 个残差单元的缩放因子为 ,其中 也是一个可以学习的参数。此时有: ,以及:

      令:,则有:

      对于特别深的网络:如果 , 则 发生梯度爆炸;如果 , 则 发生梯度消失。这会丧失快捷连接的好处。

    2. 如果对快捷连接执行的不是线性缩放,而是一个复杂的函数 ,则上式括号中第一部分变成: 。其中 的导数。

      这也会丧失快捷连接的好处,阻碍梯度的传播。

    3. 下图所示为对快捷连接进行的各种修改:

      为了简化,这里没有画出BN 层。每个权重层的后面实际上都有一个BN 层。

      在统计学上,它等效于一个缩放比例为0.5的缩放操作。

    CIFAR-10 上利用ResNet-110 的测试误差如下:(fail 表示测试误差超过

    on shortcuton F 列分别给出了快捷连接、残差块上的缩放比例。


      • (a):原始的、旧的残差块。

      • (b):对所有的快捷连接设置缩放。其中缩放因子

        残差有两种配置:缩放(缩放因子 0.5)、不缩放。

      • (c):对快捷连接执行门控机制。残差由 g 来缩放,快捷连接由 1-g 来缩放。

        其中

      • (d):对快捷连接执行门控机制,但是残差并不进行缩放。

      • (e):对快捷连接执行1x1 卷积。

      • (f):对快捷连接执行dropout,其中遗忘比例为0.5 。

    1. 最终结果表明:快捷连接是信息传递最直接的路径,快捷连接中的各种操作都会阻碍信息的传递,以致于对优化造成困难。

    2. 理论上,对快捷连接执行1x1 卷积,会引入更多的参数。它应该比恒等连接具备更强大的表达能力。

      事实上,其训练误差要比恒等连接的训练误差高的多。这意味着模型退化是因为优化问题,而不是网络表达能力的问题。

    3. 6.1.3 激活函数验证

      1. 设残差块之间的函数为 ,即:+ 之后引入

        前面的理论推导均假设 为恒等映射 ,而上面的实验中 。因此接下来考察 f 的影响。

      2. 如下图所示,组件都相同,但是不同的组合导致不同的残差块或 f 。

        这种结构问题较大,因为理想的残差块的输出范围是 。这里的残差块经过个ReLU 之后的输出为非负,从而使得残差的输出为 ,从而使得前向信号会逐级递增。这会影响网络的表达能力。

      • (d):将ReLU 移动到残差块之前,

      • (e):将BNReLU 移动到残差块之前,

      • (a):原始的、旧的残差块,

      • (b):将BN 移动到addition 之后,

      • (c):将ReLU 移动到addition 之前,

    4. 最终结果表明:full pre-activation 效果最好。有两个原因:

      所有其它四组结构中,只有第二个权重层的输入的到了标准化,第一个权重层的输入并未的到标准化。

      • 快捷连接通路是顺畅的,这使得优化更加简单。

      • 对两个权重层的输入都执行了BN

      6.1.4 网络性能

      1. ILSVRC 2012 验证集上的评估结果:

        方法数据集增强train croptest croptop-1 误差top-5 误差
        ResNet-152,原始残差块scale224x224224x22423.0%6.7%
        ResNet-152,原始残差块scale224x224320x32021.3%5.5%
        ResNet-152,full pre-activationscale224x224320x32021.1%5.5%
        ResNet-200,原始残差块scale224x224320x32021.8%6.0%
        ResNet-200,full pre-activationscale224x224320x32020.7%5.3%
        ResNet-200,full pre-activationscale + asp ratio 224x224320x32020.1%4.8%
        Inception v3scale + asp ratio299x299299x29921.2%5.6%

      6.2 ResNeXt

      1. 通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。

        ResNeXt 网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。

      2. ResNeXt 的设计参考了VGGInception 的设计哲学。

        其缺点是:

      • 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。

      • 一旦需要训练新的任务(如新任务是一个NLP 任务),可能需要重新设计网络结构。因此可扩展性不高。

      • ResNeXt 结合了二者的优点:

      • 网络结构也是通过简单地层叠相同结构的层来实现。

      • 网络的每一层都执行了分裂-变换-合并策略。

      • VGG:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。

      • Inception:通过执行分裂-变换-合并策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并行为预期能够达到一个大的dense 层的表达能力,但是计算复杂度要低的多。

    5. 在相同的参数数量和计算复杂度的情况下,ResNeXt 的预测性能要优于ResNet

      • 它在ILSVRC 2016 分类任务中取得了第二名的成绩。
      • 101 层的ResNeXt 就能够获得超过200ResNet 的准确率,并且计算量只有后者的一半。
    6. ResNeXt 改进了ResNet 网络结构,并提出了一个新的维度,称作“基数”cardinality。基数是网络的深度和网络的宽度之外的另一个重要因素。

      作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。

    7. 6.2.1 分裂-变换-合并

      1. 考虑全连接网络中的一个神经元。假设输入为 ,为一个一度的输入向量(长度为 D )。假设对应的权重为 。不考虑偏置和激活函数,则神经元的输出为:

        它可以视作一个最简单的“分裂-变换-合并”:

      • 分裂:输入被分割成 D 个低维(维度为零)嵌入。
      • 变换:每个低维嵌入通过对应的权重 执行线性变换。
      • 合并:变换之后的结果通过直接相加来合并。
    8. Inception 的“分裂-变换-合并”策略:

      • 分裂:输入通过1x1 卷积被分割成几个低维嵌入。
      • 变换:每个低维嵌入分别使用一组专用滤波器(3x35x5 等) 执行变换。
      • 合并:变换之后的结果进行合并(沿深度方向拼接)。
    9. 对一个ResNeXt 块,其“分裂-变换-合并”策略用公式表述为:

      其中:

      • 为任意函数,它将 映射为 的一个低维嵌入,并对该低维嵌入执行转换。
      • C 为转换的数量,也就是基数cardinality
    10. ResNeXt 中,为了设计方便 采取以下设计原则:

      • 所有的 具有相同的结构。这是参考了VGG 的层叠相同结构的层的思想。

      • 的结构通常是:

      • 第一层:执行1x1 的卷积来产生 的一个低维嵌入。

      • 第二层 ~ 倒数第二层:执行卷积、池化等等变换。

      • 最后一层:执行1x1 的卷积来将结果提升到合适的维度。

      6.2.2 ResNeXt 块

      1. 一个ResNeXt 模块执行了一组相同的“变换”,每一个“变换”都是输入的一个低维嵌入,变换的数量就是基数 C

        如下所示:左图为ResNet 块;右图为ResNeXt 块。

      2. ResNeXt 模块有两种等效的形式:图(a) 为标准形式,图(b)类似Inception-ResNet 模块。其中图(b) 的拼接是沿着深度方向拼接。

        经过这种拆分,图(b) 就等效于图(a)。其中:i 表示输出单元位于 i 通道,s 表示输入单元位于 s 通道,j,k 表示通道中的坐标。

        本质原因是1x1 卷积是简单的对通道进行线性相加。它可以拆分为:先将输入通道分组,然后计算各组的子通道的线性和(1x1 卷积);然后将所有组的和相加。


      • (b) 与Inception-ResNet 模块的区别在于:这里每一条路径都是相同的。

      • (c) 是一个分组卷积的形式,它就是用分组卷积来实现图(b)。它也是图(b) 在代码中的实现方式。

      • 等效的原因是:输入通道数为1281x1 卷积可以如下拆分:( 设输入张量为 ,输出张量为 ,核张量为 )

    11. 通常ResNeXt 模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。

      • 此时并没有通过 1x1 卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。
      • 如下图所示,它等价于图(c) 中,去掉中间的变换层(128,3x3,128 层),同时将第一层、第三层的 1x1 替换为3x3 卷积层。


      6.2.3 网络性能

      1. ResNeXt 的两种重要超参数是:基数C 和颈宽d

        这二者也决定了ResNeXt 模块等价形式中,通道分组卷积的通道数量为 Cxd

      • 基数 C :决定了每个ResNeXt 模块有多少条路径。
      • 颈宽(bottleneck widthd:决定了ResNeXt 模块中第一层1x1 卷积降维的维度。
    12. ResNeXt 的网络参数和计算量与同等结构的ResNet 几乎相同。以ResNet-50 为例(输入图片尺寸224x224 ):

      ResNeXt-50(32x4d) 意思是:基数C=32,颈宽d=4

    13. ImageNet 上进行的对比实验(验证集误差,single crop ):

    14. 基数 vs 颈宽:基数越大越好。

      模型配置top-1 error(%)
      ResNet-50C=1,d=6423.9
      ResNeXt-50C=2,d=4023.0
      ResNeXt-50C=4,d=2422.6
      ResNeXt-50C=8,d=1422.3
      ResNeXt-50C=32,d=422.2
      ResNet-101C=1,d=6422.0
      ResNeXt-101C=2,d=4021.7
      ResNeXt-101C=4,d=2421.4
      ResNeXt-101C=8,d=1421.3
      ResNeXt-101C=32,d=421.2
        • 基数 vs 深度/宽度:基数越大越好。


        4.与其它模型的预测能力比较(验证集误差,single crop):

        ResNet/ResNeXt 的图片尺寸为224x224320x320Inception 的图片尺寸为299x299

        6.3 随机深度网络

        1. 随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。

          如图所示:在CIFAR-10 上,1202 层的ResNet 测试误差要高于 110 层的ResNet ,表现出明显的过拟合。而 1202 层的随机深度网络(结合了ResNet )的测试误差要低于 110 层的ResNet

        2. 神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的feature 消失、训练时间过长。

        • 虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。

        • 随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:

        • 在网络训练期间,对每个mini batch 随机地移除部分层来显著的减小网络的深度。

          移除操作:删除对应的层,并用跳跃连接来代替。

        • 在网络测试期间,使用全部的网络层。

      1. 随机深度的思想可以和ResNet 结合。因为ResNet 已经包含了跳跃连接,因此可以直接修改。

      2. 6.3.1 随机深度

        1. 假设ResNet 个残差块,则有: 。其中:

        • 表示第 个残差块的输出, 为第 个残差块的输入(它也是第 个残差块的输出)。
        • 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量。
        • 代表残差函数。
      3. 假设第 个残差块是否随机丢弃由伯努利随机变量 来指示:当 时,第 个残差块被丢弃;当 时,第 个残差块被保留。

        因此有:

        对随机变量 ,令:

        其中 称做保留概率或者存活概率,它是一个非常重要的超参数。

      4. 的选择有两个策略:

        其背后的思想是:靠近输入的层提取的是被后续层使用的低级特征,因此更应该被保留下来。

        • 所有残差块的存活概率都相同:

        • 所有残差块的存活概率都不同,且根据残差块的深度进行线性衰减:

      5. 给定第 个残差块的保留概率 ,则网络的深度 的期望为(以残差块数量为单位):

        时,无论是均匀存活还是线性衰减存活,都满足 。因此随机深度网络在训练时具有更短的期望深度,从而节省了训练时间。

        • 对于均匀存活:

        • 对于线性衰减存活:

      6. 的选择策略,以及 的大小的选取需要根据实验仔细选择。

        • 根据作者的实验结果,作者推荐使用线性衰减存活概率,并选择 。此时有:
        • 如果选择更小的 将会带来更大的测试误差,但是会更大的加速训练过程。

      7. 测试时,需要调整残差块的输出:

      8. 随机深度网络能够大大减少训练时间和测试误差。

        • 训练时间减小是因为:网络训练时,期望深度减小。

        • 测试误差减小是因为:

        • 网络训练时期望深度的减少,使得梯度链变短,从而加强了反向传播期间靠近输入层的梯度。

        • 随机深度网络可以被理解为一系列不同深度的网络的隐式集成的集成模型。

      9. 随机深度网络可以视作 个隐式的神经网络的集成,这些被集成的网络都是权重共享的,类似于Dropout

        • 在训练时,对每个mini batch,只有其中之一得到了权重更新。
        • 在测试时,取所有被集成的网络的平均。
      10. 随机深度网络和 Dropout 都可以被理解为一系列网络的隐式集成。

        • 随机深度集网络成了一系列具有不同深度的神经网络,而 Dropout集成了一系列具有不同宽度的神经网络。
        • DropoutBN配合使用时会失效,而随机深度可以和BN 配合使用。
      11. 在随机深度网络中,由于训练时的随机深度,模型的测试误差的抖动相对于ResNet 会偏大。

      12. 6.3.2 网络性能

        1. ResNet (固定深度和随机深度)在三个数据集上进行比较,测试误差的结果如下:

          虽然这里模型的测试误差没有提升,但是训练速度大幅提升。

          网络CIFAR10+CIFAR100+ImageNet
          ResNet(固定深度)6.4127.7621.78
          ResNet(随机深度)5.2524.9821.98
        • + 表示执行了数据集增强。

        • 随机深度网络采用

        • CIFAR10/100 采用 110 层 ResNet ImageNet 采用 152 层 ResNet

        • 虽然在 ImageNet 上随机深度模型没有提升,但是作者表示这是因为网络本身比较简单(相对 ImageNet 数据集)。如果使用更深的ResNet,则容易看到随机深度模型的提升。

      13. CIFAR-10 上,ResNet 随机深度网络的深度 、概率 与测试集误差的关系:

      14. 七、SENet

        1. SENet 提出了一种新的架构单元来解决通道之间相互依赖的问题。它通过显式地对通道之间的相互依赖关系建模,自适应的重新校准通道维的特征响应,从而提高了网络的表达能力。
        2. SENet2.251% top-5 的错误率获得了ILSVRC 2017 分类比赛的冠军。
        3. SENet 是和ResNet 一样,都是一种网络框架。它可以直接与其他网络架构一起融合使用,只需要付出微小的计算成本就可以产生显著的性能提升。

        7.1 SE 块

        1. SE 块(Squeeze-and-Excitation)是SENet 中提出的新的架构单元,它主要由squeeze 操作和excitation 操作组成。

        2. 对于给定的任何变换 ,其中: 为输入feature map,其尺寸为,通道数为 为输出feature map,其尺寸为 ,通道数为

          可以构建一个相应的SE块来对输出feature map 执行特征重新校准:

        • 首先对输出feature map squeeze操作,它对每个通道的全局信息建模,生成一组通道描述符。
        • 然后是一个excitation 操作,它对通道之间的依赖关系建模,生成一组权重信息(对应于每个通道的权重)。
        • 最后输出feature map 被重新加权以生成SE 块的输出。

      15. SE 块可以理解为注意力机制的一个应用。它是一个轻量级的门机制,用于对通道关系进行建模。

        通过该机制,网络学习全局信息(全通道、全空间)来选择性的强调部分特征,并抑制其它特征。

      16. 为第 个通道,是一个 的矩阵;设 为第 个通道,是一个 的矩阵。

        这里 * 表示卷积。同时为了描述简洁,这里忽略了偏置项。

        • 输出 考虑了输入 的所有通道,因此通道依赖性被隐式的嵌入到 中。
        • 需要学习的变换 就是一组卷积核。 为第 c 个卷积核,记做: 为第 个卷积核的第 通道,是一个二维矩阵。则:

        7.1.1 squeeze 操作

        1. squeeze 操作的作用是:跨空间 聚合特征来产生通道描述符。

          该描述符嵌入了通道维度特征响应的全局分布,包含了全局感受野的信息。

        2. 每个学到的滤波器都是对局部感受野进行操作,因此每个输出单元都无法利用局部感受野之外的上下文信息。

          在网络的低层,其感受野尺寸很小,这个问题更严重。

        为减轻这个问题,可以将全局空间信息压缩成一组通道描述符,每个通道对应一个通道描述符。然后利用该通道描述符。

        3.通常基于通道的全局平均池化来生成通道描述符(也可以考虑使用更复杂的聚合策略)。

        设所有通道的通道描述符组成一个向量 。则有:

        .

        7.1.2 excitation 操作

        1. excitation 操作的作用是:通过自门机制来学习每个通道的激活值,从而控制每个通道的权重。

        2. excitation 操作利用了squeeze 操作输出的通道描述符

          降维通过一个输出单元的数量为 的全连接层来实现,其中 为降维比例。

          升维通过一个输出单元的数量为 C 的全连接层来实现。

          通过对通道描述符 进行降维,显式的对通道之间的相互依赖关系建模。

        • 然后,ReLU 激活函数的输出经过线性升维之后,通过一个sigmoid 激活函数。
        • 首先,通道描述符 经过线性降维之后,通过一个ReLU 激活函数。


      17. excitation 操作的输出为向量 ,则有:

        其中:sigmoid激活函数, 为降维层的权重, 为升维层的权重,为降维比例。

      18. 在经过excitation 操作之后,通过重新调节 得到SE 块的输出。

        SE 块的最终输出为 ,则有: 。这里 excitaion 操作的输出结果,它作为通道 的权重。

        不仅考虑了本通道的全局信息(由 引入),还考虑了其它通道的全局信息(由 引入)。

      19. 7.1.3 SE 块使用

        1. 有两种使用SE 块来构建SENet 的方式:

          下图中,左侧为原始Inception 模块,右侧为SE-Inception 模块。

        下图中,左侧为原始残差模块,右侧为SE-ResNet 模块。

          • 简单的堆叠SE块来构建一个新的网络。

          • 在现有网络架构中,用SE 块来替代原始块。

        1. 如果使用SE 块来替代现有网络架构中的原始块,则所有额外的参数都包含在门机制的两个全连接层中。

          引入的额外参数的数量为: 。其中: 表示降维比例(论文中设定为16), 指的是SE 块的数量, 表示第 SE 块的输出通道的维度。

          如:SE-ResNet-50ResNet-50 所要求的大约2500万参数之外,额外引入了约250万参数,相对增加了

        2. 超参数 称作减少比率,它刻画了需要将通道描述符组成的向量压缩的比例。它是一个重要的超参数,需要在精度和复杂度之间平衡。

          网络的精度并不会随着 的增加而单调上升,因此需要多次实验并选取其中最好的那个值。

          如下所示为SE-ResNet-50 采用不同的 ImageNet 验证集上的预测误差(single-crop)。original 表示原始的 ResNet-50

        3. 虽然SE块可以应用在网络的任何地方,但是它在不同深度中承担了不同的作用。

          这说明在网络的最初阶段,特征通道的重要性很可能由不同的类别共享。即:低层特征通常更具有普遍性。

          这说明在网络的高层,每个通道的值变得更具有类别特异性。即:高层特征通常更具有特异性。

          在网络的最后阶段的SE 块为网络提供重新校准所起到的作用,相对于网络的前面阶段的SE 块来说,更加不重要。

          这意味着可以删除最后一个阶段的SE 块,从而显著减少总体参数数量,仅仅带来一点点的损失。如:在SE-ResNet-50中,删除最后一个阶段的SE 块可以使得参数增加量下降到 4%,而在ImageNet上的top-1 错误率的损失小于 0.1%

          因此:Se 块执行特征通道重新校准的好处可以通过整个网络进行累积。

          • 在网络较高的层中:对于不同类别的样本,特征通道的权重分布开始分化。
          • 在网络较低的层中:对于不同类别的样本,特征通道的权重分布几乎相同。

          7.2 网络性能

          1. 网络结构:其中 fc,[16,256] 表示 SE 块中的两个全连接层的输出维度。

          2. ImageNet 验证集上的计算复杂度和预测误差比较(single-crop)。

          • original 列:从各自原始论文中给出的结果报告。

          • re-implementation 列:重新训练得到的结果报告。

          • SENet 列:通过引入SE 块之后的结果报告。

          • GFLOPs/MFLOPs:计算复杂度,单位为 G/M FLOPs

          • MobileNet 采用的是 1.0 MobileNet-224ShuffleNet 采用的是 1.0 ShuffleNet 1x(g=3)

          • 数据集增强和归一化:

          • 随机裁剪成 224x224 大小(Inception 系列裁剪成 299x299 )。

          • 随机水平翻转。

          • 输入图片沿着通道归一化:每个像素减去本通道的像素均值。




          3.在ImageNet 验证集上的预测误差比较(single-crop):

          其中 SENet-154(post-challenge) 是采用 320x320 大小的图片来训练的。


          八、 DenseNet

          1. DenseNet不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。

          2. ResNet 的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet 做得更为彻底:将所有层以前馈的形式相连,这种网络因此称作DenseNet

          3. DenseNet 具有以下的优点:

          • 缓解梯度消失的问题。因为每层都可以直接从损失函数中获取梯度、从原始输入中获取信息,从而易于训练。
          • 密集连接还具有正则化的效应,缓解了小训练集任务的过拟合。
          • 鼓励特征重用。网络将不同层学到的 feature map 进行组合。
          • 大幅度减少参数数量。因为每层的卷积核尺寸都比较小,输出通道数较少 (由增长率 决定)。
        4. DenseNet 具有比传统卷积网络更少的参数,因为它不需要重新学习多余的feature map

          这会改变状态,但是也传递了需要保留的信息。

          • ResNet 通过恒等映射来直接传递需要保留的信息,因此层之间只需要传递状态的变化

          • DenseNet 会将所有层的状态 全部保存到集体知识中,同时每一层增加很少数量的feture map 到网络的集体知识中

          • 传统的前馈神经网络可以视作在层与层之间传递状态的算法,每一层接收前一层的状态,然后将新的状态传递给下一层。
        5. DenseNet 的层很窄(即:feature map 的通道数很小),如:每一层的输出只有 12 个通道。

        6. 8.1 DenseNet 块

          1. 具有 层的传统卷积网络有 个连接,每层仅仅与后继层相连。

            具有 个残差块的 ResNet 在每个残差块增加了跨层连接,第 个残差块的输出为: 。其中 是第 个残差块的输入特征; 为一组与第 个残差块相关的权重(包括偏置项), 是残差块中的层的数量; 代表残差函数。

            具有 个层块的DenseNet 块有 个连接,每层以前馈的方式将该层与它后面的所有层相连。对于第 层:所有先前层的feature map 都作为本层的输入,第 层具有 个输入feature map ;本层输出的feature map 都将作为后面 层的输入。

          2. 假设DenseNet块包含 层,每一层都实现了一个非线性变换 ,其中 表示层的索引。

            假设DenseNet块的输入为 DenseNet块的第 层的输出为 ,则有:

            其中 表示 层输出的feature map 沿着通道方向的拼接。

            ResNet 块与它不同。在ResNet 中,不同feature map 是通过直接相加来作为块的输出。



          3.当 feature map 的尺寸改变时,无法沿着通道方向进行拼接。此时将网络划分为多个DenseNet 块,每块内部的 feature map尺寸相同,块之间的feature map 尺寸不同。

          8.1.1 增长率

          1. DenseNet 块中,每层的 输出的feature map 通道数都相同,都是 个。 是一个重要的超参数,称作网络的增长率。

            第 l 层的输入feature map 的通道数为: 。其中 为输入层的通道数。

          2. DenseNet 不同于现有网络的一个重要地方是:DenseNet 的网络很窄,即输出的 feature map 通道数较小,如:k=12。

            一个很小的增长率就能够获得不错的效果。一种解释是:DenseNet 块的每层都可以访问块内的所有早前层输出的feature map,这些feature map 可以视作DenseNet 块的全局状态。每层输出的feature map 都将被添加到块的这个全局状态中,该全局状态可以理解为网络块的“集体知识”,由块内所有层共享。增长率 k 决定了新增特征占全局状态的比例。

            因此feature map 无需逐层复制(因为它是全局共享),这也是DenseNet 与传统网络结构不同的地方。这有助于整个网络的特征重用,并产生更紧凑的模型。

          8.1.2 非线性变换

          1. 可以是包含了 Batch Normalization(BN)ReLU 单元、池化或者卷积等操作的复合函数。
          2. 论文中 的结构为:先执行BN ,再执行ReLU,最后接一个3x3 的卷积,即:BN-ReLU-Conv(3x3)

          8.1.3 bottleneck

          1. 尽管DenseNet 块中每层只产生 个输出feature map,但是它具有很多输入。当在 之前采用 1x1 卷积实现降维时,可以减小计算量。

            的输入是由第 层的输出 feature map 组成,其中第 0 层的输出feature map就是整个DensNet 块的输入feature map

            事实上第 层从DensNet 块的输入feature map 中抽取各种特征。即 包含了DensNet 块的输入feature map 的冗余信息,这可以通过 1x1 卷积降维来去掉这种冗余性。

            因此这种1x1 卷积降维对于DenseNet 块极其有效。

          2. 如果在 中引入 1x1 卷积降维,则该版本的DenseNet 称作DenseNet-B 。其 结构为:先执行BN ,再执行ReLU,再接一个1x1 的卷积,再执行BN ,再执行ReLU,最后接一个3x3 的卷积。即:BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3)

            其中1x1 卷积的输出通道数是个超参数,论文中选取为

          8.2 过渡层

          1. 一个DenseNet 网络具有多个DenseNet块,DenseNet 块之间由过渡层连接。DenseNet 块之间的层称为过渡层,其主要作用是连接不同的DenseNet块。

          2. 过渡层可以包含卷积或池化操作,从而改变前一个DenseNet 块的输出feature map 的大小(包括尺寸大小、通道数量)。

            论文中的过渡层由一个BN层、一个1x1 卷积层、一个2x2 平均池化层组成。其中 1x1 卷积层用于减少DenseNet 块的输出通道数,提高模型的紧凑性。

            如果不减少DenseNet 块的输出通道数,则经过了 DenseNet 块之后,网络的feature map 的通道数为: ,其中 为输入图片的通道数, 为每个DenseNet 块的层数。



          3.如果Dense 块输出feature map的通道数为 m ,则可以使得过渡层输出feature map 的通道数为 ,其中 为压缩因子。

          结合了DenseNet-CDenseNet-B 的改进的网络称作 4DenseNet-BC

            • 时,经过过渡层的feature map 通道数不变。

            • 时,经过过渡层的feature map 通道数减小。此时的DenseNet 称做 DenseNet-C

            8.3 网络性能

            1. 网络结构:ImageNet 训练的DenseNet 网络结构,其中增长率 k=32 。

            • 表中的 conv 代表的是 BN-ReLU-Conv 的组合。如 1x1 conv 表示:先执行BN,再执行ReLU,最后执行1x1 的卷积。
            • DenseNet-xx 表示DenseNet 块有xx 层。如:DenseNet-169 表示 DenseNet 块有 L=169 层 。
            • 所有的 DenseNet 使用的是 DenseNet-BC 结构,输入图片尺寸为224x224,初始卷积尺寸为7x7、输出通道 2k、步长为2 ,压缩因子 =0.5 。
            • 在所有DenseNet 块的最后接一个全局平均池化层,该池化层的结果作为softmax 输出层的输入。

          1. ImageNet 验证集的错误率(single-crop/10-crop):

            模型top-1 error(%)top-5 error(%)
            DenseNet-12125.02/23.617.71/6.66
            DenseNet-16923.80/22.086.85/5.92
            DenseNet-20122.58/21.466.34/5.54
            DenseNet-26422.15/20.806.12/5.29

            下图是DenseNetResNetImageNet 验证集的错误率的比较(single-crop)。左图为参数数量,右图为计算量。

          2. 从实验可见:DenseNet 的参数数量和计算量相对ResNet 明显减少。

              • 具有 20M 个参数的DenseNet-201 与具有 40M 个参数的ResNet-101 验证误差接近。
              • ResNet-101 验证误差接近的DenseNet-201 的计算量接近于ResNet-50,几乎是ResNet-101 的一半。
            1. DenseNetCIFARSVHN 验证集的表现:

              从实验可见:

              网络可以利用更大、更深的模型提高其表达学习能力,这也表明了DenseNet 不会受到优化困难的影响。

              这带来的一个效果是:DenseNet-BC 不容易发生过拟合。

              事实上在CIFAR10 上,DenseNet 中,参数数量提升了4倍但是验证误差反而 5.77 下降到 5.83,明显发生了过拟合。而DenseNet-BC 未观察到过拟合。

              • DenseNet 的参数效率更高,使用了压缩因子和bottleneckDenseNet-BC 的参数利用率极高。
              • 不考虑压缩因子和bottleneck,L 和 k 越大DenseNet表现更好。这主要是因为模型容量相应地增长。
              • C10+C100+ :表示对CIFAR10/CIFAR100 执行数据集增强,包括平移和翻转。
              • C10/C100/SVHN 三列上的DenseNet 采用了 Dropout
              • DenseNetDepth 列给出的是 L 参数。
            2. DenseNet 提高准确率的一个可能的解释是:各层通过较短的连接(最多需要经过两个或者三个过渡层)直接从损失函数中接收额外的监督信息。

            3. 8.4 内存优化

              8.4.1 内存消耗

              1. 虽然 DenseNet 的计算效率较高、参数相对较少,但是DenseNet 对内存不友好。考虑到GPU 显存大小的限制,因此无法训练较深的 DenseNet

              2. 假设DenseNet块包含 L 层,对于第 l 层有:

                假设每层的输出feature map 尺寸均为 、通道数为 BN-ReLU-Conv(3x3) 组成,则:

                因此除了第 层的输出feature map 需要内存开销之外,第 l 层还需要 的内存开销来存放中间生成的临时feature map

                整个 DenseNet Block 需要 的内存开销来存放中间生成的临时feature map 。即DenseNet Block 的内存消耗为,是网络深度的平方关系。

              • 拼接Concat操作 :需要生成临时feature map 作为第 l 层的输入,内存消耗为
              • BN 操作:需要生成临时feature map 作为ReLU 的输入,内存消耗为
              • ReLU 操作:可以执行原地修改,因此不需要额外的feature map 存放ReLU 的输出。
              • Conv 操作:需要生成输出feature map 作为第 l 层的输出,它是必须的开销。
            4. 拼接Concat操作是必须的,因为当卷积的输入存放在连续的内存区域时,卷积操作的计算效率较高。而DenseNet Block 中,第 l 层的输入feature map 由前面各层的输出feature map 沿通道方向拼接而成。而这些输出feature map 并不在连续的内存区域。

              另外,拼接feature map 并不是简单的将它们拷贝在一起。由于feature mapTensorflow/Pytorch 等等实现中的表示为 ,或者 ,如果简单的将它们拷贝在一起则是沿着mini batch 维度的拼接,而不是沿着通道方向的拼接。

            5. DenseNet Block 的这种内存消耗并不是DenseNet Block 的结构引起的,而是由深度学习库引起的。因为Tensorflow/PyTorch 等库在实现神经网络时,会存放中间生成的临时节点(如BN 的输出节点),这是为了在反向传播阶段可以直接获取临时节点的值。

              这是在时间代价和空间代价之间的折中:通过开辟更多的空间来存储临时值,从而在反向传播阶段节省计算。

            6. 除了临时feature map 的内存消耗之外,网络的参数也会消耗内存。设 H_l 由BN-ReLU-Conv(3x3) 组成,则第 l 层的网络参数数量为: (不考虑 BN )。

              整个 DenseNet Block 的参数数量为 ,即 。因此网络参数的数量也是网络深度的平方关系。

              • 由于DenseNet 参数数量与网络的深度呈平方关系,因此DenseNet 网络的参数更多、网络容量更大。这也是DenseNet 优于其它网络的一个重要因素。
              • 通常情况下都有 ,其中 为网络feature map 的宽、高,k 为网络的增长率。所以网络参数消耗的内存要远小于临时feature map 消耗的内存。

              8.4.2 内存优化

              1. 论文《Memory-Efficient Implementation of DenseNets》通过分配共享内存来降低内存需求,从而使得训练更深的DenseNet 成为可能。

                其思想是利用时间代价和空间代价之间的折中,但是侧重于牺牲时间代价来换取空间代价。其背后支撑的因素是:Concat操作和BN 操作的计算代价很低,但是空间代价很高。因此这种做法在DenseNet 中非常有效。

              2. 传统的DenseNet Block 实现与内存优化的DenseNet Block 对比如下(第 层,该层的输入feature map 来自于同一个块中早前的层的输出):

                该层的临时feature map 需要消耗内存 2WHkl,该层的输出feature map 需要消耗内存 WHk 。

              • 左图为传统的DenseNet Block 的第 l 层。首先将 feature map 拷贝到连续的内存块,拷贝时完成拼接的操作。然后依次执行BNReLUConv 操作。
              • 另外某些实现(如LuaTorch)还需要为反向传播过程的梯度分配内存,如左图下半部分所示。如:计算 BN 层输出的梯度时,需要用到第 l 层输出层的梯度和BN 层的输出。存储这些梯度需要额外的 的内存。* 另外一些实现(如PyTorch,MxNet)会对梯度使用共享的内存区域来存放这些梯度,因此只需要 的内存。

              • 右图为内存优化的DenseNet Block 的第 l 层。采用两组预分配的共享内存区Shared memory Storage location 来存Concate 操作和BN 操作输出的临时feature map



              1. 第一组预分配的共享内存区:Concat 操作共享区。第 层的 Concat 操作的输出都写入到该共享区,第 层的写入会覆盖第 层的结果。

                因为Concat 操作的计算效率非常高,因此这种额外的计算代价很低。

              • 对于整个Dense Block,这个共享区只需要分配 (最大的feature map )的内存,即内存消耗为 (对比传统DenseNet 的 O(kL^2))。

              • 后续的BN 操作直接从这个共享区读取数据。

              • 由于第 层的写入会覆盖第 层的结果,因此这里存放的数据是临时的、易丢失的。因此在反向传播阶段还需要重新计算第 层的Concat 操作的结果。

            7. 第二组预分配的共享内存区:BN 操作共享区。第 层的 BN 操作的输出都写入到该共享区,第 层的写入会覆盖第 层的结果。

              BN 的计算效率也很高,只需要额外付出大约 5% 的计算代价。

              • 对于整个Dense Block,这个共享区也只需要分配 (最大的feature map )的内存,即内存消耗为 (对比传统DenseNet)。

              • 后续的卷积操作直接从这个共享区读取数据。

              • Concat 操作共享区同样的原因,在反向传播阶段还需要重新计算第 l 层的BN 操作的结果。

            8. 由于BN 操作和Concat 操作在神经网络中大量使用,因此这种预分配共享内存区的方法可以广泛应用。它们可以在增加少量的计算时间的情况下节省大量的内存消耗。

            9. 8.4.3 优化结果

              1. 如下图所示,DenseNet 不同实现方式的实验结果:

                注意:

                如前面的推导过程中,DenseNet Block 参数数量 ,内存消耗 。因此 ,即

              • PyTorch 自动实现了梯度的内存共享区。

              • 内存消耗是参数数量的线性函数。因为参数数量本质上是网络深度的二次函数,而内存消耗也是网络深度的二次函数。

              • Naive Implementation(LuaTorch):采用LuaTorch 实现的,不采用任何的内存共享区。
              • Shared Gradient Strorage(LuaTorch):采用LuaTorch 实现的,采用梯度内存共享区。
              • Shared Gradient Storage(PyTorch) :采用PyTorch 实现的,采用梯度内存共享区。
              • Shared Gradient+BN+Concat Strorate(LuaTorch):采用LuaTorch 实现的,采用梯度内存共享区、Concat内存共享区、BN内存共享区。
              • Shared Gradient+BN+Concat Strorate(PyTorch):采用LuaTorch 实现的,采用梯度内存共享区、Concat内存共享区、BN内存共享区。


            10. 如下图所示,DenseNet 不同实现方式的训练时间差异(NVIDIA Maxwell Titan-X ):

              • 梯度共享存储区不会带来额外时间的开销。
              • Concat内存共享区、BN内存共享区需要额外消耗 15%(LuaTorch) 或者20% (PyTorch) 的时间。


            11. 如下图所示,不同DenseNet的不同实现方式在ImageNet 上的表现(single-crop test):

              网络参数数量:232 层DenseNetk=48,55M 参数。264 层DenseNetk=32,33M 参数;k=48,73M 参数。

              • DenseNet cosine 使用 学习率。

              • 经过内存优化的DenseNet 可以在单个工作站(8 NVIDIA Tesla M40 GPU )上训练 264 层的网络,并取得了top-1 error=20.26% 的好成绩。



              九、小型网络

              1. 目前神经网络领域的研究基本可以概括为两个方向:探索模型更好的预测能力,关注模型在实际应用中的难点。

                事实上卷积神经网络在图像识别领域超越了人类的表现,但是这些先进的网络需要较高的计算资源。这些资源需求超出了很多移动设备和嵌入式设备的能力(如:无人驾驶),导致实际应用中难以在这些设备上应用。

                小型网络就是为解决这个难点来设计的。

              2. 小型网络的设计和优化目标并不是模型的准确率,而是在满足一定准确率的条件下,尽可能的使得模型小,从而降低对计算资源的需求,降低计算延迟。

              3. 小型高效的神经网络的构建方法大致可以归为两类:对已经训练好的网络进行压缩,直接训练小网络模型。

              4. 模型参数的数量决定了模型的大小,所谓的小型网络 指的是网络的参数数量较少。

                小型网络具有至少以下三个优势:

                WorkerPS 以及 WorkerWorker 之间的通信是神经网络分布式训练的重要限制因素。在分布式数据并行训练中,通信开销与模型的参数数量成正比。较小的模型需要更少的通信,从而可以更快的训练。

                当在tensorflow 等框架中训练好模型并准备部署时,需要将模型导出。如:将训练好的模型导出到自动驾驶汽车上。模型越小,则数据导出需要传输的数据量越少,这样可以支持更频繁的模型更新。

                FPGA 通常只有小于10MB 的片上内存,并且没有外部存储。因此如果希望在FPGA 上部署模型,则要求模型足够小从而满足内存限制。

              • 较小的模型可以在FPGA 和嵌入式硬件上部署。
              • 较小的模型在模型导出时开销更低。
              • 较小的模型具有更高效的分布式训练效率。

              9.1 SqueezeNet 系列

              9.1.1 SqueezeNet

              1. squeezenet 提出了Fire 模块,并通过该模型构成一种小型CNN 网络,在满足AlexNet 级别准确率的条件下大幅度降低参数数量。

              2. CNN 结构设计三个主要策略:

                其直觉是:在其它不变的情况下,尺寸大的feature map 具有更高的分类准确率。

                策略1、2 是关于在尽可能保持模型准确率的条件下减少模型的参数数量,策略3 是关于在有限的参数数量下最大化准确率。

              • 策略 1:部分的使用1x1 卷积替换3x3 卷积。因为1x1 卷积的参数数量比3x3 卷积的参数数量少了 9 倍。

              • 策略 2:减少3x3 卷积输入通道的数量。这会进一步降低网络的参数数量。

              • 策略 3:将网络中下采样的时机推迟到网络的后面。这会使得网络整体具有尺寸较大的feature map

              9.1.1.1 Fire 模块
              1. 一个Fire 模块由一个squeeze 层和一个expand 层组成。

              • squeeze 层:一个1x1 卷积层,输出通道数为超参数
              • 通常选择超参数 满足:

              • 它用于减少expand 层的输入通道数,即:应用策略2 。

              • expand 层:一个1x1 卷积层和一个3x3 卷积层,它们卷积的结果沿着深度进行拼接。

              • 1x1 卷积输出通道数为超参数 3x3 卷积输出通道数为超参数

              • 选择1x1 卷积是应用了策略1 。

              9.1.1.2 网络性能
              1. 网络设计:

              • SqueezeNet 从一个独立的卷积层(conv1)开始,后跟 8 个Fire 模块(fire2~9 ),最后连接卷积层conv10、全局平均池化层、softmax 输出层。
              • 从网络开始到末尾,每个Fire 模块的输出通道数逐渐增加。
              • conv1、fire4、fire8 之后执行最大池化,步长为2。这种相对较晚的执行池化操作是采用了策略3。
              • expand 层中的3x3 执行的是same 卷积,即:在原始输入上下左右各添加一个像素,使得输出的feature map 尺寸不变。
              • fire9 之后使用Dropout,遗忘比例为 0.5 。

            12. 网络参数:

              • (#1x1 squeeze) 列给出了超参数 (#1x1 expand) 列给出了超参数 (#3x3 expand) 列给出了超参数
              • 这四列给出了模型裁剪的参数。
              • # parameter before pruning 列给出了模型裁剪之前的参数数量。
              • # parameter after pruning 列给出了模型裁剪之后的参数数量。

            13. 模型性能:

            14. 可以看到,SqueezeNet 在满足同样准确率的情况下,模型大小比AlexNet 压缩了 50 倍。如果使用 Deep Compression 以及 6 bit 精度的情况下,模型大小比AlexNet 压缩了 510 倍。

              CNN 网络结构网络压缩方法数据类型模型大小模型压缩比例top-1 Accuracytop-5 Accuracy
              AlexNetNone32 bit240 MB1x57.2%80.3%
              AlexNetSVD32 bit48 MB5x56.0%79.4%
              AlexNetNetwork Pruning32 bit27 MB9x57.2%80.3%
              AlexNetDeep Compression5-8 bit6.9 MB35x57.2%80.3%
              SqueezeNetNone32 bit4.8 MB50x57.5%80.3%
              SqueezeNetDeep Compression8 bit0.66 MB363x57.5%80.3%
              SqueezeNetDeep Compression6 bit0.47 MB510x57.5%80.3%
                • 网络压缩方法列:给出了网络裁剪方法,包括SVD(Denton et al. 2014)Network pruning (Han et al. 2015b)Deep compression (Han et al. 2015a)
                • 数据类型列:给出了计算精度。
                • 模型压缩比例列:给出了模型相对于原始AlexNet 的模型大小压缩的比例。
                • top-1 Accuracy/top-5 Accuracy 列:给出了模型在ImageNet 测试集上的评估结果。
                a. 超参数设计
                1. 定义 为地一个fire 模块的输出通道数,假设每 fire 模块将fire 模块的输出通道数增加 。如:,则网络中所有fire 模块的输出通道数依次为:

                  因此第 i 个 fire 模块的输出通道数为: 。由于fire 模块的输出就是fire 模块中expand 层的输出,因此 e_i 也就是第 i 个 fire 模块中expand 层的输出通道数。

                  则有:第 i 个 fire 模块的 squeeze 层的输出通道数为

                • 定义 为所有fire 模块的expand 层中,3x3 卷积数量的比例。这意味着:不同fire 模块的expand 层中3x3 卷积数量的占比都是同一个比例。则有:

                • 第 i 个fire 模块的expand 层中的1x1 卷积数量

                • 第 i 个fire 模块的expand 层中的3x3 卷积数量

                • 定义 SR (squeeze ratio)为所有 fire 模块中,squeeze 层的输出通道数与expand 层的输出通道数的比例,称作压缩比。这意味着:不同fire 模块的压缩比都相同。

              1. 对于前面给到的SqueezeNet 有:

              2. 评估超参数 SR: ,SR 从 0.15~1.0

                在 SR=0.75 时,ImageNet top-5 准确率达到峰值 86.0% ,此时模型大小为 19MB 。此后进一步增加 SR 只会增加模型大小而不会提高模型准确率。



              3. 4.评估超参数 1%~99%

                3x3 卷积占比(相对于expand 层的卷积数量的占比)为 50% 时,ImageNet top-5 准确率达到 85.3% 。此后进一步增加3x3 卷积的占比只会增加模型大小而几乎不会提高模型准确率。




                b. 旁路连接
                1. 采用ResNet 的思想,可以在SqueezeNet 中添加旁路连接。下图中,左图为标准的SqueezeNet ,中图为引入简单旁路连接的SqueezeNet,右图为引入复杂旁路连接的SqueezeNet

                  它们在ImageNet 测试集上的表现:

                  模型结构top-1 准确率top-5 准确率model size
                  SqueezeNet57.5%80.3%4.8MB
                  SqueezeNet + 简单旁路连接60.4%82.5%4.8MB
                  SqueezeNet + 复杂旁路连接58.8%82.0%7.7MB

                  因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。

                • 简单旁路连接:就是一个恒等映射。此时要求输入feature map 和残差feature map 的通道数相等。
                • 复杂旁路连接:针对输入feature map 和残差feature map 的通道数不等的情况,旁路采用一个1x1 卷积来调整旁路的输出通道数。


                9.1.2 SqueezeNext

                1. 现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,SqueezeNext 针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。
                9.1.2.1 SqueezeNext Block
                1. SqueezeNext 块是在Fire 块的基础进行修改:

                • expand 层的3x3 卷积替换为1x3 + 3x1 卷积,同时移除了 expand 层的拼接 1x1 卷积、添加了1x1 卷积来恢复通道数。
                • 通过两阶段的 squeeze 得到更激进的通道缩减,每个阶段的squeeze 都将通道数减半。


              4. SqueezeNext 块也采用类似ResNet 的旁路连接,从而可以训练更深的网络。

                下图中,左图为 ResNet 块,中图为 SqueezeNetFire 块,右图为SqueezeNext 块。



              5. 9.1.2.2 网络性能
                1. 网络结构:如下为一个23层的SqueezeNext 网络(记做SqueezeNext-23)。

                • 相同颜色的SqueezeNext 块具有相同的输入feature map 尺寸和通道数。
                • 该网络结构描述为[6,6,8,1] ,意思是:在第一个conv/pooling 层之后有四组SqueezeNext 块,每组SqueezeNext 分别有6个、6个、8个、1个 SqueezeNext 块。
                • 在全连接层之前插入一个1x1 卷积层来降低全连接层的输入通道数,从而大幅降低全连接层的参数数量。

                • 23层SqueezeNext 网络的另一种结构(记做SqueezeNext-23v5):结构描述为[2,4,14,1] 。

              6. SqueezeNext网络在ImageNet 上的预测准确率:

                模型top-1 准确率top-5 准确率参数数量(百万)参数降低倍数
                AlexNet57.10%80.30%60.91x
                SqueezeNet57.50%80.30%1.251x
                SqueezeNext-2359.05%82.60%0.7284x
                G-SqueezeNext-2357.16%80.23%0.54112x
                SqueezeNext-3461.39%84.31%1.061x
                SqueezeNext-4462.64%85.15%1.251x
                • 参数降低倍数是相对于AlexNet 网络的参数而言。
                • G-SqueezeNext-23SqueezeNext-23 采用分组卷积的版本。
              7. 更宽和更深版本的SqueezeNext网络在ImageNet 上的预测准确率:

                模型top-1 准确率top-5 准确率参数数量(百万)
                1.5-SqueezeNext-2363.52%85.66%1.4
                1.5-SqueezeNext-3466.00%87.40%2.1
                1.5-SqueezeNext-4467.28%88.15%2.6
                VGG-1968.50%88.50%138
                2.0-SqueezeNext-2367.18%88.17%2.4
                2.0-SqueezeNext-3468.46%88.78%3.8
                2.0-SqueezeNext-4469.59%89.53%4.4
                MobileNet67.50%(70.9%)86.59%(89.9%)4.2
                2.0-SqueezeNext-23v567.44%(69.8%)88.20%(89.5%)3.2
                • 1.5/2.0 分别表示将网络拓宽1.5/2 倍。拓宽指的增加网络的feature map 的通道数,做法是增加第一个conv 的输出通道数。
                • 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
              8. 硬件仿真结果:

                • 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。

                • Time 表示模型的推断时间(相对耗时),Energy 表示模型的推断功耗。

                • 8x8,32KB16x16,128KB 表示仿真硬件的配置:

                • NxN 表示硬件具有NxNPE 阵列。processing element:PE 是单个计算单元。
                • 32KB/128KB 表示全局缓存。


                1. 深度可分离卷积的计算密集性较差,因为其计算/带宽 比例较低,所以在某些移动设备上表现较差。

                  一个可分离卷积的计算需要多次 IO 和计算才能完成,相比而言普通卷积只需要一次IO 和计算。

                9.2 MobileNet 系列

                9.2.1 MobileNet

                1. MobileNet 应用了Depthwise 深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。

                2. MobileNet 不仅产生了小型网络,还重点优化了预测延迟。

                  与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大。

                9.2.1.1 深度可分离卷积
                1. 对于传统的卷积层,单个输出feature 这样产生:

                  这里不同位置处的通道加权和的权重不同,这意味着在空间相关性的基础上,叠加了通道相关性。

                  Depthwise 深度可分离卷积打破了空间相关性和通道相关性的混合:

                  这里不同位置处的通道加权和的权重都相同,这意味着这一步仅仅考虑通道相关性。

                • 首先由一组滤波器对输入的各通道执行滤波,生成滤波feature 。这一步仅仅考虑空间相关性。

                • 然后执行1x1 卷积来组合不同滤波feature

                • 首先由一组滤波器对输入的各通道执行滤波,生成滤波feature 。这一步仅仅考虑空间相关性。

                • 然后计算各通道的滤波feature 的加权和,得到单个feature

              9. 假设:输入 feature map 是一个尺寸为 、输入通道数为 的张量 ,输出feature map 是一个尺寸为 、输出通道数为 的张量 。假设核张量为 ,其形状为

                则对于标准卷积过程,有: 。其中:i 为输入通道的索引;j 为输出通道的索引;m, n为空间索引, 分别为对应空间方向上的遍历变量。

                其参数数量为: ;其计算代价为:

              10. depthwise 深度可分离卷积中,假设核张量为 ,其形状为: 。则对于 depthwise 深度可分离卷积过程:

                其参数数量为:

                其参数数量为:;其计算代价为:

                总的计算代价为: ,约为标准卷积的

                通常卷积核采用3x3 卷积,而 ,因此depthwise 卷积的参数数量和计算代价都是常规卷积的

                • 总的参数数量为:,约为标准卷积的
                • 然后对每个通道得到的滤波feature 执行1x1卷积,有: 。其中 1x1 卷积的核张量。
                • 首先对输入的各通道执行滤波,有: 。输出尺寸为 、输出通道数为
              11. 常规卷积和Depthwise可分离卷积的结构区别(带BNReLU ):(左图为常规卷积,右图为Depthwise 可分离卷积)



              12. 9.2.1.2 网络结构


                1. MobileNeet 网络结构如下表所示。其中:

                • Conv 表示标准卷积,Conv dw 表示深度可分离卷积。
                • 所有层之后都跟随BNReLU (除了最后的全连接层,该层的输出直接送入到softmax 层进行分类)。


              13. MobileNet 大量的参数和计算量都被消耗在 1x1 卷积上:

                层类型乘-加运算参数数量
                Conv 1x194.86%74.59%
                Conv DW 3x33.06%1.06%
                Conv 3x31.19%0.02%
                全连接层0.18%24.33%
                • Conv 1x1 包含了所有的1x1 卷积层,包括可分离卷积中的1x1 卷积。
                • Conv DW 3x3 仅包括可分离卷积中的 3x3 卷积。
              14. 与训练大模型相反,训练MobileNet 时较少的采用正则化和数据集增强技术,因为MobileNet 是小模型,而小模型不容易过拟合。

                论文特别提到:在depthwise 滤波器上使用很少或者不使用 L2 正则化,因为它们的参数很少。

              15. 9.2.1.3 宽度乘子 & 分辨率乘子
                1. 尽管基本的MobileNet 架构已经很小,延迟很低,但特定应用需要更快的模型。为此MobileNet 引入了两个超参数:宽度乘子、分辨率乘子

                2. 宽度乘子width multiplier ,记做 。其作用是:在每层均匀的缩减网络(实际上是减小每层网络的输入、输出 feature map 的通道数量)。

                  这可以通过直接调整第一层的输出通道数来实现。

                • 它大概以 的比例减少了参数数量,降低了计算量。

                • 通常将其设置为:0.25、0.5、0.75、1.0 四档。

                • 宽度乘子应用于第一层(是一个全卷积层)的输出通道数上。这也影响了后续所有Depthwise可分离卷积层的输入feature map 通道数、输出feature map通道数。
              16. 分辨率乘子resolution multiplier,记做 \rho 。其作用是:降低输出的feature map 的尺寸。

                这可以通过直接调整网络的输入尺寸来实现。

                • 它不会改变模型的参数数量,但是大概以 的比例降低计算量。
                • 分辨率乘子应用于输入图片上,改变了输入图片的尺寸。这也影响了后续所有Depthwise可分离卷积层的输入feature map 尺寸、输出feature map 尺寸。
              17. 如果模型同时实施了宽度乘子和分辨率乘子,则模型大概以 的比例减少了参数数量,大概以 的比例降低了计算量。

                假设输入feature map 尺寸为14x14,通道数为 512 ;卷积尺寸为3x3 ;输出feature map 尺寸为14x14,通道数为512

                层类型乘-加操作(百万)参数数量(百万)
                常规卷积4622.36
                深度可分离卷积52.30.27
                =0.75 的深度可分离卷积29.60.15
                =0.75,\rho=0.714 的深度可分离卷积15.10.15
              18. 9.2.1.4 网络性能
                1. 常规卷积和深度可分离卷积的比较:使用深度可分离卷积在ImageNet 上只会降低 1% 的准确率,但是计算量和参数数量大幅度降低。

                  模型ImageNet Accuracy乘-加操作(百万)参数数量(百万)
                  常规卷积的MobileNet71.7%486629.3
                  MobileNet70.6%5694.2
                2. 更瘦的模型和更浅的模型的比较:在计算量和参数数量相差无几的情况下,采用更瘦的MobileNet 比采用更浅的MobileNet 更好。

                  模型ImageNet Accuracy乘-加操作(百万)参数数量(百万)
                  更瘦的MobileNet68.4%3252.6
                  更浅的MobileNet65.3%3072.9
                • 更瘦的模型:采用 =0.75 宽度乘子( 表示模型的通道数更小)。
                • 更浅的模型:删除了MobileNet5x Conv dw/s 部分(即:5层 feature size=14x14@512 的深度可分离卷积)。
              19. 不同宽度乘子的比较:随着 降低,模型的准确率一直下降( 表示基准 MobileNet)。

                with multiplierImageNet Accuracy乘-加 操作(百万)参数数量(百万)
                1.070.6%5694.2
                0.7568.4%3252.6
                0.563.7%1491.3
                0.2550.6%410.5
                • 输入分辨率:224x224。
              20. 不同分辨率乘子的比较:随着 的降低,模型的准确率一直下降( 表示基准MobileNet)。

                resolutionImageNet Accuracy乘-加 操作(百万)参数数量(百万)
                224x22470.6%5694.2
                192x19269.1%4184.2
                160x16067.2%2904.2
                128x12864.4%1864.2
                • 宽度乘子:1.0 。
                • 对应 对应 对应 对应
              21. 根据 和 分辨率为 {224,192,160,128} 两两组合得到 16 个模型。

                • 绘制这16个模型的accuracy 和计算量的关系:近似于 log 关系,但是在 有一个显著降低。



                • 绘制这16个模型的accuracy 和参数数量的关系:



              22. MobileNet 和其它模型的比较:

                模型ImageNet Accuracy乘-加 操作(百万)参数数量(百万)
                1.0 MobileNet-22470.6%5694.2
                GoogleNet69.8%15506.8
                VGG 1671.5%15300138
                0.50 MobileNet-16060.2%761.32
                Squeezenet57.5%17001.25
                AlexNet57.2%72060
                • MobileNetVGG 16 准确率相近,但是模型大小小了32倍,计算量小了27倍。
                • 瘦身的MobileNet(宽度乘子 ,分辨率乘子 )和 Squeezenet 模型大小差不多,但是准确率更高,计算量小了 22 倍。




                 

                 Logic 

                OR

                http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/5_CNN_1_classfication.html



                往期精彩回顾




                Python社区是高质量的Python/Django开发社区
                本文地址:http://www.python88.com/topic/132078
                 
                967 次点击