Zhuang Liu主页:https://liuzhuang13.github.io/

Learning Efficient Convolutional Networks through Network Slimming: https://arxiv.org/pdf/1708.06519.pdf

后续出了:Rethinking the Value of Network Pruning (Pytorch) (ICLR 2019),https://github.com/Eric-mingjie/rethinking-network-pruning/

转载:https://zhuanlan.zhihu.com/p/39761855  https://blog.csdn.net/u011995719/article/details/78788336

核心思想(利用BN放缩因子来修剪Channel)

将预训练好的网络删减掉一些Channel(再fine-tuning),让模型参数减少的同时,还能让准确率维持不变(或精度损失很少)。

那问题来了:

  • 1)那它是以什么准则来删减Channel?
  • 2)总体训练步骤是什么?
  • 3)效果如何?优缺点是?
  • 4)类似相关工作有哪些?

论文方法从BN中得到启发。我们回顾下BN:其中  表示mini-batch B中某feature map的均值,scale  和 shift  都是通过反向传播训练更新。

这么看来,可以直接用  来评估channel的重要程度。  的数越小,说明该channel的信息越不重要,也就可以删减掉该Channel。虽然可以通过删减  值接近零的channel,但是一般情况下,  值靠近0的channel还是属于少数。于是作者采用smooth-L1 惩罚  ,来让  值倾向于0。那么网络的损失函数就可设计为:

其中  是训练的输入和目标,  是可训练的权重,  是引导稀疏的惩罚函数,  作为这两项的调整。 文中选择  ,当然也可以采用Smooth_L1方法在零点为光滑曲线。

Tips:
a) 论文中提到Smooth-L1时,引用的是:2007_Fast optimization methods for l1 regularization: A comparative study and two new approaches.
b) 而2015_Fast R-CNN 提出了 Smooth-L1 公式为:

c) 作者源码采用的不是Fast R-CNN提出的SmoothL1. 可以看下 论文提供的源码https://github.com/Eric-mingjie/rethinking-network-pruning/

接下来我们看看训练过程(非常简明的步骤):

  • 第一步:初始化网络;
  • 第二步:加入Channel稀疏惩罚项,训练网络;
  • 第三步:通过固定阈值来删减channel,如删减70%的channel;
  • 第四步:Fine-tune。由于删减channel后精度会下降,故再训练去微调网络;
  • 第五步:可以再跳到第二步,实现多次精简网络;
  • 第六步:得到精简后的网络。

具体操作细节:
γ通常取 1e-4或者1e-5,具体情况具体分析,
γ得出后,应该怎么剪,γ多小才算小? 这里采用与类似PCA里的能量占比差不多,将当前层的γ全都加起来,然后按从大到小的顺序排列,选取较大的那一部分,通常选取70%左右(具体情况具体分析)。

λ的选取对γ的影响如图所示:

λ为0的时候,目标函数不会对γ进行惩罚,λ等于1e-5时,可以发现,γ=0.0+的有450多个,整体都向0靠近。当λ=1e-4时,对γ有了更大的稀疏约束了,可以看到有接近2000个γ是在0.0x附近。

剪枝百分比: 剪得越多,模型越小;剪得太多,精度损失。这是矛盾的,所以作者做了实验对比,看看剪多少合适。实验发现,当剪枝超过80%,精度会下降。

具体实验请阅读原文,其中涉及了vgg,resnet-164(pre-actionvation),densenet-40。效果都很好,不仅压缩模型大小,提升运算速度,还能提升分类准确率。

对剪枝的程度没有先验知识的指导。论文是把所有通道的γ 值做了排序,选择砍掉一定比例的γ,但是这个比例会因为具体的模型、具体的任务而变化很大。在我的项目中,剪枝3轮,每轮剪枝20%,对精度无影响;如果每轮剪枝30%,对精度有很大影响。也就是说不能自动的将模型压缩到最紧凑,二是靠“试”。

本人已经基于此方法在MobileNetV2-ssdlite上验证成功,精度不减的情况下,模型压缩50%左右,速度能够提升近1倍,代码即将开源。

模型压缩-Learning Efficient Convolutional Networks through Network Slimming的更多相关文章

  1. [论文理解] Learning Efficient Convolutional Networks through Network Slimming

    Learning Efficient Convolutional Networks through Network Slimming 简介 这是我看的第一篇模型压缩方面的论文,应该也算比较出名的一篇吧 ...

  2. 论文翻译:2020_WaveCRN: An efficient convolutional recurrent neural network for end-to-end speech enhancement

    论文地址:用于端到端语音增强的卷积递归神经网络 论文代码:https://github.com/aleXiehta/WaveCRN 引用格式:Hsieh T A, Wang H M, Lu X, et ...

  3. 【论文翻译】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文链接:https://arxi ...

  4. [论文理解] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications Intro MobileNet 我 ...

  5. 深度学习论文翻译解析(十七):MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    论文标题:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文作者:Andrew ...

  6. 论文笔记之:Learning Multi-Domain Convolutional Neural Networks for Visual Tracking

    Learning Multi-Domain Convolutional Neural Networks for Visual Tracking CVPR 2016 本文提出了一种新的CNN 框架来处理 ...

  7. [论文阅读] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications (MobileNet)

    论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 本文提出的模型叫Mobi ...

  8. 论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)

    论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications MobileNet由Go ...

  9. 深度学习论文翻译解析(六):MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications

    论文标题:MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications 论文作者:Andrew ...

随机推荐

  1. 06_Hive分桶机制及其作用

    1.Clustered By 对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分. Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后 ...

  2. 嵌入式Linux应用开发完全手册读书笔记——常用的命令

    嵌入式开发中常用的命令 grep命令 用法:grep [option] PATTERN [FILE...] 例如: 在内核目录下查找包含"request_irq"字样的文件 gre ...

  3. 在springmvc框架中,通过ajax请求,响应至前端的中文显示是?

    今天遇到的一个问题,我通过ajax请求去访问控制器,然后通过控制器给我响应了一段json数据,但是里面的中文 在浏览上显示是??,我在web.xml 文件中是设置了编码过滤器的,但是估计这个编码过滤器 ...

  4. Caffe---自带工具进行网络结构(xxx.prototxt)可视化

    Caffe---自带绘图工具(draw_net.py)绘制网络结构图(xxx.prototxt) 目录: 一,安装依赖库. 二,draw_net.py使用说明. 正文: 一,安装依赖库. 在绘制之前, ...

  5. Python MySQL 数据库连接不同方式

    PyMySQL 驱动连接 什么是 PyMySQL?PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 P ...

  6. solr 分面搜索(转载)

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/52199347 分面搜索(Faceting)基于索引词项对搜索结果进行分类,同时返回每个分 ...

  7. linux 没有界面内容显示不全解决办法

    1.管道 管道简单理解就是,使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推.利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的 ...

  8. iotop命令详解

    iotop是top和iostat程序的混合体,能够显示系统中所有运行进程并将进程根据I/O统计信息排序. 这个软件使用了Linux内核的一些新特性,所以需要2.6.20或者更新的内核. 一般默认情况下 ...

  9. css3 制作圆环进度条

    引子 移动端做一个 loadiing 加载的图标,跟以往沿用的都不太一样,是一个圆环进度条,圆环进度条也就罢了,还得能用百分比控制. CSS3 实现圆环 demo 刚开始写这个圆环的时候是参照帖子上给 ...

  10. 关于datagridview控件如何动态改变行数问题

    首先要把单元格转换成txt文本框然后根据TextChanged事件来进行修改就可以实现 private void Return_DGV_EditingControlShowing(object sen ...