README.md 2.8 KB
Newer Older
W
whs 已提交
1
# 卷积层通道剪裁教程
2

W
whs 已提交
3
请确保已正确[安装PaddleDetection](../../docs/INSTALL_cn.md)及其依赖。
4

W
whs 已提交
5
该文档介绍如何使用[PaddleSlim](https://paddlepaddle.github.io/PaddleSlim)的卷积通道剪裁接口对检测库中的模型的卷积层的通道数进行剪裁。
6

W
whs 已提交
7
在检测库中,可以直接调用`PaddleDetection/slim/prune/prune.py`脚本实现剪裁,在该脚本中调用了PaddleSlim的[paddleslim.prune.Pruner](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/#Pruner)接口。
8

W
whs 已提交
9
该教程中所示操作,如无特殊说明,均在`PaddleDetection/slim/prune/`路径下执行。
10

W
whs 已提交
11
## 1. 数据准备
12

W
whs 已提交
13
请参考检测库[数据下载](../../docs/INSTALL_cn.md)文档准备数据。
14

W
whs 已提交
15
## 2. 模型选择
16

W
whs 已提交
17
通过`-c`选项指定待裁剪模型的配置文件的相对路径,更多可选配置文件请参考: [检测库配置文件](https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.1/configs)
18

W
whs 已提交
19
对于剪裁任务,原模型的权重不一定对剪裁后的模型训练的重训练有贡献,所以加载原模型的权重不是必需的步骤。
20

W
whs 已提交
21
通过`-o weights`指定模型的权重,可以指定url或本地文件系统的路径。如下所示:
22 23

```
W
whs 已提交
24
-o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_voc.tar 
25 26
```

W
whs 已提交
27

28 29

```
W
whs 已提交
30
-o weights=output/yolov3_mobilenet_v1_voc/model_final
31 32
```

W
whs 已提交
33
官方已发布的模型请参考: [模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.1/docs/MODEL_ZOO_cn.md)
34

W
whs 已提交
35
## 3. 确定待分析参数
36

W
whs 已提交
37 38
我们通过剪裁卷积层参数达到缩减卷积层通道数的目的,在剪裁之前,我们需要确定待裁卷积层的参数的名称。
通过以下命令查看当前模型的所有参数:
39 40

```
W
whs 已提交
41 42 43
python prune.py \ 
-c ../../configs/yolov3_mobilenet_v1_voc.yml \
--print_params
44 45
```

W
whs 已提交
46
通过观察参数名称和参数的形状,筛选出所有卷积层参数,并确定要裁剪的卷积层参数。
47

W
whs 已提交
48
## 4. 启动剪裁任务
49

W
whs 已提交
50
使用`prune.py`启动裁剪任务时,通过`--pruned_params`选项指定待裁剪的参数名称列表,参数名之间用空格分隔,通过`--pruned_ratios`选项指定各个参数被裁掉的比例。
51 52

```
W
whs 已提交
53 54 55 56
python prune.py \
-c ../../configs/yolov3_mobilenet_v1_voc.yml \
--pruned_params "yolo_block.0.0.0.conv.weights,yolo_block.0.0.1.conv.weights,yolo_block.0.1.0.conv.weights" \
--pruned_ratios="0.2 0.3 0.4"
57 58
```

W
whs 已提交
59
## 5. 扩展模型
60

W
whs 已提交
61 62
如果需要对自己的模型进行修改,可以参考`prune.py`中对`paddleslim.prune.Pruner`接口的调用方式,基于自己的模型训练脚本进行修改。
本节我们介绍的剪裁示例,需要用户根据先验知识指定每层的剪裁率,除此之外,PaddleSlim还提供了敏感度分析等功能,协助用户选择合适的剪裁率。更多详情请参考:[PaddleSlim使用文档](https://paddlepaddle.github.io/PaddleSlim/)