# Overview PaddleSlim提供以下内置剪裁方法。 | 序号 | 剪裁方法 | 支持静态图 | 支持动态图 | 支持敏感度分析 | 支持自定义各层剪裁率| |:----:|:------------------:|:----------:|:----------:|:--------------:|:-------------------:| |1 |FPGMFilterPruner |是 | 是 | 是 |是 | |2 |L1NormFilterPruner |是 | 是 | 是 |是 | |3 |L2NormFilterPruner |否 | 是 | 是 |是 | |4 |SlimFilterPruner |是 | 否 | 是 |是 | |5 |OptSlimFilterPruner |是 | 否 | 是 |是 | 注: - 支持敏感度分支:意为是否支持通过各个层的敏感度分析来确定各个卷积层的剪裁率。 - 支持自定义各层剪裁率:意为是否支持手动指定各个卷积层的剪裁率。 除了以上内置策略,PaddleSlim还支持用户自定义卷积通道剪裁策略,请参考:[自定义卷积通道剪裁教程]() ## 各类方法效果对比 | 模型 | 压缩方法 | 精度(Top-1/Top-5) | 模型体积(MB) | GFLOPs |PaddleLite推理耗时| |:--:|:---:|:--:|:--:|:--:|:--:| | MobileNetV1 |Baseline |70.99%/89.68% |17|1.11 |66.052\35.8014\19.5762| | MobileNetV1 |uniform + L1NormFilterPruner |69.40%/88.66% (-1.59%/-1.02%) |9 |0.56(-50%)|33.5636\18.6834\10.5076| | MobileNetV1 |sensitive + L1NormFilterPruner|70.4%/89.3% (-0.59%/-0.38%) |12|0.74(-30%)| 46.5958\25.3098\13.6982| | MobileNetV1 |sensitive + L1NormFilterPruner|69.8%/88.9% (-1.19%/-0.78%) |9 |0.56(50%) |37.9892\20.7882\11.3144| | MobileNetV1 |uniform + FPGMFilterPruner |69.56%/89.14% (-1.43%/-0.53%) |9 |0.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文档](../../api_cn/dygraph/pruners/l1norm_filter_pruner.html) | [完整示例](../../quick_start/dygraph/dygraph_pruning_tutorial.html) #### 静态图 ``` 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文档](../../api_cn/static/prune/prune_api.html) | [完整示例](../../quick_start/static/pruning_tutorial.html) ### 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文档](../../api_cn/dygraph/pruners/fpgm_filter_pruner.html) | [完整示例](../../quick_start/dygraph/dygraph_pruning_tutorial.html) #### 静态图 ``` 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文档](../../api_cn/static/prune/prune_api.html) | [完整示例](../../quick_start/static/pruning_tutorial.html) ### SlimFilterPruner 论文: https://arxiv.org/pdf/1708.06519.pdf 该策略根据卷积之后的`batch_norm`的`scales`来评估当前卷积内各个`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文档](../../api_cn/static/prune/prune_api.html) | [完整示例](../../quick_start/static/pruning_tutorial.html) ### 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文档](../../api_cn/static/prune/prune_api.html) | [完整示例](../../quick_start/static/pruning_tutorial.html)