模型压缩相关工作

总结的很好的一篇博客:https://blog.csdn.net/App_12062011/article/details/81665140

定点化:

    百度搜“模型压缩定点化”

    https://blog.csdn.net/u011961856/article/details/76736103

    http://fjdu.github.io/machine/learning/2016/07/07/quantize-neural-networks-with-tensorflow.html

    https://petewarden.com/2015/05/23/why-are-eight-bits-enough-for-deep-neural-networks/

基于量化的模型压缩

所谓量化,指的是减少数据在内存中的位数操作,例如,对于权重来说,如果大多数都在0附近,那么32位的浮点表示,其实是有很大浪费的。这一方向的研究,主要是8位类型来表示32位浮点(定点化),甚至直接训练低8位模型,二值模型。其作用不仅可以减少内存开销,同时,可以节省带宽,通过某些定点运算方式,甚至可以消除乘法操作,只剩加法操作,某些二值模型,直接使用位操作。当然,代价是位数越低,精度下降越明显。

一般情况下,采用8位定点运算表示,理论上,可以节省4倍内存,带宽,但是实际上,不是所有的模型参数,都可以定点化,这涉及到性能与加速的平衡。

但是 ,需要注意的是,如果你的模型本身够快,那么8位定点化操作, 可能没有加速或者甚至变慢,因为,浮点转定点,本身也是一笔开销。大量浮点运算是比较慢,但是,模型参数不是很大的情况下,这种慢的差别在现代编译器及硬件环境上几乎体现不出来的,甚至可能量化开销导致性能变慢。

剪枝:

Pruning Filters for Efficient Convnets

作者提出了基于量级的裁剪方式,用weight值的大小来评判其重要性,对于一个filter,其中所有weight的绝对值求和,来作为该filter的评价指标,将一层中值低的filter裁掉,可以有效的降低模型的复杂度并且不会给模型的性能带来很大的损失,算法流程如下:

算每个channel的绝对值,按从小到大排序不同channel,把绝对值最小的m个channel删除,并把相对应的下一层的channel也剪掉(这个相对应我还不知道怎么回事),你可以逐层剪枝再finetune,也可以所有层剪完再finetune

文章还分析了不同层剪枝的敏感度,234层敏感度高,个人觉得这几层是提基础特征,所以更加敏感,自己剪枝也主要再后面层;还有个原因前面层参数更少,越少的越剪性能就越差

An Entropy-based Pruning Method for CNN Compression

作者认为通过weight值的大小很难判定filter的重要性,通过这个来裁剪的话有可能裁掉一些有用的filter。因此作者提出了一种基于熵值的裁剪方式,利用熵值来判定filter的重要性。 作者将每一层的输出通过一个Global average Pooling将feature map转换为一个长度为c(filter数量)的向量,对于n张图像可以得到一个n*c的矩阵,对于每一个filter,将它分为m个bin,统计每个bin的概率,然后计算它的熵值 利用熵值来判定filter的重要性,再对不重要的filter进行裁剪。第j个feature map熵值的计算方式如下:

这篇论文的笔记:https://blog.csdn.net/u013082989/article/details/77943240

原文地址:https://www.cnblogs.com/ymjyqsx/p/9721614.html

时间: 2024-08-30 12:50:51

模型压缩相关工作的相关文章

yii中数据的"增删改查"相关工作!(此文比较乱,需细看)

使用findByPk()根据数据表主键查询的是对象,不需要使用foreach()循环出来 但是使用findall()和find()查询的是对象类型的数组需要使用foreach()循环出来 ======================================= public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCommand($sql); $query = $r

java线程内存模型,线程、工作内存、主内存

转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程有自己的工作内存 refreshing local memory to/from main memory must  comply to JMM rules 产生线程安全的原因 线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计算机,cpu在计算的时候,并不总是从内存读

常见压缩格式比对,及 Linux 下的压缩相关指令

可先浏览加粗部分 一.常见压缩档 *.zip | zip 程序压缩打包的档案: (很常见,但是因为不包含文档名编码信息,跨平台可能会乱码) *.rar | winrar 进程压缩打包的档案:(在windows上很常见,但是是商业软件.) *.gz | gzip 程序压缩的档案: (linux目前使用最广泛的压缩格式) *.bz2 | bzip2 程序压缩的档案: *.xz | xz 程序压缩的档案: *.tar | tar 程序打包的资料,并没有压缩过: *.tar.gz | tar 程序打包的

【模型压缩】蒸馏算法小结

模型压缩之蒸馏算法小结 原始文档:https://www.yuque.com/lart/gw5mta/scisva Google Slide: https://docs.google.com/presentation/d/e/2PACX-1vSsa5X_zfuJUPgxUL7vu8MHbkj3JnUzIlKbf-eXkYivhwiFZRVx_NqhSxBbYDu-1c2D7ucBX_Rlf9kD/pub?start=false&loop=false&delayms=3000 2019年09

通用卷积核用于模型压缩和加速

介绍一下最近看的一种通用卷积核用于模型压缩的方法,刚刚查了一下,原作者的博客在https://zhuanlan.zhihu.com/p/82710870 有介绍,论文传送门 https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks.pdf , github开源地址 https://github.com/huawei-noah/Versatile-

深度学习之模型压缩

一.背景 深度学习让计算机视觉任务的性能到达了一个前所未有的高度.但,复杂模型的同时,带来了高额的存储空间.计算资源消耗,使其很难落实到各个硬件平台. 为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗. 二.理论基础 必要性:目前主流的网络,如VGG16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务. 可行性:在深度卷积网络中,存在着大量冗余地节点,仅仅只有少部分(5-10%)权值参与着主要的计算,也就是说,仅仅训练小部分的

Chromium与CEF的多进程模型及相关参数

CEF基于Chromium,也是多进程模型.关于进程模型,参考这里:https://www.chromium.org/developers/design-documents/process-models.我还看到一篇韩国人写的renderer process的文章,也很不错,在这里:http://chromium-kr.blogspot.com/2012/06/about-renderer-process.html. CEF的进程模型,这里也有一部分描述:https://bitbucket.or

osi七层模型及相关协议

1.模型 物理层:将数据转换为可通过物理介质传送的电子信号 相当于邮局中的搬运工人.经过媒体传送比特,提供了机械和电器的规约.主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特.数据链路层:在此层将数据分帧,并处理流控制.本层 指定拓扑结构并提供硬件寻 址.相当于邮局中的装拆箱工人.定义了如何让格式化数据以进行传输,

个人日常linux相关工作问题汇总

--此篇博文记录自己学习Linux及Linux工作中遇到的各种故障及问题的汇总 一.CentOS6.5中安装Mysql后在建立mysql库时并初始化时出现错误提示: Installing MySQL system tables... ./bin/mysqld: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory 解决方案: 经