• 模型压缩-ThiNet


    转载:https://blog.csdn.net/u014380165/article/details/77763037

        https://www.twblogs.net/a/5b8d02472b717718833929d6/zh-cn

    GitHub网址:https://github.com/Roll920/ThiNet https://github.com/Roll920/ThiNet_Code
    项目资料网址:http://lamda.nju.edu.cn/luojh/project/ThiNet_ICCV17/ThiNet_ICCV17_CN.html

    论文:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression - ICCV2017
    论文链接:https://arxiv.org/abs/1707.06342

    论文:ThiNet: Pruning CNN Filters for a Thinner Net - TPAMI2018

    框架的流程图如上Figure1,第一行是filter selection,选择的依据是:如果我们可以用第i+1层的输入channel的一个子集作为第i+1层的输入且近似得到第i+1层的输出,那么这个子集以外的channel就可以去掉了,因为第i+1层的一个输入channel对应第i层的一个filter(卷积核),因此去掉第i+1层的channel同时也就可以去掉第i层的filter。第二行是prune,将第一步的weak channel和对应的前面一层的filter去掉,得到更窄(thin)的网络,这也是ThiNet名称的由来。第三行是Fine-tuning,这里为了节约时间,当对每一层做prune后,都fine-tune1到2个epoch,然后等所有层都prune后,再fine-tune多个epoch。因此整体上就是上面这三步迭代应用到每一层上,依次对每一层做prune。

    去掉冗余filter做prune的研究还有很多,关键在于选择方式,比如计算filter的绝对值和,认为如果一个filter的绝对值和比较小,说明该filter并不重要,这种算法暂且叫Weight sum;还有计算激活层输出的feature map的值的稀疏程度,如果feature map的值很稀疏,也就是大部分值是0,那么该feature map对应的filter也是冗余的,可以去掉,这种算法暂且叫APoZ(Average Percentage of Zeros)。这两种压缩算法在后面的实验中都会提到。

    效果:

    在ILSVRC-12数据集上,在VGG16上能够降低3.31×的FLOPs,16.63×的网络参数,而top-5准确度下降仅为0.52%。
    对于ResNet-50这样紧凑的网络,ThiNet也能减少超过一半的的参数与FLOPs,而top-5仅降低1%。
    ThiNet能将VGG16网络模型剪枝到只有5.05MB的大小,保留AlexNet级别的精度,却拥有更强的泛化性能。
    不同选择算法的性能比较:

    通道选择(数据驱动):

    为了确定哪个通道可以安全移除,将收集用于重要性评估的训练集。如图所示,由y表示的元素从张量(ReLU之前)中进行随机采样。
    这里写图片描述
    通常,带偏置项b的卷积计算如下:
    这里写图片描述
    现在,如果我们定义:
    这里写图片描述
    便能将上面公式简化为:
    这里写图片描述
    这里 y^=y−b。 若我们能够找到一个通道子集S⊂{1,2,…,C},使得下式
    这里写图片描述
    总是成立,那么我们便能不再依赖于任何c∉S的通道。因此,这些通道(及其对应的filter)便能在不改变CNN网络模型精度的前提下被安全移除。当然,上面的公式不可能对于所有的x^与y^总保持成立。但我们可以手动提取一部分训练样本,来计算一个使得上式近似正确的子集S。

    一种用于通道选择的贪心算法:

    给定m(m由图片数量与位置数量决定)个训练样本{(x^i,y^i)},原通道选择问题可以转化为如下的优化问题:
    这里写图片描述
    这里,|S|为子集S的元素数量,r为预定义的压缩率(即保留多少个通道)。令T为被移除的通道集合(S∪T={1,2,…,C} 同时 S∩T=∅),我们便能最小化另一等价优化目标:
    这里写图片描述
    求解公式是一个NP难的问题,因此我们提出了一种快速的贪心算法进行求解。
    这里写图片描述

    最小化重构误差:

    在决定保留哪几个滤波器之后,我们可以通过对每一个通道赋予权重来进一步地减小重构误差。
    这里写图片描述
    上式可以通过普通的最小二乘法来求解。

    算法步骤:

    1.filter选择。
    使用layer(i + 1)的输入中的一个通道子集来逼近layer(i + 1)中的输出,则其他通道可以安全地从layer(i + 1)的输入中移除。layer(i + 1)的输入中的一个通道由第i层中的一个filter产生,因此可以同时修剪第i层中的相应filter。
    2.修剪。
    3.微调。
    4.重复步骤1修剪下一层。

    注意事项:

    1)对于VGG-16网络,由于前面10层卷积占据了90%的计算量,而全连接层又占据了86%的参数,因此作者采用对前面10层卷积层进行prune,达到加速目的,另外将所有全连接层用一个global average pooling层代替。
    2)对于ResNet网络,作者采用只对一个block的前两层卷积做prune,而不动最后一个卷积层,如下图。
    这里写图片描述

  • 相关阅读:
    不懂区块链?先来看一下这篇
    ZooKeeper 分布式共享锁的实现
    关于 use-default-filters 属性的说明
    MapReduce 入门之一步步自实现词频统计功能
    Spring、SpringMVC、SpringData + JPA 整合详解
    使用 Hadoop 进行语料处理(面试题)
    顺序线性表 ---- ArrayList 源码解析及实现原理分析
    JPA + SpringData 操作数据库 ---- 深入了解 SpringData
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
  • 原文地址:https://www.cnblogs.com/hansjorn/p/12053125.html
Copyright © 2020-2023  润新知