首页 > 其他分享 >神经网络压缩

神经网络压缩

时间:2023-07-22 21:47:07浏览次数:28  
标签:Network 训练 压缩 裁剪 正确率 神经网络 参数 Channel

Network Compression(神经网络收缩)

  • 把硕大的模型缩小,因为很多时候需要把这些模型运用在有资源约束的环境下(例如:智能手表、无人机、自驾车)

把资料传在云端,在云端做运算,最后再把结果回传:这种方法的局限性就是传输会有时间差,如果需要做非常及时的回应,中间的时间差可能无法接收,并且这种方法也无法保障隐私

既然小的Network也能有很高的正确率,为什么不训练小的Network?

大的Network比较好训练,因为大的Network包含了很多小的Network,某个小的Network不一定包含结果好的函数,直接训练大的Network相当于训练了很多小的不同模型的Network;直接训练某个小的Network,往往没有办法得到和大的Network同样的正确率,通过大Network裁剪剩下的小的Network都的那些有较好结果的小的Network

Network Pruning(神经网络裁剪)

  • 把Network中一些参数减掉,一个巨大的Network中不一定全部参数都有用,Network Pruning的概念就是把一个巨大的Network中没用的参数找出来,并去除掉
  1. 评估每个参数的重要性:看参数的绝对值(越接近0的参数越不重要)
  2. 评估每个神经元的重要性:看神经元输出不为0的次数
  • 裁剪之后模型的正确率就会降低,需要再重新训练一下,通过微调使正确率回升
  • 一次裁剪不可以去除太多参数,但可以进行多次裁剪

Weight Pruning(以参数为单位裁剪)

  • 由于裁剪会导致Network不规则,在实做中,GPU加速运算时不能把其看做矩阵乘法运算,所以可以对去掉的参数补0,实际上这样并没有将Network变小

这种方法往往可以裁剪95%的参数,并且正确率只掉1%~2%,但计算时间并没有明显减少

Neuron Pruning(以神经元为单位裁剪)

  • 这种方法裁剪之后并不会导致Network不规则

Knowledge Distillation(知识净化)

  • 先训练一个大的Network,这个大的Network当做老师,再根据这个大Network去训练一个小的Network,学生Network训练时,直接拿老师的输出当成正确答案,这样可以让学生Network学到更多的东西(Ensemble:取多个老师输出的平均结果当成正确答案学习)

当老师Network输出比较集中时,通过Softmax后可能和标注一样,所以可以Temperature的技巧使输出更加平滑

Parameter Quantization(参数量化)

  • 只用比较少的空间来储存一个参数
  1. 16Bit存储一个参数改为4Bit存储
  2. 把值相近的参数设置为公共参数,这样便只需保存一次

Architecture Design(系统结构设计)

1、Depthwise Convolution(切除卷积):有几个Channel就有几个Filter,一个Filter只管一个Channel(主要用于缩减特征值),不像CNN(卷积卷积神经网络),Filter数量和Channel数量没有关系;这样的缺陷是,缩小后的特征值中,Channel之间没有任何互动

2、  pointwise convolution(逐点的卷积):用1*1的Filter去扫过缩小的特征值求和,建立不同Channel之间的联系(与CNN中一样,只强制了filter的大小)

Dynamic Computation(动态计算)

  • 希望Network可以自由的调整计算量,因为有时候同样的模型需要在不同的设备上运行,不同设备的运算资源是不同的,并且同一设备在不同状态的计算资源也不同
  • 让Network可以自由的调整他的深度:训练一个很深的Network

方法:

  1. 在中间某些层中加入一些额外的层,用于根据这层的输出直接得到结果;当运算资源充足时,可以运行全部的层得到最终结果,当运算资源不充足时,Network就自行决定在某个层直接输出结果
  2. 让Network根据当前的机器状态自由的决定他的宽度

  

然后训练时所有的状况都考虑,例如:最小化(不唯一)

结:前4中技术并不是互斥的,可以同时使用

 

