热门标签 | 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倍,而不会影响输出结果。
(待续)


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 基于2-channelnetwork的图片相似度判别一、相关理论本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:《LearningtoCompar ... [详细]
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 本文介绍如何使用Java中的正则表达式来提取字符串中的特定值。通过示例代码和详细解释,帮助开发者掌握正则表达式的使用方法,尤其是如何匹配和提取复杂模式中的数据。 ... [详细]
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社区 版权所有