overview.md 4.8 KB
Newer Older
W
whs 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
# 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)