【网络裁剪】——通道剪枝问答/code解读

亮点:原理,code

论文和原理和参考上一篇博客:Learning Efficient Convolutional Networks through Network Slimming

  1. 通道裁剪在训练时需要做什么?

在训练的时候需要训练一个通道稀疏特性的模型,实现通道稀疏化需要将和一个通道有关联的所有输入和输出的连接都剪掉。

  1. 其如何训练一个通道稀疏的模型的?

利用BN层的缩放因子,引入缩放因子正则项之后,我们得到的模型中许多缩放因子都会趋于0。
在这里插入图片描述
code:

# ***********************稀疏训练(对BN层γ进行约束)**************************
def updateBN():
    for m in model.modules():
        if isinstance(m, nn.BatchNorm2d):
            if hasattr(m.weight, 'data'):
                m.weight.grad.data.add_(args.s * torch.sign(m.weight.data))  # L1正则
            
optimizer.zero_grad()
loss.backward()

# ***********************稀疏训练(对BN层γ进行约束)**************************
if args.sr:
    updateBN()  

可以看到只是在训练的时候增加了一个updateBN,该函数就是对batchnorm的权重做L1正则化,而L1正则化可以使batchnorm.weight更稀疏化,也就是weight有更多的0。这也就是channel剪枝的目的。

  1. 为什么L1正则化会产生一个稀疏化的模型
    参考自:l1正则与l2正则的特点是什么,各有什么优势?

L1-regularization 和 L2-regularization 便都是我们常用的正则项,两者公式的例子分别如下:
在这里插入图片描述
在这里插入图片描述 L1 正则项和 L2 正则项来进行求导,可得。
在这里插入图片描述
在这里插入图片描述
假设只有一个w1参数,画出L1,L2及其倒数的图:
在这里插入图片描述
在这里插入图片描述
于是会发现,在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。
在这里插入图片描述
而看 L2 的话,就会发现它的梯度会越靠近0,就变得越小。
在这里插入图片描述
也就是说加了 L1 正则的话基本上经过一定步数后很可能变为0,而 L2 几乎不可能,因为在值小的时候其梯度也会变小。于是也就造成了 L1 输出稀疏的特性。

所有上面的解释都是只有正则项时,那样会造成迭代一定的步数,权重为0.但是真实的是正则化只是一个补充项。让权重努力的向0靠拢
m.weight.grad.data.add_(args.s * torch.sign(m.weight.data)) # L1正则

  1. 裁剪后的模型需要微调吗?

原文的路线是可以有fine-tune的。
在这里插入图片描述
在cifar10这种小数据集上,不需要fine-tune效果也很好。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值