论文翻译 || 模型剪枝(2)——ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

【剪枝】ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression 剪枝的思想可以被总结为一句话:(以某一标准)评估每一个神经元的重要性,移除不重要的那些神经元,再finetune整个网络来恢复精度。所以,剪枝一般有三个阶段:filter selection,pruning,与fine-tuning。... 阅读详情

https://arxiv.org/abs/1707.06342

Abstract

我们提出了一个高效统一的框架,即ThiNet,在训练和推理阶段同时加速和压缩CNN模型。我们关注的是过滤器级别的剪枝,也就是说,如果整个滤波器不那么重要,那么它将被丢弃。我们的方法不改变原有的网络结构,因此它可以被任何现成的深度学习库完美地支持。我们将滤波器剪枝作为一个优化问题建立起来,并揭示我们需要根据从下一层计算的统计信息来修剪滤波器,而不是当前的层,这ThiNet与现有的方法不同。实验结果表明了该策略的有效性,提高了系统的性能。

  • 在ILSVRC- 12基准测试上,我们也展示了ThiNet的性能。ThiNet在vgg-16上实现了【3.31x】 FLOPs减少和【16.63X】压缩,前5位精度仅下降0.52%。
  • 用ResNet- 50进行的类似实验表明,即使是在一个紧凑的网络中,ThiNet也可以减少一半以上的参数和FLOPs,而代价是前5位精度下降约1%。
  • 此外,原始的VGG-16模型可以进一步修剪成仅5.05MB的非常小的模型,保持了AlexNet水平的精度,但泛化能力要强得多。

1 Introduction

【神经网络得到发展】
在过去的几年中,我们已经目睹了深层神经网络快速发展的计算机视觉领域,从基本的图像分类任务,比如ImageNet识别的挑战,一些更高级的应用程序,例如,对象检测,语义分割,图像字幕。与传统的基于人工设计视觉特征的方法相比,深度神经网络在这些领域取得了最先进的性能。
 
【引出压缩模型的问题】
尽管它取得了巨大的成功,但一个典型的深度模型很难部署到资源有限的设备上,例如移动电话或嵌入式设备。资源受限场景意味着 计算任务必须在有限的资源供应下完成,例如计算时间、存储空间、电池电量等。深度神经网络的主要问题之一是其巨大的计算成本和存储开销,这对移动设备构成了严峻的挑战。例如,VGG-16模型有13834万个参数,占用超过500MB的存储空间,需要309.4亿浮点运算(FLOPs)来对单个图像进行分类。这种笨重的模型很容易超出小型设备的计算极限。因此,网络压缩在学术界和工业界都引起了极大的兴趣。
 
【剪枝,压缩模型最流行的方法】
剪枝是目前最流行的降低网络复杂度的方法之一,在模型压缩领域得到了广泛的研究。在20世纪90年代,LeCun等人观察到,几个不重要的权重可以从训练过的网络中移除,而精度损失可以忽略不计。这一过程类似于哺乳动物大脑中的生物现象,即神经元突触的数量在儿童早期达到峰值,随后在发育过程中逐渐减少。但这些方法主要基于二阶导数,内存和计算成本昂贵,不适用于今天的deep模型。
 
【已有的剪枝策略,以及局限性、针对局限性的优化方式】
最近,Han et al.[10]引入了一种简单的剪枝策略:去除权重低于阈值的所有连接,然后微调以恢复其精度。这个迭代过程被执行了几次,生成了一个非常稀疏的模型。然而,这种非结构化稀疏模型不能被现成的库支持,因此需要专门的硬件和软件来进行有效的推理,这在现实应用中是困难和昂贵的。另一方面,非结构化随机连接忽略了缓存和内存访问问题。正如[32]所示,由于随机连接导致的缓存局域性差和跳跃内存访问,实际的加速非常有限(有时甚至会变慢),尽管实际的稀疏性相对较高。
 
为了避免上述非结构化剪枝的局限性,我们建议【滤波器级别剪枝】是更好的选择。去掉整个不重要的过滤器的好处有很多:

  • 1)剪枝模型在网络结构上没有差异,因此可以被任何现成的深度学习库完美支持。
  • 2)内存占用将大大减少。这种记忆减少不仅来自于模型参数本身,也来自于中间激活,这在以往的研究中很少被考虑。
  • 3)由于修剪后的网络结构没有被破坏,可以通过其他压缩方法进一步压缩和加速,如参数量化方法[33]。
  • 4)使用剪枝模型可以大大加速更多的视觉任务,如目标检测或语义分割。
     

【本文提供的剪枝策略】
在本文中,我们提出了一个统一的框架,即ThiNet (Thin Net),用来对不重要的滤波器进行删减,从而在训练和测试阶段同时加速和压缩CNN模型,性能下降很小。有了我们的修剪网络,一些重要的传输任务,如目标检测或细粒度识别可以运行得更快(训练和推理),特别是在小型设备上。我们的主要观点是,我们建立了一个定义良好的优化问题,它表明一个滤镜是否可以被修剪取决于它的下一层的输出,而不是它自己的层。这一新发现使ThiNet有别于现有的方法,即使用从它们自己的层计算出的统计数据来修剪滤波器。
 

然后,我们将提出的方法与其他最先进的标准进行比较。实验结果表明,该方法明显优于现有方法,特别是在压缩率较高的情况下。我们在大规模的ImageNet分类任务中评估ThiNet。

  • ThiNet在vgg-16模型[28]上实现了3.31× FLOPs减容和16.63× compression,前5位精度仅下降0.52%。
  • 与经典的CNN模型相比,ResNet-50[11]模型的冗余度更小。ThiNet仍然可以减少2.26× FLOPs和2.06×参数,前5位精度下降约1%。
  • 为了探究ThiNet的局限性,我们发现原始的VGG-16模型甚至可以剪成5.05MB,但仍然保持AlexNet水平的精度。
     

