1. Learning Efficient Convolutional Networks through Network Slimming
论文地址:https://arxiv.org/abs/1708.06519
论文代码:https://github.com/talebolano/yolov3-network-slimming
博主运行sparsity_train.py 里面几处错误,稍加修改补充下可以运行。
神经网络模型虽然具有很强处理能力,但是其消耗的存储资源非常大,以ResNet-152来说,该网络的参数超过了60亿,需要200亿次的浮点运算[float-point-operations (FLOPs)],这就对应用在移动端,可穿戴设备和嵌入式物联网有很大难度,其不能负担如此庞大的存储资源和网络计算量。
文中指出限制模型部署硬件的主要问题是:
1.模型的大小,一般在300MB左右;
2.模型训练时的参数存储消耗, gpu就是运行占用显存
3.大量的浮点数计算,卷积运算导致手机端处理一张图可能需要几分钟
作者选用通道裁剪的原因如上篇论文一样,相比其他方法(包括低秩近似、网络量化和二值化、权值剪枝[、动态推理等)就是很高效,模型压缩的小。稀疏化操作适用于硬件又需要特定的存储方式,这不方便。如图看下本文简洁明了的操作:
这篇论文核心就是通过给BN层的缩放因子(scaling factors)进行L1正则化,将缩放因子稀疏化为0,BN每一个缩放因子对应前一层卷积层响应,如果某一卷积层通道对应的缩放因子为0,则该通道就可以剪枝掉 了。这个剪枝比例可以自己设置,剪枝之后错误率会有所降低,文章说可以通过fine-tune来得到补偿。缺点是全靠试,一般10%-30%,40%-60%的实验结果也ok,按照作者的意思。
文中更新总的损失函数为:
(x, y)表示输入和标签值,W表示训练权重、第一个求和对应正常训练的CNN的损失函数, g(·)是一个缩放因子稀疏通道的影响惩罚项, λ为平衡因子。 r缩放因子采用BN层的缩放因子:令g(r)=|r|
下图是训练方法:先训练稀疏通道—>通过比例因子剪枝------>微调之后训练------->更紧凑的模型
再没了,就这一个公式,文中算法简单暴力。。。。
测试结果如下图:作者裁剪比例最高70%
浮点运算量减少如图:
这个 调节稀疏化参数
λ
\lambda
λ和剪枝百分比结果图