模型压缩之Channel Pruning

论文地址

channel pruning是指给定一个CNN模型,去掉卷积层的某几个输入channel以及相应的卷积核,
并最小化裁剪channel后与原始输出的误差。

可以分两步来解决:

  1. channel selection
    利用LASSO回归裁剪掉多余的channel,求出每个channel的权重,如果为0即是被裁减。
  2. feature map reconstruction
    利用剩下的channel重建输出,直接使用最小平方误差来拟合原始卷积层的输出,求出新的卷积核W。

二、优化目标

2.1 定义优化目标

输入c个channel,输出n个channel,卷积核W的大小是

我们对输入做了采样,假设对每个输入,对channel采样出来N个大小为块

为了把输入channel从c个剪裁到c’个,我们定义最优化的目标为

其中是每个channel的权重向量,如果是0,意味着裁剪当前channel,相应的也被裁减。

2.2 求最优目标

为了最优化目标,分为如下两步

2.2.1 固定W,求

其中,大小是,

这里之所以加上关于的L1正则项,是为了避免所有的都为1,而是让它们趋于0。

2.2.2 固定,求W

利用剩下的channel重建输出,直接求最小平方误差

其中,大小为,
W’也被reshape为。

2.2.3 多分支的情况

论文只考虑了常见的残差网络,设residual分支的输出为,shortcut 分支的输出为。

这里首先在residual分支的第一层前做了channel采样,从而减少计算量(训练过程中做的,即filter layer)。

设为原始的上一层的输出,
那么channel pruning中,residual分支的输出拟合,其中是上一层裁减后的shortcut。

三、实现

实现的时候,不是按照不断迭代第一步和第二步,因为比较耗时。
而是先不断的迭代第一步,直到裁剪剩下的channel个数为c’,然后执行第二步求出最终的W。

3.1 第一步Channel Selection

如何得到LASSO回归的输入:

(1)首先把输入做转置

# (N, c, hw) --> (c, N, hw)
inputs = np.transpose(inputs, [1, 0, 2])

(2)把weigh做转置

# (n, c, hw) --> (c, hw, n)
weights = np.transpose(weights, [1, 2, 0]))

(3)最后两维做矩阵乘法

# (c, N, n), matmul apply dot on the last two dim
outputs = np.matmul(inputs, weights)

(4)把输出做reshape和转置

# (Nn, c)
outputs = np.transpose(outputs.reshape(outputs.shape[0], -1))

LASSO回归的目标值即是对应的Y,大小为

的大小影响了最终为0的个数,为了找出合适的,需要尝试不同的值,直到裁剪剩下的channel个数为为止。

为了找到合适的可以使用二分查找,
或者不断增大直到裁剪剩下的channel个数,然后降序排序取前,剩下的为0。

while True:
    coef = solve(alpha)
    if sum(coef != 0) < rank:
        break
    last_alpha = alpha
    last_coef = coef
    alpha = 4 * alpha + math.log(coef.shape[0])
if not fast:
    # binary search until compression ratio is satisfied
    left = last_alpha
    right = alpha
    while True:
        alpha = (left + right) / 2
        coef = solve(alpha)
        if sum(coef != 0) < rank:
            right = alpha
        elif sum(coef != 0) > rank:
            left = alpha
        else:
            break
else:
    last_coef = np.abs(last_coef)
    sorted_coef = sorted(last_coef, reverse=True)
    rank_max = sorted_coef[rank - 1]
    coef = np.array([c if c >= rank_max else 0 for c in last_coef])

3.2 第二步Feature Map Reconstruction

直接利用最小平方误差,求出最终的卷积核。

from sklearn import linear_model
def LinearRegression(input, output):
    clf = linear_model.LinearRegression()
    clf.fit(input, output)
    return clf.coef_, clf.intercept_
pruned_weights, pruned_bias =  LinearRegression(input=inputs, output=real_outputs)

3.3 一些细节

  1. 将Relu层和卷积层分离
    因为Relu一般会使用inplace操作来节省内存/显存,如果不分离开,那么得到的卷积层的输出是经过了Relu激活函数计算后的结果。
  2. 每次裁减完一个卷积层后,需要对该层的bottom和top层的输入或输出大小作相应的改变。
  3. 第一步求出后,若为0,则说明要裁减对应的channel,否则置为1,表示保留channel。

