paper:Learning Efficient Convolutional Networks through Network Slimming
这是一篇做剪枝的paper,2017的ICCV文章。
主要亮点在于直接使用BN层的gamma参数进行剪枝评估。在卷积核的级别做剪枝,非常方便好用。
问题:
这篇paper中,Lamda的选择标准和阈值标准没有给出,应该就是作者实验试出来的。
因此,lamda能不能通过网络学习得到呢,这样其实更实用。
Idea
先看Batch Norm(BN):
上图是剪枝的示意图,可以看到,是在卷积核层面进行的剪枝。
一般情况下的网络剪枝是通过额外增加一些对原网络层的计算,得到卷积层的重要性信息。
Network Slimming:想法比较巧妙,通过BN层gamma参数进行重要性评估。(每一个channel有一个gamma值,作者认为gamma值反映了该通道的重要性)。
剪枝的过程就是将小的值对应的卷积核减掉。
如上图,橙色对应的部分会被剪枝掉。
因此呢,非常重要的就是gamma参数的选择过程了!
gamma参数
上图表示了gamma参数的分布情况。
图一为对gamma参数不做任何限制,分布比较分散,直接剪枝影响网络性能。
图2和3分别表明,在使用不同的lambda进行L1 norm的情况。约束的情况是不同的。
,g(s) = |s|
作者在损失函数中增加了BN层gamma参数的L1正则化。Lamda代表加入的损失的权重值。
剪枝完成后做fine-tune。迭代进行。微调过程如下:
Prune
整个fine tune的示意图如下所示:
具体步骤如下:
1、导入initial network
2、通过修订的损失函数训练,训练到一定准确率后根据gamma参数和要剪枝的比率计算阈值thresh。
3、将低于thresh的卷积核剪枝。
4、fine-tune一定的epoch,使map等参数升高。
重复进行234步骤,使网络达到较好的性能
Experiment
在CIFAR-10和CIFAR-100在分类上的实验结果。
压缩和加速效果比较明显
现有问题
除了前面所说的lambda参数的学习外,感觉还有这么一点问题:
针对卷积核的剪枝,其实非常有效的可以减少运算量。但是我们想要实现的硬件芯片中时,应该如何做呢。
这样没有block化的模块,应该如何设计和应用,也是目前的一个问题。