此外,我们也探讨了ThiNet在一个更实际的任务,即小尺度数据集上的迁移学习中的性能。实验结果表明,ThiNet具有良好的有效性,在模型尺寸和精度之间取得了最佳的平衡
 

【ThiNet 的优势和贡献】
本文的主要优势和主要贡献可以总结如下。

  • 我们提出了一个简单而有效的框架,即ThiNet,来同时加速和压缩CNN模型。在许多任务上,ThiNet比现有的方法有了显著的改进。
  • 我们正式建立了过滤器修剪作为一个优化问题,并揭示了我们需要使用从下一层计算的统计信息来修剪过滤器,而不是当前层,这将ThiNet与现有方法区别开来。
  • 在实验中,VGG-16模型可以精简为5.05MB,在迁移学习方面显示出良好的泛化能力。利用ThiNet建立更精确的模型可以保持更高的精度。

2 Related work

许多研究人员发现,深度模型遭受严重的过度参数化。例如Denil等人[4]证明了只需原始参数的一个小子集就可以有效地重构网络。然而,这种冗余在模型训练中似乎是必要的,因为目前的技术很难解决高度非凸优化[5,13]。因此,在它的训练后,有很大的需要缩小模型的尺寸。
提出了一些在模型尺寸和精度之间寻求平衡的方法。Han等人[10]提出了一种迭代剪枝方法来去除深层模型中的冗余。他们的主要观点是,低于阈值的轻量级连接应该被丢弃。在实践中,这可以通过应用“L1”或“L2”正则化来推动连接性值变得更小。这种策略的主要缺点是缺乏普遍性和灵活性,因此在实际应用中似乎不太实用。
 
为了避免这些弱点,一些注意力集中在群体的稀疏性上。Lebedev和Lempitsky[19]探讨了群稀疏卷积,将群稀疏正则化引入到损失函数中,某些整组权值会缩小到零,从而可以被去除。同样,Wen等[32]提出了结构化稀疏学习(Structured Sparsity Learning, SSL)方法来正则化滤波器、信道、滤波器形状和深度结构。尽管他们取得了成功,但原有的网络结构已经被摧毁。因此,需要一些专用的库来有效地加速推理。
 
在我们的工作中,我们也探索了一些过滤级别的剪枝策略。其核心是评估神经元的重要性,这在社区中得到了广泛的研究[34,27,21,14,23]。最简单的方法是基于权重的大小。Li等人[21]通过计算每个滤波器的绝对权重和来测量其重要性。另一个实用的标准是测量ReLU函数后激活的稀疏性。Hu等人[14]认为,如果某些神经元的大部分输出为零,这些激活应该是冗余的。他们计算每个过滤器的0的平均百分比(APoZ)作为其重要性评分。这两个标准简单明了,但与最终的损失没有直接关系。受此启发,Molchanov等[23]采用泰勒展开来近似去除每个滤波器对损失函数的影响。

 
除了修剪,还有其他的策略来获得小的CNN模型。一种流行的方法是参数量化[8,3,33,9]。低秩近似也得到了广泛的研究[5,29]。需要注意的是,这些方法是对滤波器剪枝的补充,可以结合ThiNet进行进一步的改进。

3 ThiNet

在本节中,我们将全面介绍我们的滤波器级剪枝方法:ThiNet。首先,将提出总体框架。接下来,我们将更详细地介绍我们的选择算法。最后,我们将展示我们的剪枝策略,它兼顾了效率和有效性。

3.1 ThiNet 框架

剪枝是降低模型复杂度的一种经典方法。尽管存在着巨大的差异(例如在选择什么应该被修剪的不同标准),但在深度神经网络中修剪过滤器的总体框架是相似的。可以用一句话来概括:评估每个神经元的重要性,去掉不重要的,微调整个网络。
 
这个框架如图1所示。在下一小节中,我们将重点介绍虚线框部分,以介绍我们的数据驱动通道选择方法,它确定要删除的通道(及其相关的滤波器)。
在这里插入图片描述

  • 图1所示。ThiNet的插图。首先,我们将重点放在虚线框部分,以确定几个弱通道及其对应的滤波器(在第一行用黄色突出显示)。这些通道(及其相关的过滤器)对整体性能的贡献很小,因此可以丢弃,从而导致修剪模型。最后,对网络进行微调以恢复其准确性。(这张图最好是彩色的。)
     

【ThiNet框架流程】
给定一个预先训练好的模型,按照预先设定的压缩率逐层进行修剪。我们将我们的框架总结如下:

  • 1 【滤波器的选择】。不像现有的方法,用第 i i i层的统计数据来指导第 i i i层的剪枝,我们的方法是用第 i + 1 i+1 i+1层来指导第 i i i层的修剪。
    关键的想法是:如果我们可以使用的一个 第 i + 1 i+1 i+1层的输入的 子channels 来接近 第 i + 1 i+1 i+1层的输出,输入的中的其他channels可以安全地删除。注意,第 i + 1 i+1 i+1层的一个channels是由第 i i i层的一个滤波器产生,因此我们可以安全地修剪第 i i i层中相应的滤波器。
  • 2 【剪枝】。第 i + 1 i+1 i+1层的输入中的弱通道和它们在第 i i i层中的对应滤波器将被删除,来得到一个更小的模型。注意,修剪后的网络具有完全相同的结构,但具有更少的滤波器和通道。换句话说,原来的宽网络变得thinner。这就是为什么我们称我们的方法为“ThiNet”。
  • 3 【微调】。为了恢复因滤波器剪枝而导致的泛化能力受损,需要进行微调。但对于大型数据集和复杂模型来说,这需要很长时间。为了节省时间,我们在修剪一层后微调一到两个epoch。为了得到一个准确的模型,当所有的层都被修剪后,将进行额外的epoch。
  • 4 【迭代到步骤1来修剪下一层】。

