热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《BuildingEfficientConvNetsusingRedundantFeaturePruning》论文笔记

1.概述一般在做模型的时候开始最关心的是模型的性能,也就是模型的精度,我们可以增加网络的宽度与深度,来不断增加模型的表达能力。在精度达标
1. 概述

一般在做模型的时候开始最关心的是模型的性能,也就是模型的精度,我们可以增加网络的宽度与深度,来不断增加模型的表达能力。在精度达标之后,网络也变地很臃肿了,其实里面很多的参数都是非必须的,也就是冗余的。如何去掉这些冗余呢?在之前的文章中讲到了了几种方法,这篇论文中给出的方法与之前的方法思路不同,是按照聚类的思想来去除冗余的filters,从而减少网络中filters的数量,达到网络剪裁的目的。在文章中给出了filter之间相似度的度量方法,并用这个度量方法作为filter合并的依据。
论文地址:Building Efficient ConvNets using Redundant Feature Pruning
代码地址:Redundant-Feature-Pruning-Pytorch-Implementation

2. 实现

这篇文章中涉及到的剪枝方法示意图见下图:
在这里插入图片描述
在图1中ZZZ代表feature map,WWW代表filters。这里假设ϕ1\phi_1ϕ1是filter的聚类表达,那么ϕ3,ϕ5\phi_3, \phi_5ϕ3,ϕ5由于与ϕ1\phi_1ϕ1的相似性高,那么基于冗余去除原则,其在Zl+1Z_{l+1}Zl+1中的feature map与Wl+1W^{l+1}Wl+1中对应的部分会被删除掉。
这里涉及到这些filter是之间距离度量函数的选择问题。首先,将每个filter作为一个聚类的中心,然后将其中的聚类中心,按照阈值τ\tauτ进行合并(大于这个阈值那就合并,小于该阈值不合并),其合并的距离度量可以使用下面的方式进行描述:
在这里插入图片描述
其中&#xff0c;SIMC(ϕ1,ϕ2)&#61;<ϕ1,ϕ2>∣∣ϕ1∣∣∣∣ϕ2∣∣SIM_C(\phi_1, \phi_2)&#61;\frac{<\phi_1, \phi_2>}{||\phi_1|| ||\phi_2||}SIMC(ϕ1,ϕ2)&#61;ϕ1ϕ2<ϕ1,ϕ2>是两个特征之间的cos距离度量&#xff0c;<ϕ1,ϕ2><\phi_1, \phi_2><ϕ1,ϕ2>是特征的内积。

基于冗余特征裁剪在lthl^{th}lth卷积层的使用可以归纳为如下步骤&#xff1a;
1&#xff09;对filters ϕi\phi_iϕi进行聚类得到nfn_fnf个聚类中心&#xff0c;使用阈值τ\tauτ&#xff1b;
2&#xff09;考虑两种启发式方式&#xff1a;&#xff08;A&#xff09;在nfn_fnf个聚类中心中随机选取一个filter&#xff0c;然后去剪裁剩余的filters与其对应的feature map&#xff1b;&#xff08;B&#xff09;随机剪裁掉n′−nfn^{&#x27;} - n_fnnf个filters和其对应的feature map。在后面一层(l&#43;1)th(l&#43;1)^{th}(l&#43;1)th中的对应参数也需要剪裁掉。对于这两种不同的策略&#xff0c;论文在后面也对其做了实验分析&#xff0c;详见后文。
3&#xff09;得到lthl^{th}lth(l&#43;1)th(l&#43;1)^{th}(l&#43;1)th新的kernel矩阵。

3. 实验结论

首先&#xff0c;来看一下论文整体的性能吧&#xff0c;这里也比较了上面提到的A、B两种启发式策略&#xff0c;并比较了两种策略的结果
在这里插入图片描述
之后在每个层上按照之前的两个方案进行裁剪&#xff0c;得到下图的前两个&#xff0c;之后进行finetune得到下图&#xff1a;
在这里插入图片描述
可以看到方案A的曲线比方案B的曲线更加柔和一点。

3.2 ResNet网络

这篇论文中没有涉及到对shortcut连接两端的剪裁&#xff0c;而是只操作了残差块的第一个卷积。实验的讨论和刚才看的VGG网络的一样。首先是各层上冗余度与阈值的关系
在这里插入图片描述
ResNet-56中各层裁剪比例与错误率的关系
在这里插入图片描述

4. 代码实现

论文中的算法在上面给出了代码链接&#xff0c;代码量还是比较少的&#xff0c;核心的函数就一个&#xff0c;这里给出我对它的理解&#xff1a;

&#39;&#39;&#39;/*
函数功能&#xff1a;对权重按照给出的阈值进行聚类&#xff0c;返回聚类之后的中心数目与对应的index
weight&#xff1a;聚类的权重&#xff0c;维度为[n_features, n_samples]
threshold&#xff1a;阈值控制聚类的程度&#xff0c;越大表示结果聚类数目越多
*/
&#39;&#39;&#39;

def cluster_weights_agglo(weight, threshold, average&#61;True):t0 &#61; time.time()weight &#61; weight.Tweight &#61; normalize(weight, norm&#61;&#39;l2&#39;, axis&#61;1)threshold &#61; 1.0-threshold # Conversion to distance measureclusters &#61; hcluster.fclusterdata(weight, threshold, criterion&#61;"distance", metric&#61;&#39;cosine&#39;, depth&#61;1, method&#61;&#39;centroid&#39;)z &#61; hac.linkage(weight, metric&#61;&#39;cosine&#39;, method&#61;&#39;complete&#39;)labels &#61; hac.fcluster(z, threshold, criterion&#61;"distance")labels_unique &#61; np.unique(labels)n_clusters_ &#61; len(labels_unique)#print(n_clusters_)elapsed_time &#61; time.time() - t0# print(elapsed_time)a&#61;np.array(labels)sort_idx &#61; np.argsort(a)a_sorted &#61; a[sort_idx]unq_first &#61; np.concatenate(([True], a_sorted[1:] !&#61; a_sorted[:-1]))unq_items &#61; a_sorted[unq_first]unq_count &#61; np.diff(np.nonzero(unq_first)[0])unq_idx &#61; np.split(sort_idx, np.cumsum(unq_count))first_ele &#61; [unq_idx[idx][-1] for idx in xrange(len(unq_idx))]return n_clusters_, first_ele


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
走过滴岁月688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有