基于PaddleDetection的深度学习模型剪裁方法

模型剪裁流程

一、运行需要COCO-API,安装方式如下:

# 安装pycocotools
pip install pycocotools

二、克隆PaddleDetection库

git clone https://github.com/PaddlePaddle/PaddleDetection.git

三、确定待分析参数

在计算敏感度之前,需要查出待分析的卷积层的参数的名称。通过以下命令查看当前模型的所有参数:

python sensitive.py \
-c ../../configs/yolov3_mobilenet_v1_voc.yml \
--print_params

通过观察参数名称和参数的形状,筛选出所有卷积层参数,并确定要分析的卷积层参数。

四、执行分析

通过选项--pruned_params指定待分析的卷积层参数名,参数名间以英文字符逗号分割。 通过选项--sensitivities_file指定敏感度信息保存的文件,敏感度信息会追加到该文件中。重启敏感度计算任务,该文件中已计算的信息不会再被计算。

示例如下:

nohup python sensitive.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,yolo_block.0.1.1.conv.weights,yolo_block.0.2.conv.weights,yolo_block.0.tip.conv.weights,yolo_block.1.0.0.conv.weights,yolo_block.1.0.1.conv.weights,yolo_block.1.1.0.conv.weights,yolo_block.1.1.1.conv.weights,yolo_block.1.2.conv.weights,yolo_block.1.tip.conv.weights,yolo_block.2.0.0.conv.weights,yolo_block.2.0.1.conv.weights,yolo_block.2.1.0.conv.weights,yolo_block.2.1.1.conv.weights,yolo_block.2.2.conv.weights,yolo_block.2.tip.conv.weights" \
--sensitivities_file "./demo.data"

执行python sensitive.py --help查看更多选项。

五、分析敏感度信息

可以通过paddleslim.prune.load_sensitivities从文件中加载敏感度信息,并使用Python数据分析工具画图分析。下图展示了MobileNetv1-YOLOv3-VOC模型在VOC数据上的敏感度信息:

通过画图分析,可以确定一组合适的剪裁率,或者通过paddleslim.prune.get_ratios_by_loss获得合适的剪裁率。

六、启动剪裁任务

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

python slim/prune/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"

剪裁完成后模型就能在损失微乎其微的精度的条件下,减小模型大小了!(剪去无用的树枝---剪枝法)

posted @ 2022-06-13 11:03  Rogerssss  阅读(495)  评论(0)    收藏  举报