3.2 数据驱动的通道选择

我们使用 ( L i , W i , ∗ ) (L_i, W_i,∗) (Li​,Wi​,∗)三元组来表示第 i i i层的卷积过程,其中 L i ∈ R C × H × W L_i∈R^{C×H×W} Li​∈RC×H×W是输入张量,它有C通道、H行和W列。 W i ∈ R D × C × K × K W_i∈R^{D×C×K×K} Wi​∈RD×C×K×K是一组具有 K × K K×K K×K核大小的滤波器,它生成一个新的具有 D D D通道的张量。
我们的目标是删除 W i W_i Wi​中一些不重要的滤波器。注意,如果 W i W_i Wi​中的滤波器被移除,它在 L i + 1 L_{i+1} Li+1​和 W i + 1 W_{i+1} Wi+1​中的对应通道也会被丢弃。然而,由于第 i + 1 i+1 i+1层的滤波器数没有改变,其输出张量的大小,即 L i + 2 L_{i+2} Li+2​,将保持完全相同。受此启发,我们认为,如果我们去掉几个对 L i + 2 L_{i+2} Li+2​(也是第 i + 1 i+1 i+1层的输出)影响不大的过滤器,对整体性能的影响也会很小。也就是说,最小化 L i + 2 L_{i+2} Li+2​的重构误差与网络的分类性能密切相关。


3.2.1 收集训练样本

在这里插入图片描述
为了确定哪些通道可以安全地移除,我们将收集一个用于重要性评估的训练集。如图2所示,从张量 L i + 2 L_{i+2} Li+2​ (ReLU之前)中随机抽样一个元素,用y表示。也可以根据其位置确定相应的滤波器 W ^ ∈ R C × K × K \hat{W} ∈R^{C×K×K} W^∈RC×K×K和滑动窗口 x ∈ R C × K × K x∈R^{C×K×K} x∈RC×K×K (ReLU后)。为了更清楚地表示,这里省略了一些索引符号。通常,用相应的偏置b可以计算卷积运算,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中 y ^ = y − b \hat{y}= y-b y^​=y−b。值得注意的是, x ^ \hat{x} x^ 和 y ^ \hat{y} y^​是随机变量,它们的实例化需要固定的空间位置索引,通过 c c c、 k 1 k_1 k1​ 和 k 2 k_2 k2​获取。一个关键的观察结果是 x ^ = ( x 1 ^ , x 2 ^ , . . . x C ^ ) \hat{x}=(\hat{x_1},\hat{x_2},...\hat{x_C}) x^=(x1​^​,x2​^​,...xC​^​) 中的channels 是独立的: x c ^ \hat{x_c} xc​^​ 只与 x c , : , : x_{c,:,:} xc,:,:​独立,不与 x c ′ , : , : x_{c',:,:} xc′,:,:​ 独立,当 c ′ ≠ c c'\neq c c′​=c
换句话说,如果我们能找到一个子集 S ⊂ { 1 , 2 , . . . C } S⊂ \{1,2,...C\} S⊂{1,2,...C},让等式(4)总是成立,那么如果 c ∉ S c \notin S c∈/​S,我们不需要任何 x c ^ \hat{x_c} xc​^​,并且这些变量可以在不改变CNN模型结果的情况下安全地移除
在这里插入图片描述
当然,Eq. 4对于随机变量 x ^ \hat{x} x^ 和 x ^ \hat{x} x^的所有实例并不总是正确的。然而,我们可以手动提取它们的实例,以找到一个子集S,使Eq. 4近似正确。
给定一个输入图像,我们首先在正向运行CNN,计算出 第 i + 1 i+1 i+1的输入和输出。那么对于任意可行的 ( c , k 1 , k 2 ) (c, k_1, k_2) (c,k1​,k2​)三元组,我们可以得到一个 c c c维向量变量 x ^ = ( x 1 ^ , x 2 ^ , . . . ( ^ x C ) ) \hat{x}=(\hat{x_1},\hat{x_2},...\hat(x_C)) x^=(x1​^​,x2​^​,...(^​xC​)) 和标量值 y ^ \hat{y} y^​,使用Eq. 1到Eq. 3。由于 x ^ \hat{x} x^和 y ^ \hat{y} y^​可以被视为随机变量,因此可以通过选择不同的输入图像、不同的通道、不同的空间位置来采样更多的实例。
在这里插入图片描述
 


3.2.2 cnannels选择的贪婪算法

现在,给定一组 m m m (图像数量与位置数量的乘积)的训练样例 { ( x i ^ , y i ^ ) } \{(\hat{x_i},\hat{y_i})\} {(xi​^​,yi​^​)},原始channels选择问题变成了以下优化问题:
在这里插入图片描述
这里 ∣ S ∣ |S| ∣S∣是子集 S S S中的元素个数, r r r 是预定义的压缩率(即保留多少通道)。同样,设 T T T为已删除的子集通道( S ∪ T = { 1 , 2 , … , C } , S ∩ T = ∅ S∪T =\{1,2,…,C\}, S∩T =∅ S∪T={1,2,…,C},S∩T=∅),可最小化如下备选目标:
在这里插入图片描述
Eq. 6与Eq. 5等价,但速度更快,因为 ∣ T ∣ |T| ∣T∣通常小于 ∣ S ∣ |S| ∣S∣。求解Eq. 6仍然是NP hard,因此我们使用贪婪策略(如算法1所示)。我们每次向 T T T 添加一个元素,在当前迭代中选择导致目标值最小的通道。显然,这个贪婪解是次优的。但这种差距可以通过微调来弥补。我们还尝试了其他一些复杂的算法,如稀疏编码(特别是同伦方法[6])。然而,我们的实验表明,我们的简单贪心方法具有更好的性能和更快的速度。
 


3.2.3 最小化重构误差

到目前为止,我们已经得到了子集 T T T,使得当 n ∈ T n∈T n∈T时,第 i + 1 i+1 i+1层每个滤波器中的第 n n n通道都可以被安全地删除。因此,前一层 i i i中相应的滤波器也可以被修剪。现在我们将 进一步减小重构误差(c.f。Eq. 5)通过weighing the channels,可定义为:
在这里插入图片描述
其中 x i ∗ ^ \hat{x_i^*} xi∗​^​表示channels选择后的训练样本。Eq. 7是一个经典的线性回归问题,它有一个唯一的封闭解,使用普通最小二乘方法: w ^ = ( X T X ) ) − 1 X T y \hat{w} = (X^TX))^{-1}X^Ty w^=(XTX))−1XTy。
w ^ \hat{w} w^中的每个元素都可以视为对应滤波器通道的比例因子, W : , i , : , : = w i ^ W : , i , : , : W_{:,i,:,:} =\hat{w_i}W_{:,i,:,:} W:,i,:,:​=wi​^​W:,i,:,:​。从另一个角度来看,这种缩放操作为微调提供了更好的初始化,因此网络更有可能达到更高的精度

