转载:https://blog.csdn.net/u014380165/article/details/77763037

https://www.twblogs.net/a/5b8d02472b717718833929d6/zh-cn

GitHub网址:https://github.com/Roll920/ThiNet https://github.com/Roll920/ThiNet_Code
项目资料网址:http://lamda.nju.edu.cn/luojh/project/ThiNet_ICCV17/ThiNet_ICCV17_CN.html

论文:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression - ICCV2017
论文链接:https://arxiv.org/abs/1707.06342

论文:ThiNet: Pruning CNN Filters for a Thinner Net - TPAMI2018

框架的流程图如上Figure1,第一行是filter selection,选择的依据是:如果我们可以用第i+1层的输入channel的一个子集作为第i+1层的输入且近似得到第i+1层的输出,那么这个子集以外的channel就可以去掉了,因为第i+1层的一个输入channel对应第i层的一个filter(卷积核),因此去掉第i+1层的channel同时也就可以去掉第i层的filter。第二行是prune,将第一步的weak channel和对应的前面一层的filter去掉,得到更窄(thin)的网络,这也是ThiNet名称的由来。第三行是Fine-tuning,这里为了节约时间,当对每一层做prune后,都fine-tune1到2个epoch,然后等所有层都prune后,再fine-tune多个epoch。因此整体上就是上面这三步迭代应用到每一层上,依次对每一层做prune。

去掉冗余filter做prune的研究还有很多,关键在于选择方式,比如计算filter的绝对值和,认为如果一个filter的绝对值和比较小,说明该filter并不重要,这种算法暂且叫Weight sum;还有计算激活层输出的feature map的值的稀疏程度,如果feature map的值很稀疏,也就是大部分值是0,那么该feature map对应的filter也是冗余的,可以去掉,这种算法暂且叫APoZ(Average Percentage of Zeros)。这两种压缩算法在后面的实验中都会提到。

效果:

在ILSVRC-12数据集上,在VGG16上能够降低3.31×的FLOPs,16.63×的网络参数,而top-5准确度下降仅为0.52%。
对于ResNet-50这样紧凑的网络,ThiNet也能减少超过一半的的参数与FLOPs,而top-5仅降低1%。
ThiNet能将VGG16网络模型剪枝到只有5.05MB的大小,保留AlexNet级别的精度,却拥有更强的泛化性能。
不同选择算法的性能比较:

通道选择(数据驱动):

为了确定哪个通道可以安全移除,将收集用于重要性评估的训练集。如图所示,由y表示的元素从张量(ReLU之前)中进行随机采样。

通常,带偏置项b的卷积计算如下:

现在,如果我们定义:

便能将上面公式简化为:

这里 y^=y−b。 若我们能够找到一个通道子集S⊂{1,2,…,C},使得下式

总是成立,那么我们便能不再依赖于任何c∉S的通道。因此,这些通道(及其对应的filter)便能在不改变CNN网络模型精度的前提下被安全移除。当然,上面的公式不可能对于所有的x^与y^总保持成立。但我们可以手动提取一部分训练样本,来计算一个使得上式近似正确的子集S。

一种用于通道选择的贪心算法:

给定m(m由图片数量与位置数量决定)个训练样本{(x^i,y^i)},原通道选择问题可以转化为如下的优化问题:

这里,|S|为子集S的元素数量,r为预定义的压缩率(即保留多少个通道)。令T为被移除的通道集合(S∪T={1,2,…,C} 同时 S∩T=∅),我们便能最小化另一等价优化目标:

求解公式是一个NP难的问题,因此我们提出了一种快速的贪心算法进行求解。

最小化重构误差:

在决定保留哪几个滤波器之后,我们可以通过对每一个通道赋予权重来进一步地减小重构误差。

上式可以通过普通的最小二乘法来求解。

算法步骤:

1.filter选择。
使用layer(i + 1)的输入中的一个通道子集来逼近layer(i + 1)中的输出,则其他通道可以安全地从layer(i + 1)的输入中移除。layer(i + 1)的输入中的一个通道由第i层中的一个filter产生,因此可以同时修剪第i层中的相应filter。
2.修剪。
3.微调。
4.重复步骤1修剪下一层。

注意事项:

1)对于VGG-16网络,由于前面10层卷积占据了90%的计算量,而全连接层又占据了86%的参数,因此作者采用对前面10层卷积层进行prune,达到加速目的,另外将所有全连接层用一个global average pooling层代替。
2)对于ResNet网络,作者采用只对一个block的前两层卷积做prune,而不动最后一个卷积层,如下图。

