Overview

February 22, 2021 · View on GitHub

PaddleSlim提供以下内置剪裁方法。

序号剪裁方法支持静态图支持动态图支持敏感度分析支持自定义各层剪裁率
1FPGMFilterPruner
2L1NormFilterPruner
3L2NormFilterPruner
4SlimFilterPruner
5OptSlimFilterPruner

注:

  • 支持敏感度分析:意为是否支持通过各个层的敏感度分析来确定各个卷积层的剪裁率。

  • 支持自定义各层剪裁率:意为是否支持手动指定各个卷积层的剪裁率。

除了以上内置策略,PaddleSlim还支持用户自定义卷积通道剪裁策略,请参考:自定义卷积通道剪裁教程

各类方法效果对比

模型压缩方法精度(Top-1/Top-5)模型体积(MB)GFLOPsPaddleLite推理耗时
MobileNetV1Baseline70.99%/89.68%171.1166.052\35.8014\19.5762
MobileNetV1uniform + L1NormFilterPruner69.40%/88.66% (-1.59%/-1.02%)90.56(-50%)33.5636\18.6834\10.5076
MobileNetV1sensitive + L1NormFilterPruner70.4%/89.3% (-0.59%/-0.38%)120.74(-30%)46.5958\25.3098\13.6982
MobileNetV1sensitive + L1NormFilterPruner69.8%/88.9% (-1.19%/-0.78%)90.56(50%)37.9892\20.7882\11.3144
MobileNetV1uniform + FPGMFilterPruner69.56%/89.14% (-1.43%/-0.53%)90.56(-50%)33.5636\18.6834\10.5076

注:

  • uniform: 各层剪裁率保持一样。
  • sensitive: 根据各层敏感度确定每层的剪裁率。

策略介绍

L1NormFilterPruner

paper: https://arxiv.org/abs/1608.08710

该策略使用l1-norm统计量来表示一个卷积层内各个Filters的重要性,l1-norm越大的Filter越重要。

使用方法如下:

动态图

pruner =paddleslim. L1NormFilterPruner(net, [1, 3, 128, 128])
pruner.prune_vars({"conv2d_0.w_0": 0.3})

API文档 | 完整示例

静态图

pruner = paddleslim.prune.Pruner(criterion='l1_norm')
pruned_program, _, _ = pruner.prune(
        train_program,
        fluid.global_scope(),
        params=["conv2d_0.w_0"],
        ratios=[0.3],
        place=fluid.CPUPlace())

API文档 | 完整示例

FPGMFilterPruner

论文: https://arxiv.org/abs/1811.00250

该策略通过统计Filters两两之间的几何距离来评估单个卷积内的Filters的重要性。直觉上理解,离其它Filters平均距离越远的Filter越重要。

使用方法如下:

动态图

pruner =paddleslim.FPGMFilterPruner(net, [1, 3, 128, 128])
pruner.prune_vars({"conv2d_0.w_0": 0.3})

API文档 | 完整示例

静态图

pruner = paddleslim.prune.Pruner(criterion='geometry_median')
pruned_program, _, _ = pruner.prune(
        train_program,
        fluid.global_scope(),
        params=["conv2d_0.w_0"],
        ratios=[0.3],
        place=fluid.CPUPlace())

API文档 | 完整示例

SlimFilterPruner

论文: https://arxiv.org/pdf/1708.06519.pdf

该策略根据卷积之后的batch_normscales来评估当前卷积内各个Filters的重要性。scale越大,对应的Filter越重要。

使用方法如下:

静态图

pruner = paddleslim.prune.Pruner(criterion='bn_scale')
pruned_program, _, _ = pruner.prune(
        train_program,
        fluid.global_scope(),
        params=["conv2d_0.w_0"],
        ratios=[0.3],
        place=fluid.CPUPlace())

API文档 | 完整示例

OptSlimFilterPruner

论文: https://arxiv.org/pdf/1708.06519.pdf

使用方法如下:

静态图

pruner = paddleslim.prune.Pruner(criterion='bn_scale', idx_selector="optimal_threshold")
pruned_program, _, _ = pruner.prune(
        train_program,
        fluid.global_scope(),
        params=["conv2d_0.w_0"],
        ratios=[0.3],
        place=fluid.CPUPlace())

API文档 | 完整示例