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

CNN模型压缩——使用网络稀疏化方法(LearningEffcientConvolutionalNetworkthroughNetworkSliming)

文章目录IntroductionRelatedWork网络稀疏化(NetworkSlimming)whychoosechennel-levelspars

文章目录

  • Introduction
  • Related Work
  • 网络稀疏化(Network Slimming)
    • why choose chennel-level sparsify
    • how to implement
  • 在模型中加入BN(Batch Normalization)层




本文中的方法来自于论文《Learning Effcient Convolutional Network through Network Sliming》

论文:Learning Effcient Convolutional Network through Network Sliming

Introduction

CNN模型压缩最主要的是下面三个方面:

  1. 模型大小(model size),其中包含训练参数和关联的网络结构。
  2. 运行内存(run-time memory),包括加载训练参数等。
  3. 计算操作数量(numbers of computing operation)。

模型结构
相比于CNN网络,该方法做了以下修改:

  1. 训练的时候,在第iii层和第i+1i+1i+1层加入了一层chennel scaling factors的训练层,他们与前一层的卷积层意一一对应,与后一层卷积层使用全连接。
  2. 在训练完成之后,检查scaling层的参数,如果参数低于某一阈值就删除该chnnel,并且还要对其他channel进行微调。

Related Work

其他CNN模型压缩的方法还有:

  • Low-rank Decomposition,该方法对全连接层有奇效。
  • Weight Quantuzation,该方法通过hash将权重由一个较大的范围转变到一个较小的范围。例如,在MNIST中,将像素的值由[0,255]转变为[0,1][0,255]转变为[0,1][0,255][0,1]
  • weight pruning/Sparsify,权重剪枝,将一些值较小的一些权重删去,从而达到压缩的目的。
  • structured pruning/sparsify,t通过随机停用一些channel来达到压缩的目的,类似于TensorFlow中的Dropout层通过将一定数量的channel变为0类似。
  • neural architecture learning,这个类似于CNN中的Inception模型,让网络在预先的几个模型中进行学习,选择最好的。

网络稀疏化(Network Slimming)

稀疏化:按照我的理解即是淘汰部分对结果影响较低的权重、或者通道等。

why choose chennel-level sparsify


稀疏化可以用于不同维度。我们可以在weight-level、kernel-level、channel-level、layer-level进行稀疏化。


在weight-level、kernel-level进行处理,能够具有较高的压缩效率,同时还兼具灵活性和普遍性,但是往往需要软件以及硬件支持才能在准确度兼具的情况下进行。


相反,在layer-level层面上进行,就缺乏灵活性和普遍性,事实上只有在层数>50时,对layer进行稀疏化才能获得较好的效果。


在chennel层面进行稀疏化,能够在一定程度上兼具上述优点,同时不需要软件和硬件支持。


how to implement


在scaling层,如果仅仅只将factor较小的channel删除,那么仅仅只能压缩十分之一。因此,还需要对其他channel进行微调(fine-tune),在这里映入了L1-pealty loss即在最终的loss函数中加入正则化。
lossfunctiong:L=∑(x,y)l(f(x,W),y)+λ∑γ∈Tg(γ)loss functiong: \\ L = \sum_{(x,y)}l(f(x,W),y)+\lambda\sum_{\gamma\in \Tau}g(\gamma) lossfunctiong:L=(x,y)l(f(x,W),y)+λγTg(γ)
其中,(x,y)代表input,output,W表示训练权重,λ表示平衡前后loss的超参数,T表示scaling层的参数,一般g函数选择L1或者是smooth−L1(x,y)代表input,output,\\W表示训练权重,\\ \lambda表示平衡前后loss的超参数,\\ \Tau 表示scaling层的参数,\\一般g函数选择L1或者是smooth-L1(x,y)input,output,W,λloss,Tscaling,gL1smoothL1
下面是关于smooth-L1的解释:

L1;smooth={∣x∣if ∣x∣>α;1∣α∣x2if ∣x∣≤αL_{1;smooth} = \begin{cases}|x| & \text{if $|x|>\alpha$;} \\ \frac{1}{|\alpha|}x^2 & \text{if $|x| \leq \alpha$}\end{cases} L1;smooth={xα1x2if ∣x>α;if ∣xα


α\alphaα is a hyper-parameter here and is usually taken as 1. 1α\frac{1}{\alpha}α1 appears near x2x^2x2 term to make it continuous.


Smooth L1-loss combines the advantages of L1-loss (steady gradients for large values of xxx) and L2-loss (less oscillations(振荡,因为L1正则化当x在0附近时,会在-1,1振荡) during updates when xxx is small).


Another form of smooth L1-loss is Huber loss. They achieve the same thing. Taken from Wikipedia, Huber loss is
Lδ(a)={12a2for ∣a∣≤δ,δ(∣a∣−12δ),otherwise.L_\delta (a) = \begin{cases} \frac{1}{2}{a^2} & \text{for } |a| \le \delta, \\ \delta (|a| - \frac{1}{2}\delta), & \text{otherwise.} \end{cases} Lδ(a)={21a2δ(a21δ),for aδ,otherwise.
——引用自StackExchange


在模型中加入BN(Batch Normalization)层

在BN层中对数据进行下列变化:
z^=zin−μβσ2+ϵ;zout=γz^+β{\widehat{z}=\frac{z_{in} - \mu_{\beta}}{\sqrt{\sigma^2+\epsilon}}}; {z_{out} = \gamma \widehat{z}+\beta} z

=σ2+ϵ

zinμβ;zout=γz

+β
其中μβ为样本中位数,σ为方差,γ,β是可训练的参数其中\mu_{\beta}为样本中位数,\sigma为方差,\\\gamma,\beta 是可训练的参数 μβ,σ,γ,β
事实上,如果我们不加入BN层,scaling层的factor值就无法代表重要性(虽然我们依然可以通过参数来选择channel),因为我们可以将权重的值扩大n倍,将factor的值缩小n倍,而不会影响输出结果。
(待续)


推荐阅读
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本文将作为我硕士论文的一部分,但鉴于其内容的独特性和趣味性,决定单独发布。文中将定义一些皮亚诺公理,并介绍如何使用这些公理进行等式替换,以证明定理。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 工作中频繁在不同Linux服务器之间切换时,频繁输入密码不仅耗时还影响效率。本文介绍如何通过设置SSH密钥认证,简化登录流程,提高工作效率。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 使用OpenGL实现三维空间中任意两点间圆柱体管道的绘制
    本文介绍了如何利用OpenGL在三维空间中的任意两个点之间绘制具有指定半径的圆柱体管道。鉴于OpenGL较为底层,许多功能需自行实现,文中提供了详细的代码示例及解析。 ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
author-avatar
li-yuefang_883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有