zoukankan      html  css  js  c++  java
  • 【MSDNet】2018-ICLR-Multi-Scale Dense Networks for Resource Efficient Image Classification-论文阅读

    MSDNet

    2018-ICLR-Multi-Scale Dense Networks for Resource Efficient Image Classification

    来源:ChenBong 博客园


    Introduction


    Motivation

    样本难度分布不均:数据集中存在极少量hard样本,导致如果需要整体提高准确率需要使用超大的网络来进行分类,如下图中2张马的样本,左边是eazy的马,右边是hard的马;而超大的网络会为了分类极少数hard样本,而在大多数eazy样本数浪费非常多的算力。

    image-20200729172954652

    样本难度分布不均带来2个问题:

    • 用大网络,在大多数eazy样本上浪费计算量
    • 用小网络,在少数的hard样本上得不到准确结果

    能否让网络自动调整大小,在遇到eazy样本时,使用小网络;遇到hard样本时使用大网络?

    即静态网络=>动态网络


    Contribution

    • 根据样本难度,一个单一的MSDNet网络可以自动调整大小,在遇到eazy样本时(或者计算资源有限时),使用小网络;遇到hard样本时(或者计算资源充足时)使用大网络

    Method

    网络设计

    一个直观的想法是early-exit,即在网络的不同层添加多个分类器,但存在以下问题:

    • cnn不同层提取的特征是不同的,前面的层提取细尺度特征,后面的层提取粗尺度特征
    1. 因此如果在前面的层添加分类器的话,接受的是细尺度特征,使得前面层的分类器难以准确分类

    2. 在前面的层添加分类器(训练过程中loss的影响)还会迫使网络在前面的层就开始学习粗尺度特征,反而破坏了后面的层的学习,会损坏后面层的分类器的结果


    网络结构

    image-20200729175911477 image-20200729175510761
    • 图示说明:右图中,红色箭头是普通卷积(feature map维度不变),蓝色箭头是stride 卷积(feature map维度降低),虚线是identity连接,绿色框是分类器

    • 纵向是网络的一层,横向是网络不同的深度

    • 横向上(深度维度),使用的都是常规卷积,即保持feature map维度不变,s小的时候,分辨率都比较高,即保留了图片的细尺度特征

    • 纵向上(尺度维度),使用的都是stride 卷积,feature map维度不断减小,s大的时候,分辨率都比较低,即不断提取高级特征,以便于分类器分类,因此纵向的末尾都连接一个分类器,

    • 当 l 较小(层数较低)时,前面层的分类器也可以接收到粗尺度特征,即解决了第1个问题

    • 当 l 较大(层数较大)时,即使中间分类器破坏了前面层提取细尺度特征,由于稠密连接和s=1行的存在,依然存在细尺度=>粗尺度的路径,因此不会降低后面层分类器的分类效果,即解决了第2个问题

    • 引入稠密连接,即使本应该学习细尺度特征的低层


    MSDNet的两个模式

    1. anytime 模式,即每张图片的分类时间/计算开销是相同的,事先指定的,当时间耗尽/计算开销用完,网络停止,输出离停止的地方最近的分类器的结果
    2. batch budget 模式,一个batch 的图片的总时间/计算开销 是指定的,我们希望时间耗尽/计算开销用完时,整个batch 的平均分类准确率最高;这样就要求网络对eazy样本施加较少的计算量(在前面层退出),对hard样本施加更多的计算量(在后面层退出),可以通过设置置信度阈值,即某张图片的置信度达到阈值 (θ_k) (如0.8)时,就提前退出(early-exit)。

    (阈值 (θ_k) 可以通过总开销B,和batch大小N,计算出来,详见原文)


    网络优化

    我们可以感觉到 MSDNet 与传统的CNN相比还是有一些冗余的,比如

    1. 传统的CNN是逐层抽象的,细尺度的提取只存在与低层,而MSDNet中s小的层(图2,4中上面的行)都是在提取细尺度,能否减少细尺度的提取层,只用1,2个层提取细尺度,然后重复利用这些层的输出?
    2. 有一部分细尺度提取层是冗余的,其输出没有被当成其他层的输入(图2,4中右上角)

    我们采取一些,不断复用细尺度的提取层:

    image-20200729194405049

    感觉上有点像砍掉网络的右上角部分,减少冗余

    以下的实验用的还是原始的MSDNet。


    Experiments

    image-20200729175653168

    在不同网络中间层等距地加入分类器,对 中间分类器的影响 和 对最终分类器的影响

    左图,中间层插入分类器,对中间分类器的影响:

    • 横坐标,中间分类器插入的位置
    • 纵坐标,中间分类器 相对(未修改的原始网络)最终分类器的精度
    • 从左图可以看出,插入的中间分类器的位置越靠后,该中间分类器的精度越高,即后面的层的特征(粗尺度特征)更适合做分类

    右图,中间层插入分类器,对最终分类器的影响:

    • 横坐标同上
    • 纵坐标,最终分类器 相对(未修改的原始网络)最终分类器的精度
    • 从右图可以看出,对于ResNet来说,插入的中间分类器越靠前,对最终分类器的精度损害越大;对于DenseNet来说,中间插入分类器会导致最终分类器精度下降

    原因,在中间层引入分类器,会导致低层网络被迫学习用于分类的粗尺度(高级)的特征,由于DenseNet 和 MSDNet 引入的稠密连接,低层没有学到的细尺度特征,会在后面层继续学习,可以缓解低层特征被破坏的影响。


    image-20200729175721740

    图5说明:

    • 左图:anytime 模式
      • 横坐标为anytime模式中的每张图片的计算开销限制,即当给定的计算开销用完时,输出分类结果;纵坐标为分类精度,图中的数据点表示不同开销下的网络精度
      • Ensemble of ResNet/DenseNet (varying depth),指的是集成多个深度的ResNet/DenseNet,如ResNet-18/34/56/110...,先将图片输入到层数少的网络,如果置信度高于阈值则退出,否则将图片输入到更大一点的网络...(Ensemble有个缺点是会重复计算低尺度特征,浪费计算开销)
      • 可以看出,在不同的单张开销下,MSDNet的精度都远胜于 多个网络的集成
      • && 疑问,多个网络集成会浪费很多计算开销,和集成网络做比较似乎不太公平?
    • 右图:batch budget 模式
      • 横坐标为每张图片的平均开销(平均开销 = 总batch开销限制 / batch size,batch size相同时,平均开销相同等价于总 batch 开销相同);纵坐标为分类精度,图中数据点表示不同平均开销下,网络的精度
      • Ensemble of ResNet/DenseNet (all shallow),集成多个浅的ResNet/DenseNet,最终的分类取多个网络的平均
      • (ResNet^{MC}/DenseNet^{MC}) ,指的是在一个ResNet/DenseNet 的中间层加入多个分类器(multiple classifiers)
      • 可以看出,在不同的总 batch 开销下,MSDNet表现都较好

    image-20200729175735446

    图7说明:

    • 左图:batch budget模式在ImageNet数据集上的表现

      • 左边三条黑色实线表示三种不同深度的MSDNet
      • (&& 图中可以看出,足够深的MSDNet在低开销限制下的精度没有浅的MSDNet高,是否说明无法训练一个足够深的网络,满足所有计算要求?)
      • 蓝色/红色实线:Early-exit ensemble of ResNet/DenseNet应该就是图5中的 Ensemble of ResNet/DenseNet (varing depth)
      • 蓝色/红色虚线:不同规模的ResNets/DenseNet(因此是离散的点)
    • 右图:batch budget模式在CIFAR-100数据集上的表现


    image-20200729175759433

    图6说明:

    • 上:eazy样本
    • 下:hard样本

    Conclusion

    两个设计原则

    • 在网络全程生成和维护粗尺度特征 => 可以在浅层引入中间分类器
    • 密集连接 => 多个分类器不会互相干扰(中间分类器不会影响后面的分类器)

    一个网络开销可变,并且在不同开销下的表现都超越传统网络


    Summary

    Reference

    https://www.shuzhiduo.com/A/qVdeWkb8JP/#%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96

  • 相关阅读:
    DIV指令一般用法
    "Programming"和"Programming"是同一个"Programming"吗?
    对5个国家的名称进行排序详细解析
    Hello World程序
    用 select 实现多选
    浅谈HTTP中Get与Post的区别
    ligerUI 下拉框表格(多选)
    LigerUI自带弹窗返回值例子
    LigerUI Grid服务端分页技术
    jQuery LigerUI 插件介绍及使用之ligerGrid
  • 原文地址:https://www.cnblogs.com/chenbong/p/13404909.html
Copyright © 2011-2022 走看看