实现channel剪枝,定义剪枝比例,即可实现剪枝;目前已实现alexnet、vgg16、resnet等分类网络的剪枝;yolov5s暂时出现了一个bug;但是剪枝需要的文件和预处理操作均已获取到;
准备文件
1.train、test需要的数据集;
2.模型创建
3.forward细化到每层的前向传递
4.在conv的地方定义一个hook function;对获取到的gradient进行处理(计算标准差等)
5.通道权重rank,过滤掉一些不重要的权重
6.迭代次数为总过滤的通道数/每次过滤的通道数
7.进行剪枝时,要对应好上一层输出的通道数与当前层的输入通道数对应,在add方法中,要注意剪枝后的通道数匹配;
注意:在实际操作过程中,最好是直接对卷积层进行通道剪枝,这样可快速减小网络的参数量,在对Linear层的剪枝发现,模型大小下降不明显,原因也是Linear层的参数量为in_feature* out_feature;feature通常设置比较大,所以效果不太明显;
代码可关注:https://github.com/oyjGithub,后续将把操作代码放入到github项目中;
vgg16模型剪枝50%与原模型对比:(中间的数字表示size,54.59MB、217.52MB)