模型压缩-ThiNet的更多相关文章

  1. 模型压缩,模型减枝,tf.nn.zero_fraction,统计0的比例,等。

    我们刚接到一个项目时,一开始并不是如何设计模型,而是去先跑一个现有的模型,看在项目需求在现有模型下面效果怎么样.当现有模型效果不错需要深入挖掘时,仅仅时跑现有模型是不够的,比如,如果你要在嵌入式里面去 ...

  2. CNN 模型压缩与加速算法综述

    本文由云+社区发表 导语:卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一. 前言 自从AlexNet一举夺得 ...

  3. 【转载】NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩、机器学习及最优化算法

    原文:NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩.机器学习及最优化算法 导读 AI领域顶会NeurIPS正在加拿大蒙特利尔举办.本文针对实验室关注的几个研究热点,模型压缩.自 ...

  4. tensorflow 模型压缩

    模型压缩 为了将tensorflow深度学习模型部署到移动/嵌入式设备上,我们应该致力于减少模型的内存占用,缩短推断时间,减少耗电.有几种方法可以实现这些要求,如量化.权重剪枝或将大模型提炼成小模型. ...

  5. 【模型压缩】MetaPruning:基于元学习和AutoML的模型压缩新方法

    论文名称:MetaPruning: Meta Learning for Automatic Neural Network Channel Pruning 论文地址:https://arxiv.org/ ...

  6. 模型压缩-Learning Efficient Convolutional Networks through Network Slimming

    Zhuang Liu主页:https://liuzhuang13.github.io/ Learning Efficient Convolutional Networks through Networ ...

  7. 模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...

    近日,TensorFlow模型优化工具包又添一员大将,训练后的半精度浮点量化(float16 quantization)工具. 有了它,就能在几乎不损失模型精度的情况下,将模型压缩至一半大小,还能改善 ...

  8. 对抗性鲁棒性与模型压缩:ICCV2019论文解析

    对抗性鲁棒性与模型压缩:ICCV2019论文解析 Adversarial Robustness vs. Model Compression, or Both? 论文链接: http://openacc ...

  9. 模型压缩95%:Lite Transformer,MIT韩松等人

    模型压缩95%:Lite Transformer,MIT韩松等人 Lite Transformer with Long-Short Range Attention Zhanghao Wu, Zhiji ...

随机推荐

  1. PAT Advanced 1073 Scientific Notation (20 分)

    Scientific notation is the way that scientists easily handle very large numbers or very small number ...

  2. mongoDB的基本操作之数据更新

    查询了解后,我们还要了解下如何进行数据的更新,在mongodb中,数据的更新是用update方法,update至少接收两个参数,一个是要查找的记录条件,一个是更新之后的数据,我们现在查找x为1的数据 ...

  3. 将字符串s='ab34aa243dd78eww89' 处理为 '**34**243**78***89',然后对数字求和,结果为'**7**9**15***17'

    s='ab34aa243dd78eww89'#s='ab34aa000dd78eww89' #方法1: result='' for i in s: if i.isalpha(): result+='* ...

  4. Linux使用帮助详解

    主要内容:                    whatis                    command --help                     man and info   ...

  5. spring配置和映射文件

    配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www. ...

  6. 重置一发LCT模板

    加边.删边.单点修改.链上异或和 #include <bits/stdc++.h> using namespace std; inline void read(int &num) ...

  7. 在 Linux 下使用 scp 命令

    将文件或文件夹从网络上的一个主机拷贝到另一个主机当中去. here:在 Linux 下使用 scp 命令 摘要: scp 是安全拷贝协议(Secure Copy Protocol)的缩写, scp 是 ...

  8. SVN错误之“copy admin area is missing”

    1.将对应冲突的文件夹备份一份 2.再复制一份到别的地方,资源管理器搜索.svn全部删除掉 3.删掉本地svn目录里的冲突文件,update一下父目录,显示ok 4.把刚才删掉.svn的目录复制覆盖过 ...

  9. 出现错误时返回异常 MVC

    在使用MVC的时候,会出现异常提醒: 1,当在Controller出现错误的时候,我们可以直接返回,即return  view()返回视图. ViewBag.Msg("产品或赠品不存在&qu ...

  10. SIGAI机器学习第五集 贝叶斯分类器

    讲授贝叶斯公式.朴素贝叶斯分类器.正态贝叶斯分类器的原理.实现以及实际应用 大纲: 贝叶斯公式(直接用贝叶斯公式完成分类,计算一个样本的特征向量X属于每个类c的概率,这个计算是通过贝叶斯公式来完成的. ...