参考链接

https://github.com/yihui-he/channel-pruning

原文地址:https://www.cnblogs.com/lijianming180/p/12360888.html

时间: 2024-08-02 21:58:55

模型压缩之Channel Pruning的相关文章

模型压缩相关工作

总结的很好的一篇博客:https://blog.csdn.net/App_12062011/article/details/81665140 定点化: 百度搜"模型压缩定点化" https://blog.csdn.net/u011961856/article/details/76736103 http://fjdu.github.io/machine/learning/2016/07/07/quantize-neural-networks-with-tensorflow.html ht

通用卷积核用于模型压缩和加速

介绍一下最近看的一种通用卷积核用于模型压缩的方法,刚刚查了一下,原作者的博客在https://zhuanlan.zhihu.com/p/82710870 有介绍,论文传送门 https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks.pdf , github开源地址 https://github.com/huawei-noah/Versatile-

深度学习之模型压缩

一.背景 深度学习让计算机视觉任务的性能到达了一个前所未有的高度.但,复杂模型的同时,带来了高额的存储空间.计算资源消耗,使其很难落实到各个硬件平台. 为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗. 二.理论基础 必要性:目前主流的网络,如VGG16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务. 可行性:在深度卷积网络中,存在着大量冗余地节点,仅仅只有少部分(5-10%)权值参与着主要的计算,也就是说,仅仅训练小部分的

【模型压缩】蒸馏算法小结

模型压缩之蒸馏算法小结 原始文档:https://www.yuque.com/lart/gw5mta/scisva Google Slide: https://docs.google.com/presentation/d/e/2PACX-1vSsa5X_zfuJUPgxUL7vu8MHbkj3JnUzIlKbf-eXkYivhwiFZRVx_NqhSxBbYDu-1c2D7ucBX_Rlf9kD/pub?start=false&loop=false&delayms=3000 2019年09

神经网络加速与模型压缩

https://github.com/handong1587/handong1587.github.io/blob/master/_posts/deep_learning/2015-10-09-acceleration-model-compression.md

Light Weight CNN模型的分析与总结

本文选择了4个light weight CNN模型,并对它们的设计思路和性能进行了分析与总结,目的在于为在完成图像识别任务时模型的选择与设计方面提供相关的参考资料. 1 简介 自AlexNet[1]在LSVRC-2010 ImageNet[22]图像分类任务上取得突破性进展之后,构建更深更大的convolutional neural networks(CNN)几乎成了一种主要的趋势[2-9].通常,获得state-of-the-art准确率的模型都有成百上千的网路层以及成千上万的中间特征通道,这

基于Distiller的模型压缩工具简介

Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/index.html PART I: 介绍 Distiller模型压缩包含的算法:  稀疏算法(剪枝+正则化)+低精度算法(量化) Distiller特点: (1)    该框架融合了剪枝,正则化及量化算法 (2)    一系列分析及评估压缩性能的工具 (3)    较流行压缩算法的应用 稀疏神经网络可

关于模型复杂度的一个想法

我们直观理解,如果在训练中,我们画出训练error和valid error,当发现overfiting了,在样本 足够的情况下overfiting是不是可以说明模型复杂度大于样本空间,这样我们是不是可以减少模型 的参数量,或者feature map,是不是可以给模型压缩做一个参考.同样,如果训练迭代很多,模型 训练error一直很大,是不是有一种可能就是模型复杂度不够.

浅谈压缩感知(三):几何解释

主要内容: 信号的稀疏表示模型 压缩测量 RIP性质 恢复重建 一.信号的稀疏表示模型 信号在某个空间是非稀疏的,如果变换到某个空间,即可变成稀疏的. 稀疏信号表示有极少的非零系数. 如下图,左边表示X信号在R3空间中只有一个非0系数,右边表示X信号在R3空间只有两个非0系数. 如果信号是稀疏的,那么就没必要采集那些在空间系数为0的值.相反,只采集少量的非零系数,而允许一点不确定性. 然后通过稀疏模型来重建信号,并解决不确定性的问题. 二.压缩测量 压缩测量:即将稀疏信号(K-Sparse)从N