转载: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. ping加上时间信息

    一.linux系统ping加时间戳信息 1.ping 加时间信息,然后还要实时保存到一个文件中,那么就与awk结合 ping 115.239.211.112 -c 10 | awk '{ print ...

  2. AVL树(C++&Java)

    目录 AVL Tree精讲专题 前言 一.AVL Tree for CPP(Coding) 1.AVL树原型 2.旋转的四种方式 二.完整版AVL Tree的CPP和JAVA实现 AVL Tree C ...

  3. 基于栈的指令集与基于寄存器的指令集详细比对及JVM执行栈指令集实例剖析

    基于栈的指令集与基于寄存器的指令集详细比对: 这次来学习一些新的概念:关于Java字节码的解释执行的一种方式,当然啦是一些纯理论的东东,但很重要,在之后会有详细的实验来对理论进行巩固滴,下面来了解一下 ...

  4. C#串口图片传输以及对串口缓冲区的简单理解

    第一次接触串口,写点东西加深自己对串口的印象: 通过参考一些网上的实例,我明白了串口怎么简单的进行通信交流,但是我所需要的还是图片等大文件在串口中的传输,串口传输是通过二进制位进行单位传输的,所以传输 ...

  5. 2019牛客多校B generator 1——十进制快速幂

    题目 已知 $x_i = ax_i + bx_{i-1}$,求 $x_n \% MOD$.($1\leq n\leq 10^{(10^6)}$) 分析 写成矩阵快速幂的形式,相当于求转移矩阵的 $n$ ...

  6. 组件化网页开发 / 步骤二 · 2-11 jquery的ajax方法 以及下一章跨域没懂

    1,根据2-11课程老师的提示,自己封装 $.ajax 2,第三章,跨域,没看懂

  7. pyecharts v1 版本 学习笔记 折线图,面积图

    折线图 折线图 基本demo import pyecharts.options as opts from pyecharts.charts import Line c = ( Line() .add_ ...

  8. Activiti--Activity数据库

    23张表 ACT_RE_资源库流程规划表 act_re_deployment 部署信息表 act_re_model 流程设计模型部署表 act_re_procdef 流程定义数据表 ACT_RU_运行 ...

  9. 牛客练习赛39 B.选点

    链接:https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于 ...

  10. [Luogu] 区间统计Tallest Cow

    https://www.luogu.org/problemnew/show/P2879 差分 | 线段树 #include <iostream> #include <cstdio&g ...