3.3 压缩策略

【两种网络体系结构】
主要有两种不同的网络体系结构:传统的卷积/全连接体系结构,以及最近的结构变体。前者以AlexNet[18]或VGGNet[28]为代表,后者主要包括近期出现的googleNet[30]、ResNet[11]等网络。这两种类型的主要区别在于,较新的网络通常用全球平均池化层代替FC层[22,3],并采用一些新颖的网络结构,如google中的Inception或ResNet中的残块。
 
【对于VGG的剪枝策略】
我们使用不同的策略来修剪这两种类型的网络。对于VGG-16,我们注意到90%以上的FLOPs存在于前10层(conv1-1 to conv4-3),而FC层贡献了近86.41%的参数。因此,为了加速考虑,我们修剪了前10层,用全局平均池化层代替了全连接层。虽然所提出的方法也适用于FC层,但我们认为去除它们更简单、更有效。
 
【对于ResNet的剪枝策略】
对于ResNet,由于其特殊的结构,存在一些限制。例如,为了完成求和操作,同一组中每个block的通道数 需要保持一致。因此,很难直接对每个残差块的最后一个卷积层进行修剪。由于大多数参数位于前两层,因此修剪前两层是一个很好的选择,如图3所示
在这里插入图片描述

4 Experiments

本节对ThiNet的性能进行了实证研究。首先,对几种不同的滤波器选择标准进行比较。实验结果表明,该方法明显优于其他方法。然后,我们将报告在ILSCVR-12上的性能。两种广泛使用的网络都进行了修剪:VGG-16和ResNet-50。最后,我们关注一个更实用的场景来展示ThiNet的优势。所有实验均在caffe内进行。

4.1 不同滤波器的选择标准

【已有的剪枝策略】
文献中有一些启发式的标准来评估每个滤波器的重要性。我们将我们的选择方法与两个最近提出的标准进行比较,以证明我们的评价标准的有效性。这些标准简要总结如下:

  • 【权重之和】。具有较小核权重的滤波器往往产生较弱的激活。因此,在这个策略中,计算每个滤波器的绝对和,作为它的重要性分数 s i = ∑ ∣ W ( i , : , : , : ) ∣ s_i = \sum|W(i,:,:,:)| si​=∑∣W(i,:,:,:)∣。
  • 【APoZ(0的数量的平均百分比)】。该准则 计算输出激活中各通道的稀疏性,作为其重要性分数 s i = 1 ∣ L ( i , ; , ; ∣ ) ∑ ∑ I ( L ( i , ; , ; ) ) = = 0 ) s_i = \frac{1}{|L(i,;,;|)}\sum \sum \mathbb{I} (L(i,;,;))==0) si​=∣L(i,;,;∣)1​∑∑I(L(i,;,;))==0),其中 ∣ L ( i , : , : ) ∣ |L(i,:,:)| ∣L(i,:,:)∣为张量 L L L(ReLU后)在第 i i i个通道中的元素数, I ( ⋅ ) \mathbb{I}(·) I(⋅)为指标函数。
     

【vgg在 CUB-200 上的剪枝介绍】
为了比较这些不同的选择方法,我们在广泛使用的细粒度数据集上评估了它们,数据集:CUB-200[31]上的性能,该数据集包含200种不同鸟类的11788张图像(分别为5994/5794张用于训练/测试)。除了标签外,没有额外的监督信息(如边界框)被使用。
 
按照3.3节中的修剪策略,VGG-16中

  • 所有的FC层都被删除,并用一个全局平均池化层替换,并在新的数据集上进行微调。
  • 从这个经过微调的模型开始,我们用不同的压缩率逐层裁剪网络。每次修剪之后都有一个epoch微调,在最后一层执行12个epoch以提高准确性。这个过程 用不同的channel选择策略重复几次。
  • 由于ThiNet的随机性,我们重复了我们的方法4次,并报告了平均结果。
     

