Channel Pruning for Accelerating Very Deep Neural Networks
已复现:https://github.com/onion-rain/MCTS:
python thinet_exp.py --arch vgg16_bn_cifar --gpu 5 --resume checkpoints/baseline/cifar10_vgg16_bn_cifar_best.pth.tar --prune-percent 0.3 --lp-norm 2 --method lasso
- 上图为两层卷积操作,通道剪枝是要将B减掉一些通道,即减掉第一层卷积的一些卷积核(虚线卷积),同第二层卷积W也要去掉相应通道(W中3个最小立方体块)
- 即寻找合适的β和w使得原C与B经过剪枝后得到的C'最相似,即使得下式最小
- β就是个向量,非0即1,1表示保留该通道,0表示删除该通道,β的L0范数就是β中非零元素个数要小于c(B的原通道数),也就是要减掉一些通道嘛
- F范数就是矩阵各元素绝对值平方的总和开方
- 将β的约束放到公式中,并且由于最小化L0范数是NP难题,遂用L1范数代替之:
-
- c是输入通道数,n是输出通道数
- W ==>n * c * kh * kw,就是卷积核
- X ==>N * c * kh * kw, 就是输入特征图。
- N原文为the number of samples,我的理解应该是每个特征图上卷积核卷积的次数,也就是新的特征图的height*wigth
- λ是惩罚系数,通过增大λ就可以最小化β
- bias term不在公式内
- wi的F范数等于1是用来约束w的唯一解,也就是要求所有卷积核的所有weight的F范数等于1
- 然后分两步反复迭代:
- 先固定W优化β:
- Z=XWT
- 再固定β优化W
- 优化过程中λ逐渐增大,每次增大λ我们就迭代上面两步使得β的L0范数稳定
- 直到满足β的约束β的L0范数小于c,停止增大λ
- 实际操作中我们发现1,2迭代太花费时间,于是我们先迭代步骤1使得β的L0范数小于c,再迭代步骤2一次,得到最终结果
- 对于多分支网络:
- 就是在分之后,residual分支前面加了个通道选择器
- 优化目标是最后residual分支和shortcut分支合并之后得到的特征图尽可能保持不变,即优化目标由Y2变成了Y1-Y'1+Y2