自学内容网 自学内容网

模型剪枝中有哪些经验 | yolov5prune项目中模型剪枝经验分析

项目地址:https://github.com/midasklr/yolov5prune
项目时间:2022年1月

yolov5prune项目虽然是一个2年前的项目,但其是一个比较良好的剪枝案例。从中可以学习到模型剪枝相关的必要知识,为此对其信息及相关代码进行总结性分析,若要使用该项目则需要自行阅读项目md文档。

根据项目分析,得出以下经验信息:
1、进行稀疏化训练后,模型精度会有所下降,但稀疏化训练后剪枝模型(withou finetrun)精度下降不大,再次finetrun后精度会恢复;
2、不要到网络分支进行剪枝,如残差结构剪枝,会使网络进行退化。即剪枝不能破坏网络整体结构,以conv、bn为基本单位即可;
3、对bn层的gamma参数稀疏化训练,剪枝后模型精度下降较低,而conv的下降明显;但对conv稀疏化略微有效,想必是正则化约束性更多导致的精度上升;
4、关于替换backbone为小模型,如果没有在相关数据集上进行为微调的模型权重,那不如直接进行剪枝训练。尤其是目标检测模型,很多较强的模型并没有在coco上训练过,以imagenet权重直接迁移过来或许存在能力差异;
5、通过作者的剪枝实验数据,基本可以明确剪枝50%左右对模型的精度基本上是没有任何影响的;如果影响了,则是剪枝实验设计的不合理。

如果觉得本博文分析对您有帮助,希望能给原作者一个starts。

1、基于BN层系数gamma剪枝

1.1 BN层剪枝的理解基础

首先:BN层的具体操作有两部分,第一步是数据的标准化(这部分是无参数的),第二步是数据的缩放与平移,保证均值方差的一致性(这部分有两个可训练参数),尤其是参数gamma,决定了bn层输出值的尺度。
在这里插入图片描述
其次:通过在loss函数中添加gamma的L1正则约束,可以实现gamma的稀疏化。
在这里插入图片描述

1.2 bn层剪枝的可视化

在一个卷积-BN-激活模块中,BN层可以实现通道的缩放,未对bn添加正则化约束的条件下,训练结束后的BN层gamma分布近似正太分布,这是无法区分出权重重要性并进行合理剪枝的。
在这里插入图片描述
进行稀疏训练后的分布如下,可以看到有不少bn的gamma值接近于0,在理论上这部分的bn对应的通道输出值很小,可以进行安全的剪枝。而且,随着训练epoch进行,越来越多的gamma逼近0
在这里插入图片描述

1.3 具体的剪枝操作

1、首先使用train.py进行正常训练
2、基于训练好的模型进行稀疏训练
3、对稀疏训练完成后进行剪枝,剪枝的比例阈值可以逐步增大(根据效果确定,【稀疏化训练的模型,剪枝后不训练也能保持80%~90%的能力】)
4、对剪枝后的模型进行finetrun

1.4 剪枝效果

作者分享的在voc数据效果如下,可以看到剪枝50%后,map掉3个点,重新训练后基本上恢复精度。
在这里插入图片描述
作者也在自己的数据集上进行了实验,可以发现剪枝65%的bn层通道,参数量降低为原来的1/4,精度基本没有损失。
在这里插入图片描述

2、Bottleneck结构剪枝

这是基于作者对yolov5模型结构的理解,所设想的剪枝方案

2.1 理论依据

Bottleneck的结构如下图所示,可以看到是一个残差结构。如果右边的参差很小,那么对结果贡献不大,就只剩下左边shortcut连接影响输出。则可以将整个模块都裁剪掉。
在这里插入图片描述

作者提到,可以进行约束让参差逼近0。对应代码在项目中train_sparsity2.py

2.2 剪枝效果

根据作者的数据,可以发现进行稀疏化训练后,模型精度基本崩盘,剪枝后再重新训练也未能恢复精度。想必是,对残差结构进行剪枝完全破坏了深度网络的层次信息,删除了跳跃连接使网络变浅,能力迅速下降。
在这里插入图片描述

3、卷积核剪枝

3.1 理论依据

那些权重很小的卷积核对应输出也较小,那么对kernel进行约束,是可以对卷积核进行裁剪的。

3.2 剪枝效果

剪枝效果如下所示,约束卷积层参数后,发现精度更高的,应该是正则化所起到的作用。但剪枝后,可以发现模型精度大幅度降低,重新训练后也精度恢复了。

在这里插入图片描述
上面有一个关键现象就是,稀疏化训练后再剪枝,模型精度下降很严重,这根卷积层的输出值计算方式有关。输入为32channel,输出为64channel的卷积层,有32*64个卷积核。每32个卷积kernel的参数(一共64组)运行结果叠加共同影响输出值。很有可能是作者设计的卷积参数权重统计代码有误,也有可能是conv后续还连接着bn层,模型剪枝后导致bn层计算的分布完全变了,然后导致精度变化较大

也就是说,权重很小的卷积核,虽然其单个输出较小,但卷积层的输出是由多个卷积核参数叠加

4、其他方法

4.1 混合剪枝

这里对bn层与conv层统一进行稀疏化训练与剪枝,可以发现稀疏化训练(正则化)后模型的精度就已经下降,在剪枝后精度没有任何变化。作者没有进行fineturn,再次训练也只能比稀疏化训练高1个点左右,完全没有价值了。但从剪枝比例来看,85%的剪枝比,也就是说保留15%的参数,参数削减为原来的1/7,这个加速比预计是在10x左右了。
在这里插入图片描述

4.2 替换backbone

关于替换backbone的效果如下,个人认为是因为mobilenetv3small是没有在coco上的预训练数据模型,所有精度与yolov5s存在显著差异;同时也表明更换更小的backbone不如进行模型剪枝研究。
在这里插入图片描述


原文地址:https://blog.csdn.net/a486259/article/details/140594912

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!