图4显示了CUB bird数据集上的修剪结果。我们也评估了在相同的修剪策略下随机选择的性能。此外,我们还对另一种不含最小二乘的ThiNet(用 【ThiNet w/o w ^ \hat{w} w^】表示)进行了评估,以证明我们方法中最小二乘的有效性。显然,与其他的选择方法相比,ThiNet取得了一致且明显更高的精度。
一个有趣的结果是:随机选择显示了相当好的性能,在某些情况下甚至比启发式标准更好。事实上,根据分布式表示的性质(即每个concept由多个神经元表示;而且,每个神经元都参与了许多concept的表示[12,1],随机选择的通道在理论上可能非常强大。然而,这一标准并不可靠。如图4所示,它会导致非常糟糕的结果,所有层压缩后的精度非常低。因此,随机选择在实践中并不适用。
在这里插入图片描述
 
【权重总和】在 CUB-200 上的精度很差。这个结果是合理的,因为它只考虑了核权值的大小,这与最终的分类精度没有直接关系。事实上,较小的权重仍然可能对损失函数产生较大的影响。当我们同时丢弃大量的小滤波器时,最终的精度会受到很大的破坏。例如,如果我们使用小权重准则去除conv1-1中60%的过滤器,top-1精度仅为40.99%(微调前),而随机准则为51.26%。相比之下,我们的方法【ThiNet w/o w ^ \hat{w} w^】可以达到68.24%,用最小二乘法(ThiNet)可以达到70.75%。权重总和的精度损失是如此之大,以至于微调不能完全从下降中恢复它。
 
相比之下,我们的方法显示了更高的和稳健的结果。最小二乘方法确实有助于获得更好的权值初始化以进行微调,特别是在压缩率相对较高的情况下。

4.2 VGG-16 on ImageNet

我们现在评估 ThiNet在大规模ImageNet分类任务中的性能。ILSCVR-12数据集[26]由来自1000个类别的超过100万张训练图像组成。我们从训练集的每个类别中随机选择10张图像来组成我们的评估集(即为通道选择收集的训练示例)。对于每个输入图像,如3.2.1节所述,随机采样10个实例,使用不同的通道和不同的空间位置。因此,通过算法1寻找 optimal channel subset 的 训练样本总共有100,000个。我们比较了几种不同的图像选择和位置数目,发现当前的选择(每类10张图像和每幅图像10个位置)足以评价神经元的重要性。最后,使用单视图测试方法(central patch only),在50k标准验证集上报告了top-1和top-5分类性能。
 

【vgg在 ImageNet 上的剪枝操作】

  • 在微调过程中,将图像大小调整到256 × 256,然后采用224 × 224的随机裁剪将数据输入网络。水平翻转也用于数据增强。
  • 在推断阶段,我们将调整大小的图像中间裁剪为224 × 224。这里不再使用任何技巧。
  • 整个网络一层一层的修剪,并使用学习率 1 0 − 3 10^{-3} 10−3 在一个 epoch上进行微调。因为每组的最后一层(即conv1-2 conv2-2, conv3-3)更重要(修剪这些层会导致很大的准确性下降),我们调整这些层使用学习率 1 0 − 4 10^{-4} 10−4 在一个 epoch上,以防止精度下降太多。修剪的最后一层时,更多的epoch(12epoch),采用学习速率不同从 1 0 − 3 10^{-3} 10−3 到 1 0 − 5 10^{-5} 10−5 ,从而得到得到一个精确的结果。
  • 我们使用的是SGD,小批尺寸为128,其他参数与原VGG保持一致。
     

【vgg在 ImageNet 上的剪枝实验结果】

  • 我们在表1中总结了ThiNet方法的性能。这里的 ThiNet-Conv 是指如上所述,只对前10个卷积层进行修剪,压缩率为0.5(即每一层去掉一半的滤波器,直到conv4-3)的模型。由于一些无用的滤波器被丢弃,剪枝模型甚至可以优于原始的VGG-16模型。
    然而,如果我们从头训练这个模型,top-1/top-5的准确率分别只有67.00%/87.45%,这比我们的修剪网络差得多。
  • 然后,FC层被移除,用GAP(全球平均池)层代替,并在12个epoch用相同的超参数进行微调,用“ThiNet-GAP”表示。由于模型尺寸大幅减小,GAP模型的分类精度略低于原始模型。在更高的压缩率(用“ThiNet-Tiny”表示)下,可以得到进一步的压缩,这将在后面讨论。
     

【vgg在 ImageNet 上的剪枝的提速】

  • 也提出了ThiNet的实际加速。我们在Caffe中使用官方的“time”命令测试每个模型的向前/向后运行时间。该评估是在一个批大小为32的M40 GPU上进行的,使用cuDNN v5.1加速。由于卷积运算是VGG-16的主要计算开销,减少FLOPs可以大大提高推理速度,如表1所示。在这里插入图片描述

 
【几种最先进的剪枝方法进行比较】
在VGG-16模型上,我们将我们的方法与几种最先进的剪枝方法进行比较,如表2所示。这些方法也关注于滤波器级剪枝,但选择标准完全不同。

 
【APoZ】

  • APoZ[14]的目标是减少参数数量,但其性能有限。
    APoZ-1去掉了几个层(conv4、conv5和FC层),导致了显著的精度下降。
    APoZ-2只对conv5-3和FC层进行修剪。虽然该模型的精度得到了提高,但几乎没有减少FLOP。因此,需要对卷积层进行压缩。

 
【Taylor】

  • 相比之下,Molchanov等人[23]注重模型加速,只对卷积层进行修剪。他们认为,如果滤波器对损耗函数的影响很小,就可以安全地去除滤波器。但计算过程非常耗时,因此他们使用泰勒展开来近似损失变化。他们的动机和目标与我们相似,但选择标准和训练框架完全不同。
  • 如表2所示,ThiNet Conv模型明显优于泰勒方法。我们的模型甚至可以通过减少更多的错误次数来提高分类的准确性。

 
【ThiNet- ws】

  • 关于weight sum[21],他们还没有探索它在VGG-16上的性能。因此,我们在ThiNet框架中简单地用权重和代替我们的选择方法,并报告以“ThiNet- ws”表示的最终精度。除选择标准外,其余参数均保持一致。请注意,不同的微调框架可能会导致非常不同的结果。因此,如果Li等人使用他们自己的框架进行了这一操作,其准确性可能会有所不同。因为其他设置是相同的,比较ThiNet- ws和ThiNet是公平的,ThiNet获得了更好的结果。

 
【ThiNet-Tiny】

  • 为了探索ThiNet的局限性,我们以更大的压缩率0.25对VGG-16进行修剪,在卷积层中实现了16×参数的缩减。conv5层也被修剪成更小的模型。对于与最终特征表示直接相关的conv5-3,为了精度考虑,我们只修剪了一半的滤波器。
  • 利用这些较小的压缩比,我们训练出一个非常小的模型。在表1中表示为 “ThiNet-Tiny”,它只占用5.05MB的磁盘空间(1MB=2 20字节),但仍然具有AlexNet水平的精度(AlexNet的top-1/top-5精度分别为57.2%/80.3%)。ThiNet-Tiny的模型复杂度与最近提出的compact网络SqueezeNet[15]完全相同,但精度较高。尽管ThiNet-Tiny需要更多的FLOPs,但它的实际速度甚至比SqueezeNet还要快,因为它的网络结构要简单得多。SqueezeNet采用了一种特殊的结构,即Fire module,该模块参数高效,但依赖于人工网络结构设计。相比之下,ThiNet是一个统一的框架,如果我们从一个更精确的模型出发,就会得到更高的精度。
    在这里插入图片描述

4.3 ResNet-50 on ImageNet

我们还探讨了ThiNet在最近提出的强大的CNN架构:ResNet上的性能。我们选择ResNet-50作为ResNet系列的代表,它的架构与系列中其他完全相同,差别不大。
 
【ResNet上剪枝的操作】
与VGG-16类似,我们反复地将ResNet-50从区块2a修剪到5c。除滤波器外,批次归一化层中对应的通道也被丢弃。修剪之后,使用学习率为 1 0 − 4 10^{-4} 10−4进行微调一个epoch。9个epoch的微调和学习速率变化从 1 0 − 3 10^{-3} 10−3 到 1 0 − 5 10^{-5} 10−5执行在最后一轮之后,获得更高的精度。其他参数与我们的VGG-16剪枝实验保持一致。
 
【ResNet上剪枝的结果】
因为ResNet是一个最近提出的模型,文献中缺乏足够的作品来压缩这个网络。我们报告了ThiNet在修剪ResNet-50时的性能,如表3所示。我们用3种不同的压缩率(每个块分别保留70%、50%、30%的滤波器)对该模型进行修剪。不像VGG-16, ResNet更紧凑。存在较少的冗余,因此修剪大量的过滤器似乎更具挑战性。尽管如此,我们的方法ThiNet-50仍然可以修剪一半以上的参数,top-5准确率下降约1%。还可以进行进一步的剪枝,得到更小的模型,但代价是更多的精度损失。
在这里插入图片描述
 
【ResNet上剪枝的问题】
然而,减少的FLOPs并不能给ResNet带来同样水平的加速。由于ResNet-50的结构约束,非张量层(如批处理归一化和池化层)在GPU上占用了40%以上的推断时间。因此,对这些非张量层进行加速是很有必要的,这应该在将来进行探索。
在这个实验中,为了简单起见,我们只修剪了ResNet中每个块的前两层,保留块输出和projection shortcuts 方式不变。修剪这些部分会进一步的压缩,也会相当困难。这种探索似乎是未来工作的一个有希望的扩展。

4.4 剪枝模型的领域适应能力

ThiNet的一个主要优点是我们没有改变网络结构,因此在ImageNet上修剪的模型可以很容易地转移到其他领域。为了帮助我们更好地理解这个好处,让我们考虑一个更实用的场景:在特定数据集上获得一个小模型。在实际应用程序中,这是一个非常常见的需求,因为我们不会直接在实际应用程序中应用ImageNet模型。要实现这个目标,有两种可行的策略:从预先训练的ImageNet模型开始,然后对新数据集进行修剪,或者从零开始训练一个小模型。在本节中,我们认为,如果我们对一个在ImageNet上压缩的已经修剪过的模型进行微调,那将是一个更好的选择。
在两个不同的特定数据集上比较这些策略:用于细粒度分类的CUB-200和用于场景识别的Indoor-67。我们在4.1节中介绍了CUB-200。对于Indoor-67,我们遵循官方的训练/测试分割(5360训练和1340测试图像)来组织这个数据集。所有的模型都用相同的超参数和epoch进行了微调,以便进行公平的比较。其性能如表4所示。
在这里插入图片描述
 
【微调–>剪枝】

  • 我们首先在新的数据集上微调预先训练好的VGG-16模型,这是在许多识别任务中采用的一种流行策略。正如我们所看到的,经过微调的模型以庞大的模型尺寸和缓慢的推理速度为代价拥有最高的准确性。
  • 然后,我们使用提出的ThiNet方法来修剪一些不重要的滤波器(表示为“FT & prune”),将笨重的模型转换成一个更小的模型。在小规模的训练实例中,不能完全恢复剪枝模型的精度,即剪枝模型容易陷入不良的局部极小值。然而,如果我们用同样的结构从头开始训练一个网络,它的准确性可能会低得多。

 
【剪枝–>微调】

  • 我们建议对ThiNet模型进行微调,该模型首先使用ImageNet数据进行修剪。如表4所示,该策略在模型规模和分类精度之间取得了最好的平衡。值得注意的是,ThiNet-Conv模型甚至可以获得与原始VGG-16相似的精度,但体积更小,速度更快。
    我们也报告了ThiNet-Tiny在这两个数据集上的性能。虽然ThiNet-Tiny与ImageNet上的AlexNet具有相同的精度水平,但它表现出更强的泛化能力。当转换到特定领域的任务时,这个小模型的分类精度比AlexNet高3% ~ 8%,而参数更少。而且它的模型尺寸足够小,可以部署在资源有限的设备上。
ThiNet:一种深度卷积网络压缩的过滤器级别剪枝方法 文章全名:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression 原文链接 简介 过去几年计算机视觉方面发展迅速,各种模型被提出来提升精度,但是有一个很现实的问题,这些模型对硬件要求高,导致模型受限制无法部署在一些可移动设备上。模型压缩是因此被提出,剪枝也是其中一个非常火的方向去减少模型复杂度。在本... 阅读详情

相关推荐

ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression 1. 架构 在给定预先训练的模型的情况下,将以预定义的压缩率逐层修剪该模型。框架总体如下: 滤波器选择。如果我们能用第(i+1)(i+1)(i+1)层输入中的一个通道子集来近似第i+1i+1i+1层的输出,可以将(i+1)(i+1)(i+1)层的其它通道(补集)剔除。同时,第(i+1)(i+1)(i+1)层的输入feature map的一个通道是由第iii层

安静到无声 744

ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression 论文学习

Abstract 作者提出了一个高效、统一的框架,在训练和测试阶段同步进行CNN模型的加速和压缩。本文聚焦于滤波器级别的裁剪,如果某滤波器不重要,就将其整个去除。该方法不会改变原有网络的结构,因而可以用现有的深度学习框架全部实现。作者将滤波器裁剪任务看作为一个优化问题,我们应该基于下一层的统计信息来裁剪滤波器,而不是当前层,这是ThiNet 和其它方法的不同之处。实验结果证明了该方法的有效性。作者...

calvinpaean的博客 1045

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 292

【每周CV论文推荐】初学模型剪枝值得阅读的文章

欢迎来到《每周CV论文推荐》。在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的。模型剪枝是非常重要的模型优化与压缩方法,本次我们来简单给大家推荐一些初入该领域值得阅读的工作。作者&编辑 | 言有三1 基于优化目标的连接剪枝模型剪枝的思想可以追溯到上个世纪LeCun等人的研究,Optimal Brain Damage,他们通过建立...

hacker_long的专栏 507

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 157

【信息科学与工程学】【人工智能】第一篇 人工智能算法知识库01

编号格式说明示例数量分配​8位数字,前2位主类,中间2位子类,后4位序号99,999,999个。

weixin_49199313的博客 1876

ThiNet:A Filter Level Pruning Method for Deep Neural Network Compression论文笔记/翻译

目录摘要一,介绍二,相关工作三,ThiNet3.1. ThiNet的框架新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 原文地址 为了写主题为剪枝的毕业论文来看这篇论文,时间紧迫有所取舍,不涉及剪枝的部分,总结性的废话适当

weixin_43998119的博客 539

【信息科学与工程学】【通信工程】第一百五十五篇 网络拓扑学09

聚焦云数据中心(多region多AZ+多边缘DC)与城域网5G/6G网络一体化的拓扑学编号类型领域问题问题的数学分析(拓扑学+其他)参数列表及参数的数值范围关联知识A166图论/组合优化云原生数据湖如何用Apache Hudi的Timeline拓扑优化增量查询?​1. 拓扑学分析(详细): - 拓扑结构:Apache Hudi使用Timeline管理表的历史变更,Timeline是一个时间轴上的DAG。每个Instant(提交、 compaction、 cleaning等)是一个节点,节点之间按时间顺

weixin_49199313的博客 222

计算机复试专业英语:高频技术词三维实战训练法

计算机复试专业英语不是词汇记忆任务,而是面向真实问答场景的技术概念表达能力。其核心在于理解术语在机器学习、深度学习与系统部署等技术语境中的多义性、搭配逻辑与演进脉络。从梯度下降(gradient descent)到注意力机制(attention mechanism),每个热词都需绑定‘定义-对比-归因’三类高频问题模板,并嵌入技术链(如quantization→PTQ/QAT→INT4压缩)中动态掌握。这种基于场景、原理与工程落地的立体训练,显著提升考生在压力下精准输出技术思想的能力,尤其适用于考研复试中解

weixin_34342905的博客 234

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 282

模型剪枝最经典论文8篇.rar

2017-2020CVPR、ECCV Oral剪枝方向论文8篇,包括Hrank、AutoCompress、ThiNet、DMCP、MetaPruning等等,非常适合需要了解模型剪枝,模型压缩的新手

【下载】6 篇论文,6 种最前沿剪枝算法

本文转自『机器之心编译』(almosthuman2014)下载方式,见文末剪枝是一种帮助神经网络实现规模更小、效率更高的深度学习方法。这是一种模型优化技术,它删除权重张量中不必要的值,从...

机器学习算法与Python学习 1494

LVGL与STM32的理解(基于正点原子资料)

我们要在lcd_draw_fast_rgb_color里面实现对屏的具体操作(也就是在这里实现自己的代码)。lcd_set_window、lcd_write_ram_prepare、lcd_wr_data这三个函数是本例程LCD屏的控制函数(也就是自己写的函数)。以下是stm32工程的文件目录,GUI_APP也可以忽略(细节参考正点原子例程):这里主要是再次加强一下印象,主要就是把。,里面的lcd_init()与lcd_display_dir是。它们都是LVGL的接口,按照它们的需求,把内容给它们即可。

weixin_39257775的博客 3437

总结一下最近看的关于剪枝的论文

关于剪枝的几种方法 文章目录关于剪枝的几种方法前言一、ThiNet二、Channel Purning for Accelerating Very Deep Neural Networks三,基于深度神经网络二阶信息结构化剪枝算法总结 前言 随着人工智能时代的到来,深度学习也越来越受重视,语音识别,目标检测,自然语言处理等热门的领域目前都会用到深度网络,虽然深度网络可以很好的提取特征,但是这同样也会带来一个很大的问题,就是网络的参数量。我们无法将其运用到一些算力很小的设备上,比如说无人机,手机等。于是对于

Jack11998的博客 2143

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载)

