VGG通道剪枝

VGG通道剪枝

剪枝的意义

深度模型落地需要权衡两个核心问题:精度和复杂度。复杂度由硬件决定,硬件是模型的载体,可以是手机、IOT设备等。模型压缩加速,在保持精度基本不变、降低模型计算复杂度。一方面提升模型落地的可能性,另一方面降低了资源消耗,
节省成本。

模型剪枝的分类

这里简单介绍分类,不进行详细阐述
非结构剪枝:通常是连接级、细粒度的剪枝方法,精度相对较高,但依赖于特定算法库或硬件平台支持。
结构化剪枝:filter级或layer级、粗粒度的剪枝方法,精度相对较低,但剪枝策略更为有效,不需要特定算法库或硬件平台的支持,能够直接在成熟深度学习框架上运行。

剪枝的基本流程

稀疏训练→剪枝→微调
稀疏训练:对BN层的gamma系数进行稀疏化(L1正则化),然后用稀疏化后的gamma系数来评价通道的重要性,因为在<卷积层-BN层-激活函数>中,gamma系数为0就说明了无论卷积层输出的值为何,到了BN层后,它的输出值都变成了:
在这里插入图片描述其中,gamma即为BN层的gamma系数(在源码中就是bn_module.weight);beta即为BN层的beta项(在源码中就是bn_module.bias);X为卷积层的某个输出通道;Y为BN层的在改通道上对应的输出;mu为BN层的均值参数(即bn_module.moving_mean);sigma为BN层的方差参数(即bn_module.moving_var);epsilon是为了防止分母为0,可以取1e-16。
说明这个卷积层该通道的输出已经对后续模块的前向计算不产影响了,那我们只需要把beta项挪到后续模块中卷积层的bias中或者后续模块的BN层的moving_mean中就可以了:

  1. 当下一个模块是<卷积层-BN层-激活函数>时,BN层的next_bn_module.moving_mean减去Convolution(activation)即可
  2. 当下一个模块是<卷积层-激活函数>时,卷积层的next_conv.bias加上Convolution(activation)即可
  3. 当下一个模块是跨层连接、pooling、上采样层时,需要把activation传递下去直到遇见卷积模块,然后在卷积模块中进行处理(同1或2)

这样对通道进行剪枝后模型的精度就不会产生变化(如果剪枝的通道对应的gamma系数为0),等于稀疏后模型的精度,而稀疏后模型的精度几乎等于原始模型的精度,但是稀疏化只能把大部分gamma系数驱赶到接近0的值,而不是真正的0,所以剪枝后的模型还是会有精度的下降(当然剪枝后模型精度甚至有可能超越原始模型的精度),这时通过微调就可以把精度恢复。

在这里插入图片描述
在这里插入图片描述
1.稀疏化训练指的是在损失函数中添加关于BN层的gamma系数的L1正则化项,然后反向传递的时候gamma系数会相应的进行梯度更新;
2.实际上并没有对损失函数进行修改,而是对那些能够被剪枝的通道对应的gamma系数的梯度添加上L1正则化惩罚项,然后在反向传播时,gamma系数会减掉lr乘上梯度;
3.是gammma系数的梯度包含了损失函数对其求导项也包含了L1正则化惩罚项;
4.gamma系数的梯度更新会使得大量gamma系数的值趋于0,论文认为那些趋于0的γ系数对应的通道都是不重要的,可以剪枝减掉。
剪枝
在这里插入图片描述
微调:对剪枝后的模型微调,加载剪枝后的模型训练,提升剪枝精度,此时的模型大小不会改变,但模型精度大大提升,有10%提升到93%。此时训练的速度较之前训练速度也有很大的提升。
在这里插入图片描述

总结

在这里插入图片描述
由上表使用不同的裁剪率分析可得:裁剪率为0.5之前,准确率下降不明显,证明神经网络的大量计算有很多冗余参数;随着裁剪率的提升,后续会减去大量参数,准确率降低,计算量随之也会减少,花费时间也会降低。可以使得模型加速,适用于算力较低的平台。

注:此篇博客参考许多大牛博客完成。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值