标签:Network,训练,压缩,裁剪,正确率,神经网络,参数,Channel
From: https://www.cnblogs.com/TianLiang-2000/p/17574311.html

相关文章

  • 状态压缩 DP - 知识点梳理
    状态压缩DP,或状压DP,是对状态的一种优化。相比于普通DP,通过将高维状态压缩成一个数,减少了维度,并使维度更易于存储与维护。同时这样与bitset一样利用了计算机在\(O(1)\)内处理位运算的能力,大幅度优化了时间复杂度。一般当题目中的状态由多个\(0\)/\(1\)组成,数量不一定,且......
  • 深度学习(九)——神经网络:最大池化的作用
    一、torch.nn中Poollayers的介绍官网链接:https://pytorch.org/docs/stable/nn.html#pooling-layers1.nn.MaxPool2d介绍nn.MaxPool2d是在进行图像处理时,Poollayers最常用的函数官方文档:MaxPool2d—PyTorch2.0documentation(1)torch.nn.MaxPool2d类classtorch.nn.......
  • 【第2周】卷积神经网络
    一、代码练习importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsimportmatplotlib.pyplotaspltimportnumpy#一个函数,用来计算模型中有多少参数defget_n_params(model):......
  • redis hash 压缩
    RedisHash压缩实现指南简介在本文中,我将向你介绍如何使用Redis来实现Hash压缩。Redis是一个开源的内存数据结构存储系统,它广泛应用于缓存、消息传递、会话管理和排行榜等场景。Redis的Hash数据结构是一种键值对的集合,其中的每个键都映射到一个值。在某些情况下,我们可能......
  • 卷积神经网络不同优化器
    实现卷积神经网络不同优化器简介卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种广泛应用于图像处理和计算机视觉任务中的深度学习模型。在训练过程中,我们通常会使用优化器(Optimizer)来自动调整网络的权重和偏置,以最小化损失函数。本文将介绍如何使用不同的优化器来训练卷积......
  • MATLAB train 神经网络 函数
    MATLABtrain神经网络函数神经网络是一种用于模拟人脑神经系统的数学模型,它由大量的神经元和连接它们的权重组成。MATLAB是一个功能强大的数学计算软件,提供了丰富的工具箱和函数,用于神经网络的设计和训练。其中train函数是MATLAB中用于训练神经网络的重要函数之一。train函数的......
  • U-Net神经网络总体结构
    实现U-Net神经网络总体结构1.简介U-Net是一种用于图像分割的神经网络结构,在医学领域的图像分析中得到广泛应用。它的结构独特,可以实现高精度的图像分割任务。本文将介绍U-Net的总体结构以及每一步的代码实现。2.U-Net总体结构U-Net的总体结构可以分为两个部分:编码器(En......
  • 脉冲神经网络理论基础(1)
    神经元的基本结构(高中生物x)图源wiki。接收区(receptivezone):为树突(dendrite)到胞体(soma)的部分。在计算建模时,往往把树突作为接受区看待。树突接受突触前神经元的信号,在ANN结构中表现为当前神经元接受前一层的输入,并以突触的权重进行加权和。触发区(triggerzone):为细胞体与轴突交......
  • 卷积神经网络
    ConvolutionalNeuralNetwork(CNN卷积神经网络)解释一应用于Imageclassification(图像分类)一张图片如何作为一个模型的输入:一张图片可以当成三维的Tensor(维度大于等于2的矩阵),三维分别代表图片:宽、高、channels(宽高代表像素,channels代表RGB三色) 参数过多,模型弹......
  • java图片压缩传输
    Java图片压缩传输在现代互联网应用中,图片的传输是非常常见的需求。然而,大尺寸的图片会占用更多的网络带宽和存储空间,导致传输速度变慢和资源浪费。为了解决这个问题,我们可以使用Java中的图片压缩技术来减小图片的尺寸,并通过网络传输。图片压缩算法图片压缩算法有很多种,其中最常......