本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。

weixin_29046611的博客 266

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

ICCV 2017 Learning Efficient Convolutional Networks through Network Slimming(模型剪枝)

前言 这篇文章是ICCV 2017的一篇模型压缩论文,题目为《 Learning Efficient Convolutional Networks through Network Slimming》。2019年有相当多的关于YOLOv3的剪枝开源工程,他们大多数的原理都来自于这篇论文,这篇论文的思想值得仔细品读。论文原文地址和Pytorch开源代码地址见附录。 基础原理 这篇文章不同于之前介绍的那...

I good vegetable a! 1559

Synopsys PCIe IP 实战笔记:手把手教你配置本地数字回环(PIPE/RMMI)

本文详细介绍了Synopsys PCIe IP本地数字回环(PIPE/RMMI)的配置与调试全流程,涵盖硬件连接、寄存器操作及实战技巧。通过数字回环模式,开发者可在无真实对端设备的情况下验证PCIe接口功能,适用于芯片验证和FPGA原型开发。文章还提供了常见问题排查和性能优化建议,助力高效完成协议解析与调试。

weixin_30394669的博客 323

【论文】模型剪枝(Network Pruning)论文详细翻译

前言: 这是关于模型剪枝(Network Pruning)的一篇论文,论文题目是:Learning both weights and connections for efficient neural networks,作者在论文中提出了一种通过网络剪枝对模型进行压缩的思路,详细地描述了模型剪枝的思路,流程和方法。 论文地址:Learning both weights and connecti...

