1. 《Pruning Filters for Efficient ConvNets》

234 阅读2分钟

一、算法思想

  1. 计算每层每个filter的绝对值之和sjs_j,然后排序。
  2. 剪去具有最小sjs_j值的mm个filter及其对应的feature map。对应剪枝的feature map的下一个卷积层中的kernel也被移除。
  3. 为第ii层和第i+1i+1层创建新的kernel,并将剩余的kernel权重复制到新模型。

二、讨论

1. 单层敏感性分析

每层独立修剪(只对该层剪枝,其他层不进行剪枝),观察该层的敏感性:一些层是敏感的,并且剪枝之后更难恢复准确性。

图片.png

2. 多层filter剪枝策略

  • 独立剪枝:计算filter的绝对值之和时,会将前一层被移除的feature map所对应的kernel计算进去。
  • 贪婪剪枝:计算filter的绝对值之和时,不会将前一层被移除的feature map所对应的kernel计算进去。

图片.png

贪婪剪枝的方法不是局部最优,但属于整体最优。

3. 剪枝训练策略

  • 一次修剪和重新训练:一次性剪枝,反复训练恢复精度。当敏感层的一些filter被一次剪去后,可能无法恢复原始准确率。
  • 迭代地修剪和训练:剪一层训一下模型,迭代进行。结果更好但是耗时更长。

三、实验

1. 剪枝后重训练和剪枝后从头训练

  • 剪枝后重训练:剪枝后重训练的epochs < 剪枝之前训练的epochs
  • 剪枝后从头训练:剪枝后从头训所用的epoch = 剪枝之前训练的epochs

图片.png

实验结果报告了,剪枝后重训练比剪枝后从头训练的模型表现更好。

2. VGG16在CIFAR10上的实验

图片.png

展示出在剪枝率为34%时,每层被剪去了多少filters。

3. ResNet56/110在CIFAR10上的实验

图片.png

每层剪枝后的敏感性分析。

4. ResNet34在ImageNet2012上的实验

图片.png

每层剪枝后的敏感性分析。

5. 随机剪枝和剪除最大l1l_1范数的filter

图片.png

效果:剪除最小l1l_1范数的filter>随机剪枝>剪除最大l1l_1范数的filter