点击上方“计算机视觉life”,选择“星标”
快速获得最新干货
深度学习模型压缩与加速是学术界和工业界都非常关注的研究领域之一,最近,计算机视觉life公众号一个热心读者做了一个基于pytorch做模型压缩的代码库,对该领域的研究者非常有用,在此介绍给大家。GitHub地址(文末点阅读原文即可跳转)
https://github.com/666DZY666/model-compression
目前已经有170+ star,欢迎大家 watch,star,fork。
model-compression
"目前在深度学习领域分两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了追求更高的性能;另一派为工程派,旨在将算法更稳定、高效的落地在硬件平台上,效率是其追求的目标。复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。所以,卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,深度学习模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一"
项目简介
基于pytorch实现模型压缩(1、量化:8/4/2 bits(dorefa)、三值/二值(twn/bnn/xnor-net);2、剪枝:正常、规整、针对分组卷积结构的通道剪枝;3、分组卷积结构;4、针对特征A二值的BN融合)
目前提供
- 2、权重W和特征A的训练中量化, W(32/8/4/2bits, 三/二值) 和 A(32/8/4/2bits, 三/二值)任意组合
- 3、针对三/二值的一些tricks:W二值/三值缩放因子,W/grad(ste、saturate_ste、soft_ste)截断,W三值_gap(防止参数更新抖动),W/A二值时BN_momentum(<0.9),A二值时采用B-A-C-P可比C-B-A-P获得更高acc
- 4、多种剪枝方式:正常剪枝、规整剪枝(比如model可剪枝为每层剩余filter个数为N(8,16等)的倍数)、针对分组卷积结构的剪枝(剪枝后仍保证分组卷积结构)
- 5、batch normalization的融合及融合前后model对比测试:普通融合(BN层参数 —> conv的权重w和偏置b)、针对特征A二值的融合(BN层参数 —> conv的偏置b)
代码结构

环境要求
使用
量化
W(FP32/三/二值)、A(FP32/三/二值)
--W --A, 权重W和特征A量化取值
cd WbWtAb
python main.py --W 2 --A 2
python main.py --W 2 --A 32
python main.py --W 3 --A 2
python main.py --W 3 --A 32
W(FP32/8/4/2 bits)、A(FP32/8/4/2 bits)
--Wbits --Abits, 权重W和特征A量化位数
cd WqAq
python main.py --Wbits 8 --Abits 8
python main.py --Wbits 4 --Abits 8
python main.py --Wbits 4 --Abits 4
剪枝
稀疏训练 ——> 剪枝 ——> 微调
cd prune
正常训练
python main.py
稀疏训练
-sr 稀疏标志, --s 稀疏率(需根据dataset、model情况具体调整)
python main.py -sr --s 0.0001
python main.py -sr --s 0.001
剪枝
--percent 剪枝率, --normal_regular 正常、规整剪枝标志及规整剪枝基数(如设置为N,则剪枝后模型每层filter个数即为N的倍数), --model 稀疏训练后的model路径, --save 剪枝后保存的model路径(路径默认已给出, 可据实际情况更改)
python normal_regular_prune.py --percent 0.5 --model models_save/nin_preprune.pth --save models_save/nin_prune.pth
python normal_regular_prune.py --percent 0.5 --normal_regular 8 --model models_save/nin_preprune.pth --save models_save/nin_prune.pth
或
python normal_regular_prune.py --percent 0.5 --normal_regular 16 --model models_save/nin_preprune.pth --save models_save/nin_prune.pth
python gc_prune.py --percent 0.4 --model models_save/nin_gc_preprune.pth
微调
--refine 剪枝后的model路径(在其基础上做微调)
python main.py --refine models_save/nin_prune.pth
剪枝 —> 量化(注意剪枝率和量化率平衡)
剪枝完成后,加载保存的模型参数在其基础上再做量化
剪枝 —> 量化(8/4/2 bits)(剪枝率偏大、量化率偏小)
cd WqAq
python main.py --Wbits 8 --Abits 8 --refine ../prune/models_save/nin_refine.pth
python main.py --Wbits 8 --Abits 8 --refine ../prune/models_save/nin_gc_refine.pth
剪枝 —> 量化(三/二值)(剪枝率偏小、量化率偏大)
cd WbWtAb
python main.py --W 2 --A 2 --refine ../prune/models_save/nin_refine.pth
python main.py --W 2 --A 2 --refine ../prune/models_save/nin_gc_refine.pth
BN融合
cd WbWtAb/bn_merge
--W 权重W量化取值(据训练时W量化(FP/三值/二值)情况而定)
融合并保存融合前后model
python bn_merge.py --W 2
或
python bn_merge.py --W 3
融合前后model对比测试
python bn_merge_test_model.py
模型压缩数据对比(示例)
注:可在更冗余模型、更大数据集上尝试其他组合压缩方式

后续扩充
- 3、部署(1、针对4bits/三值/二值等的量化卷积;2、终端DL框架(如MNN,NCNN,TensorRT等))
GitHub地址(文末点阅读原文即可跳转)
https://github.com/666DZY666/model-compression
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、检测分割识别、三维视觉、医学影像、GAN、自动驾驶、计算摄影、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

投稿、合作也欢迎联系:simiter@126.com

长按关注计算机视觉life
推荐阅读
最全综述 | 医学图像处理
最全综述 | 图像分割算法
最全综述 | 图像目标检测
目标检测技术二十年综述
现在投身于计算机视觉是否明智?
如何激怒一个自动驾驶(无人驾驶、智能汽车)爱好者?
原来CNN是这样提取图像特征的。。。
计算机视觉方向简介 | 人体骨骼关键点检测综述
计算机视觉方向简介 | 人脸识别中的活体检测算法综述
计算机视觉方向简介 | 目标检测最新进展总结与展望
计算机视觉方向简介 | 人脸表情识别
计算机视觉方向简介 | 人脸颜值打分
计算机视觉方向简介 | 深度学习自动构图
计算机视觉方向简介 | 基于RGB-D的3D目标检测
计算机视觉方向简介 | 人体姿态估计
最新AI干货,我在看 
点阅读原文即可跳转