u013044310的博客 1万+

【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

三、特征工程 3.1 看书 常言道,“巧妇难为无米之炊”。在 ML 中,数据和特征将作“米”,模型和算法则为“妇”。若无数量充足的数据、良好表示的特征,再强大的模型也难以得到满意的结果 (garbage in,garbage out)。对于 ML 问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近该上限。 特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。在本质上,特征工程是一个表示和展现数据的过程。在实际中,特征工程旨在去除...

闻韶 3358

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 817

论文翻译 || 模型剪枝(1)—— PRUNING FILTERS FOR EFFICIENT CONVNETS

ABSTRACT 在各种应用中的成功伴随着计算和参数存储成本的显著增加。最近为减少这些开销所做的努力包括在不损害原有精度的情况下修剪和压缩各层的权重。然而,基于大小的权值剪枝从完全连通的层中减少了大量的参数,由于剪枝后的网络具有不规则的稀疏性,可能不能充分降低卷积层的计算成本。我们提出了一种cnn的加速方法,我们从被识别为对输出精度影响很小的cnn中删除滤波器。通过去除网络中所有的过滤器及其连接的特征映射,大大降低了计算成本。 与修剪权值相反,这种方法不会导致稀疏连接模式。因此,它不需要稀疏卷积库的支持,

magic_ll的博客 2011

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 661

