本示例将演示如何按指定的剪裁率对每个卷积层的通道数进行剪裁。该示例默认会自动下载并使用mnist数据。
当前示例支持以下分类模型:
- MobileNetV1
- MobileNetV2
- ResNet50
- PVANet
本示例支持MNIST
和ImageNet
两种数据。默认情况下,会自动下载并使用MNIST
数据,如果需要使用ImageNet
数据,请按以下步骤操作:
1). 根据分类模型中ImageNet数据准备文档下载数据到PaddleSlim/demo/data/ILSVRC2012
路径下。
2). 使用train.py
脚本时,指定--data
选项为imagenet
.
如果使用ImageNet
数据,建议在预训练模型的基础上进行剪裁,请从分类库中下载合适的预训练模型。
这里以MobileNetV1
为例,下载并解压预训练模型到当前路径:
wget http://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV1_pretrained.tar
tar -xf MobileNetV1_pretrained.tar
使用train.py
脚本时,指定--pretrained_model
加载预训练模型。
通过以下命令启动裁剪任务:
export CUDA_VISIBLE_DEVICES=0
python train.py \
--model "MobileNet" \
--pruned_ratio 0.31 \
--data "mnist" \
--criterion "l1_norm"
其中,model
用于指定待裁剪的模型。pruned_ratio
用于指定各个卷积层通道数被裁剪的比例。data
选项用于指定使用的数据集。
criterion
选项用于指定所使用的剪裁算法策略,现在支持l1_norm
, bn_scale
, geometry_median
。默认为l1_norm
。可以
设置该参数以改变剪裁算法策略。该目录下的四个shell脚本文件是在ResNet34, MobileNetV1, MobileNetV2等三个模型上进行的四组
criterion
设置为geometry_median
的实验,可以直接运行脚本文件启动剪裁实验。
执行python train.py --help
查看更多选项。
在本示例中,会在日志中输出剪裁前后的FLOPs
,并且每训练一轮就会保存一个模型到文件系统。
本节介绍如何加载训练过程中保存的模型。
执行以下代码加载模型并评估模型在测试集上的指标。
python eval.py \
--model "MobileNet" \
--data "mnist" \
--model_path "./models/0"
在脚本eval.py
中,使用paddleslim.prune.load_model
接口加载剪裁得到的模型。
该示例使用了paddleslim.Pruner
工具类,用户接口使用介绍请参考:API文档
在调用paddleslim.Pruner
工具类时,需要指定待裁卷积层的参数名称。不同模型的参数命名不同,
在train.py
脚本中,提供了get_pruned_params
方法,根据用户设置的选项--model
确定要裁剪的参数。