模型剪枝经典论文解读:《Learning Efficient Convolutional Networks through Network Slimming》

Learning Efficient Convolutional Networks through Network Slimming 摘要: CNN在落地中的部署,很大程度上受到其高计算成本的限制。在本文中,作者提出一种新的CNN学习方案: 1)减少模型大小; 2) 减少模型运算内存的占用; 3)在不影响准确性的同时,减少计算操作的次数。 本文提出一种简单高效的方法,具体通过网络通道的稀疏化来实现的。该方法非常适用于CNN的结构,可将训练的开销降到最低,并且生成的模型不需要特定的软硬件进行加速,部署性能更高

chenxiangrong的博客 5510

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【模型剪枝】|论文笔记 Optimal Brain Damage

1 摘要 通过从网络中删除不重要的权重,可以有更好的泛化能力、需求更少的训练样本、更少的学习或分类时间。本文的基础思想是使用二阶导数将一个训练好的网络,删除一半甚至一半以上的权重,最终会和原来的网络性能一样好,甚至更好。最好的泛化能力是在训练误差和网络复杂度平衡的时候。 2 介绍 达到这种平衡的一种技术是最小化由两部分组成(原始的训练误差+网络复杂度的度量)的损失函数。 复杂度评估方法包括VC维度,描述长度、还有一个历史悠久的方法是:自由参数中的非零参数数量,这个方法也是本文选用的方法。 在很多统计推理的文

qq_35608277的博客 2317

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 论文翻译 || 模型剪枝(1)—— PRUNING FILTERS FOR EFFICIENT CONVNETS
下一篇: anaconda无法正常安装虚拟环境
magic_ll
博客等级 码龄9年 3万+粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值