zoukankan      html  css  js  c++  java
  • 模型转换、模型压缩、模型加速工具

    一、场景需求解读

      在现实场景中,我们经常会遇到这样一个问题,即某篇论文的结果很棒,但是作者提供的训练模型是使用pytorch训练的,而我自己却比较擅长用tensorflow,我想要使用该模型做一些其它的项目。那么很多人就会采取一种方式,去阅读别人的论文、理解别人的代码,然后使用自己熟悉的工具进行代码重现、重新训练一个模型。这个阶段会耗用大量的人力和物力,最终还不能保证一定能得到论文的效果。本文即将介绍的几个模型转换的工具就可以很好的帮你解决你的这个问题,比较有名的包括mmdnn、onnx等。
      除此之外,我们的目的是将深度学习模型应用到现实场景中的任务中,但是现实场景中的硬件五花八门,包含着大多数的算力不足的设备,以ARM处理处居多。那么这里面就涉及到了一个问题,即使你说你的模型有多牛逼,但是如果你的模型比较大,需要大量的算力才能跑起来,那么对于应用场景而言,你这个算法其实没有多少利用价值的。为了将使用N卡的GPU训练出来的模型成功的部署在这些低功耗的设备上面,我们通常需要对这些模型进行模型压缩和模型加速操作,比较有名的几个工具包括TensorRT、PocketFlow、TVM等。

    二、模型转化工具汇总

    1、模型转换工具的作用

      简而言之,模型转换工具的作用是:将使用不同训练框架训练出来的模型相互联系起来,用户可以进行快速的转换,节省了大量的人力和物力花销。

    2、模型转换工具简介

    1、MMdnn

    上图展示了MMdnn的主要功能。MMDNN是一套帮助用户在不同的深度学习框架之间进行交互操作的工具。例如,模型转换和可视化。转换caffe、keras、mxnet、tensorflow、cntk、pytorch onnx和coreml之间的模型。 简而言之,通过这个工具,我们可以方便的将某一个框架训练出来的模型转换成另外一个框架所支持的模型,图中基本上包含了当前所有主流的深度学习训练框架,包括Tensorflow、Pytorch、Caffe、MxNet等。除此之外,图中包含了一个关键的概念,那就是Intermediate Representation-中间表示,即这个工具首先将输入框架的模型转换为IR,然后通过IR转换成另外一个框架所支持的模型。

     上图展示了MMdnn工具当前所支持的模型。上面的对号表示的是你可以随意的在不同框架之间进行该模型的转换

    # 将Tensorflow的resnet_v2_152模型转换为Pytorch支持的模型
    mmdownload -f tensorflow -n resnet_v2_152 -o ./
    mmconvert -sf tensorflow -in imagenet_resnet_v2_152.ckpt.meta -iw imagenet_resnet_v2_152.ckpt --dstNodeName MMdnn_Output -df pytorch -om tf_resnet_to_pth.pth

    上面展示了一个简单的使用案例,通过简单的两行指令就可以将Tensorlfow的模型转换为pytorch所支持的模型,是不是很方便呢!

    2、 ONNX

    官网:

      ONNX是一个开放的生态系统,它使人工智能开发者能够随着项目的发展选择正确的工具。ONNX为人工智能模型提供了一种开源格式,包括深度学习和传统的ML。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。目前,我们关注的是推断(评分)所需的能力。
      ONNX得到了广泛的支持,它可以应用到很多框架、工具和硬件中。它可以实现不同框架之间的相互转换,并加速研究到产品的速度

     上图展示了ONNX所支持的一些深度学习框架,图中包括了一些主流的框架,但是并不完善,tensorflow的身影竟然没有出现。

    上图展示了该工具所支持的一些Converters,不仅包括深度学习框架Tensorflow、Keras等,而且包括ML工具Scikit-learn、Xgboost、LibSVM等。

     

     上图展示了该工具所支持的一些Runtimes(运行时),它更偏向模型的部署端,图中包含了多个大厂,包括NVIDIA、Qualcomm、Tencent、synppsys等。

     上图展示了该工具所支持的底层编译器,包括了大名鼎鼎的TVM,下面会对该工具进行详细的介绍。除此之外,包含了一些可视化网络模型的工具,NETRON工具相当好用,具体的细节请看

    这里

    3、 X2Paddle

    官网链接
    X2Paddle支持将其余深度学习框架训练得到的模型,转换至PaddlePaddle模型。一个比较小众的工具,感兴趣的请在官网查看具体的细节,这里不再祥述。

    三、模型压缩和加速工具汇总
    1、模型压缩加速工具的作用
      简而言之,模型压缩加速工具的作用是:将训练好的模型进行压缩和加速,然后将其部署到一些特定的设备上去,从而满足现实场景的需求。

    2、模型压缩加速工具简介
    1、PocketFlow:官网链接

         PocketFlow是一个开源框架,可以使用最少的人力压缩和加速深度学习模型。深度学习广泛应用于计算机视觉、语音识别、自然语言翻译等各个领域。然而,深度学习模型通常计算成本很高,这限制了在计算资源有限的移动设备上的进一步应用。
      PocketFlow旨在为开发人员提供一个易于使用的工具包,以提高推理效率,而不会降低或降低性能。开发人员只需要指定所需的压缩比或加速比,然后PocketFlow将自动选择适当的超参数来生成高效的压缩模型以进行部署。

    上图展示了PocketFlow的整个框架。该框架主要由两类算法组件组成,即学习器和超参数优化器,如上图所示。给定一个未压缩的原始模型,学习模块使用随机选择的超参数组合生成一个候选压缩模型。然后对候选模型的精度和计算效率进行评估,并将其作为反馈信号,用于确定学习模块要探索的下一个超参数组合。经过几次迭代,所有候选模型中最好的一个输出为最终的压缩模型。

     上图展示了该工具中所包含的压缩方法。主要包括3大类:裁剪、权重稀疏和量化

    # 对网络进行裁剪操作
    ./scripts/run_seven.sh nets/resnet_at_cifar10_run.py \
        --learner channel \
        --cp_prune_option uniform \
        --cp_uniform_preserve_ratio 0.5
    # 对网络进行权重稀疏操作
    ./scripts/run_local.sh nets/resnet_at_cifar10_run.py \
        --learner weight-sparse \
        --ws_prune_ratio_prtl uniform \
        --data_disk hdfs
    # 对网络进行量化操作
    ./scripts/run_local.sh nets/resnet_at_cifar10_run.py \
        --learner uniform \
        --uql_use_buckets \
        --uql_bucket_type channel \
        --data_disk hdfs

    上面分别展示了一个网络裁剪、网络权重稀疏、网络量化的实例。整个工具操作起来比较简单,用户仅仅需要确定自己需要的压缩比或者加速比即可,工具可以通过强化学习算法来帮你找到一个最优的结果。

    2、TensorRT

    官网链接

      Nvidia Tensorrt™是一个高性能深度学习推理平台。它包括一个深度学习推理优化器和运行时,为深度学习推理应用程序提供低延迟和高吞吐量。在推理过程中,基于Tensorrt的应用程序的执行速度比仅使用CPU的平台快40倍。使用Tensorrt,您可以优化在所有主要框架中训练的神经网络模型,高精度校准低精度,最后部署到超尺度数据中心、嵌入式或汽车产品平台
      Tensorrt建立在Nvidia的并行编程模型CUDA上,使您能够利用CUDA-X人工智能、自主机器、高性能计算和图形中的库、开发工具和技术,优化所有深度学习框架的推理。
      Tensorrt为深度学习推理应用程序(如视频流、语音识别、推荐和自然语言处理)的生产部署提供了int8和fp16优化。降低的精度推断显著降低了应用程序延迟,这是许多实时服务、自动和嵌入式应用程序的一项要求。

    上图展示了TensorRT的整体框架。输入到整个tensorRT中的是一个训练好的神经网络,该工具中包含了多个优化工具,具体包括精度矫正、动态张量内存、层/张量融合、内核自动微调、多级流执行等,通过这些操作,我们可以对原始的输入模型进行快速的压缩和加速,从而满足我们的需求。但是细心的你可能注意到了该工具只适合应用在NVIDIA显卡上,在CUDA的基础上进行优化,通用性较差!!!

    3、distiller
    官网链接

      Distiller是一个用于神经网络压缩研究的开源python包。网络压缩可以减少神经网络的内存占用,提高其推理速度,节约能源。Distiller为原型制作和分析压缩算法提供了一个pytorch环境,如稀疏诱导法和低精度算法。

    # 显示网络的稀疏度
    python3 compress_classifier.py --resume=../ssl/checkpoints/checkpoint_trained_ch_regularized_dense.pth.tar -a=resnet20_cifar ../../../data.cifar10 --summary=sparsity

    上图展示了使用该工具来显示某个网络的稀疏度。执行命令之后会输出一个文本表,详细说明参数张量的各种稀疏性。第一列是参数名,后面是它的形状、密集模型和稀疏模型中非零元素的数量(nnz)。下一组列显示列、行、通道、内核、过滤器和元素的稀疏度。概括起来就是元素绝对值的标准差、平均值和平均值。

     上图展示的是裁剪敏感性分析图。该图可以辅助你在模型压缩的过程中快速的定位到不同网络层对裁剪的敏感程度,然后有针对性的执行一些操作。

    4、TVM
    官网链接
      TVM是一个针对CPU、GPU和专用加速器的开放式深度学习编译器堆栈。它旨在缩小以生产力为中心的深度学习框架与以性能或效率为导向的硬件后端之间的差距。TVM提供以下主要功能:

    将keras、mxnet、pytorch、tensorflow、coreml、darknet中的深度学习模型编译为各种硬件后端上可部署的最小模块。
    自动生成和优化更多后端上的张量运算符并提高性能的基础结构。
      TVM提供两个级别的优化。执行高级操作员融合、布局转换和内存管理等任务的计算图优化。然后是张量运算符优化和代码生成层,用于优化张量运算符

     上图展示了TVM工具的整体框图。整个工具具有如下的优势:

    (1)其输入时任意一个深度学习框架输出的模型,即该工具不挑模型,全部通吃! 其输出是针对现实场景中的各种硬件,具体包括Intel的CPU/GPU、NVIDIA的GPU、ARM的CPU\GPU、树莓派、FPGA、ASCI等,即该工具也不挑部署设备,基本上全部通吃。
    (2)TVM中包含了多级模型优化机制,具体包括高级的IR优化和低级的图优化。除此之外,还有一个强大的工具就autotvm,这个工具可以通过一些ML算法寻找到针对不同硬件最优的一种卷积层实现方式,从而实现进一步的压缩和加速。
    (3)TVM不想TensorRT那么局限,它几乎可以很好的支持市面上所有的硬件设备,这是它的一个强大之处。主要通过LLCM来支持Intel和ARM CPU等一些设备;通过Opencl来支持ARM的MailGPU;通过CUDA来支持NVIDIA的设备;通过Metal来支持苹果的设备;通过VTA来很好的支持FPGA和ASCI(即自己设计的芯片)。

     (4)TVM的众多优势之一在于它对多种平台和语言的丰富支持。我们提供了框架的两个组件:包含完整优化库以生成优化机器代码的编译器堆栈和轻量级的运行时,它提供了在不同平台上部署编译模块所需的可移植性。**TVM目前支持Python和C++接口到嵌入式编译器堆栈。**我们设计了具有最大重用的框架,以便编译器堆栈的改进可以在Python和C++组件之间互换应用。我们还提供了一个轻量级运行时,它可以直接运行在诸如JavaScript、Java、Python和C++等平台上的TVM编译代码,这些平台包括Android、IOS、树莓PI和Web浏览器。

    TVM装载ONNX模型并执行模型优化的简单案例

    import onnx
    import numpy as np
    import tvm
    import tvm.relay as relay
    from tvm.contrib.download import download_testdata
    
    ######################################################################
    # Load pretrained ONNX model
    # ---------------------------------------------
    # The example super resolution model used here is exactly the same model in onnx tutorial
    # http://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html
    # we skip the pytorch model construction part, and download the saved onnx model
    model_url = ''.join(['https://gist.github.com/zhreshold/',
                         'bcda4716699ac97ea44f791c24310193/raw/',
                         '93672b029103648953c4e5ad3ac3aadf346a4cdc/',
                         'super_resolution_0.2.onnx'])
    model_path = download_testdata(model_url, 'super_resolution.onnx', module='onnx')
    # now you have super_resolution.onnx on disk
    onnx_model = onnx.load(model_path)
    
    ######################################################################
    # Load a test image
    # ---------------------------------------------
    # A single cat dominates the examples!
    from PIL import Image
    img_url = 'https://github.com/dmlc/mxnet.js/blob/master/data/cat.png?raw=true'
    img_path = download_testdata(img_url, 'cat.png', module='data')
    img = Image.open(img_path).resize((224, 224))
    img_ycbcr = img.convert("YCbCr")  # convert to YCbCr
    img_y, img_cb, img_cr = img_ycbcr.split()
    x = np.array(img_y)[np.newaxis, np.newaxis, :, :]
    
    ######################################################################
    # Compile the model with relay
    # ---------------------------------------------
    target = 'llvm'
    
    input_name = '1'
    shape_dict = {input_name: x.shape}
    mod, params = relay.frontend.from_onnx(onnx_model, shape_dict)
    
    with relay.build_config(opt_level=1):
        intrp = relay.build_module.create_executor('graph', mod, tvm.cpu(0), target)
    
    ######################################################################
    # Execute on TVM
    # ---------------------------------------------
    dtype = 'float32'
    tvm_output = intrp.evaluate()(tvm.nd.array(x.astype(dtype)), **params).asnumpy()
    
    ######################################################################
    # Display results
    # ---------------------------------------------
    # We put input and output image neck to neck
    from matplotlib import pyplot as plt
    out_y = Image.fromarray(np.uint8((tvm_output[0, 0]).clip(0, 255)), mode='L')
    out_cb = img_cb.resize(out_y.size, Image.BICUBIC)
    out_cr = img_cr.resize(out_y.size, Image.BICUBIC)
    result = Image.merge('YCbCr', [out_y, out_cb, out_cr]).convert('RGB')
    canvas = np.full((672, 672*2, 3), 255)
    canvas[0:224, 0:224, :] = np.asarray(img)
    canvas[:, 672:, :] = np.asarray(result)
    plt.imshow(canvas.astype(np.uint8))
    plt.show()

    5、tflite

    官网链接

      TensorFlow Lite 是一种用于设备端推断的开源深度学习框架,该工具专注于模型优化和模型部署,使得tensorflow的整个生态更加完善,首先使用tensorflow训练好的模型,然后通过tflite进行模型加速,最终将其部署在android或者ios设备上。

    上图展示了tflite的整个流程。首先需要选择一个合适的模型;然后使用Lite converter将模型转换为FlatBuffer格式;接着将.tflite文件部署到嵌入式设备中;最后进行模型量化操作。

    6、ncnn

    添加链接描述

        ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

     

     

    7、MNN

    官网链接

      MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。
    主要特点如下所示:

     

    整体设计架构如下所示:

      上图展示了MNN的整体设计架构。其支持的深度学习框架包括Tensorflow、Caffe、ONNX;Frontends包括Tensorflow、Caffe、ONNX;包含的图优化操作包括:融合操作、替换操作和调节操作;引擎包括图调度和CV处理;Backends包括CPU、Metal、OpenCL、Vulkan;底层的优化技术包括:Neon或者ASM、多线程、内存重复使用、异构计算等。

    8、OpenVIO
    官网链接

    openVIO是Intel官方针对Intel cpu推出的一款加速工具。该工具专注于边缘端的推理;用户可以使用该工具对Intel的CPU/GPU/FPGA等产品进行加速;可以直接调用优化好的Opencv和OpenVX包。

      如上图所示,openVIO不仅可以用来执行基于深度学习的一些CV任务,而且可以用来执行一些传统的CV任务。除此之外,它还可以对特定的硬件进行加速。通过openVIO,你可以让你的算法在CPU端实现4~5倍的加速,它让你的算法运行在CPU端成为了可能,在很多应用场景下面会具有更高的性价比。

    9、Tengine
    官网链接

    Tengine是由开放式人工智能实验室开发的一个面向嵌入式设备的精简、高性能、模块化的推理引擎。Tengine引擎由六个模块组成core/operator/serializer/executor/driver/wrapper。

    (1)core提供了系统的基本组件和功能;
    (2)operator定义了运算符的模式,如卷积、relu、池化等操作;
    (3)serializer用来加载保存的模型。该框架是可扩展的,可以支持不同的输入格式,包括自定义格式。caffe/onnx/tensorflow/mxnet和tengine模型可以由tengine直接加载;
    (4)executor实现了运行graph和operators的代码。当前版本为多个A72核提供了高度优化的实现;
    (5)driver是真实h/w的适配器,通过hal-api为设备执行器提供服务。单个驱动程序可以创建多个设备;
    (6)wrapper为不同的框架提供了api包装。caffe api包装器和tensorflow api包装器现在都可以正常使用啦。
    10、ARMNN
    官网链接

      ArmNN是Arm机构开源的基于arm嵌入式设备的inference框架,在Arm Cortex-A CPUs、Arm Mali GPUs、Arm Machine Learning processor都可以达到很高的加速效果。不过可惜的是,由于缺乏文档及教程,该框架在国内推广的程度不高,目前Github上star仅有359个。相对于其他竞品inference框架如NCNN、Tengine、Mace、MNN等等,ArmNN的知名度显得很小。不过笔者在项目的多次使用中,发现ArmNN是一个被低估的框架(在arm设备上的性能几乎都优于目前的前传框架),不亏是ARM家精心调教的SDK,对自家核心的性能调教到了极致。
      ArmNN基于Arm的另外一个开源计算引擎ComputeLibrary做后端的核心计算,前端支持多种离线训练框架,如TensorFlow、TFLITE、CAFFE以及ONNX。从功能上来说,几乎实现了与市面上所有离线训练框架无缝对接。而且ArmNN在FP32、FP16及INT8上的加速非常可观,笔者在RK3399上做300x300的Mobilenet-SSD(depth_multiplier=1.0),效率可达90ms/ 帧,其余的框架大多在160ms左右徘徊。

    11、Paddle Lite

    官网链接

     Plader Lite是Plader Mobile的更新版本,这是一个开源的深度学习框架,旨在使在移动、嵌入式和物联网设备上执行推理变得容易。它与飞桨和其他来源的预训练模型兼容。

    轻量化。在移动设备上,由于我们的执行模块和分析模块是分离的,因此可以在没有第三方库的情况下部署执行模块。在arm v7上,只占用800kb,而在arm v8上,1.3mb占用了由paddle-lite提供的动态库中的80个操作符和85个内核。无需额外优化,桨叶式Lite即可实现即时推理。
    高性能。Paddle lite支持设备优化内核,最大限度地提高arm cpu性能。它还支持使用桨叶模型压缩工具进行int8量化,从而减小模型的大小并提高模型的性能。在华为的npu和fpga上,性能也得到了提升。
    高兼容性。硬件兼容性:Paddle Lite支持多种硬件——ARM CPU、Mali GPU、Adreno GPU、Huawei NPU和FPGA。在不久的将来,我们还将支持来自Cambricon和Bitmain的人工智能微芯片。模型兼容性:Paddle Lite与PaddlePaddle完全兼容。验证了18个模型(主要是cv模型和ocr模型)和85个算子的准确性和性能。今后,我们还将支持其他机型。框架兼容性:除了在PaddlePaddle上训练的模型之外,那些在Caffe和Tensorflow训练的模型也可以通过X2Palle转换成Paddle Lite。在未来,我们还将支持onnx格式的模型。

    12、FeatherCNN

    官网链接

      FeatherCNN是腾讯人工智能平台部开发的一个高性能轻量级cnn推理库。功能cnn源于我们的《荣耀之王》游戏ai项目,我们的目标是为moba游戏ai建立一个神经模型并在移动设备上运行。FeatherCNN目前的目标是ARM CPU。我们将在不久的将来把它扩展到其它的架构上面。与其他库相比,feathercnn具有以下特点:

    (1)高性能。FeatherCNN在多种设备上提供最先进的推理计算性能,包括移动电话(iOS/Android)、嵌入式设备(Linux)以及基于ARM的服务器(Linux)。
    (2)轻松部署。FeatherCNN将所有内容打包在一个代码库中,以摆脱第三方依赖。因此,它有助于在移动平台上部署。
    (3)轻量级。编译的eatherCNN库是很小,只有数百kbs。
    13、DNNL
    官网链接

    深度神经网络库(dnnl)是一个用于深度学习应用的开源性能库。该库包括针对英特尔体系结构处理器和英特尔处理器图形优化的神经网络的基本构建块。dnnl是为有兴趣在intel cpu和gpu上提高应用程序性能的深度学习应用程序和框架开发人员而设计的。

    14、MACE

    官网链接-Model_Zoo-官方文档

    Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。 主要从以下的角度做了专门的优化:

    (1)性能-代码经过NEON指令,OpenCL以及Hexagon HVX专门优化,并且采用 Winograd算法来进行卷积操作的加速。 此外,还对启动速度进行了专门的优化。
    (2)功耗-支持芯片的功耗管理,例如ARM的big.LITTLE调度,以及高通Adreno GPU功耗选项。
    (3)系统响应-支持自动拆解长时间的OpenCL计算任务,来保证UI渲染任务能够做到较好的抢占调度, 从而保证系统UI的相应和用户体验。
    (4)内存占用-通过运用内存依赖分析技术,以及内存复用,减少内存的占用。另外,保持尽量少的外部 依赖,保证代码尺寸精简。
    (5)模型加密与保护-模型保护是重要设计目标之一。支持将模型转换成C++代码,以及关键常量字符混淆,增加逆向的难度。
    (6)硬件支持范围-支持高通,联发科,以及松果等系列芯片的CPU,GPU与DSP(目前仅支持Hexagon)计算加速。CPU模式支持Android, iOS, Linux等系统。
    (7)模型格式支持-支持TensorFlow, Caffe和ONNX等模型格式。
    15、SNPE
    官网链接

      SNPE是高通的一个神经网络框架,该平台具有广泛的异构计算功能,这些功能经过精心设计,可以在设备上运行经过训练的神经网络,而无需连接到云。Qualcomm®人工智能(AI)神经处理SDK旨在帮助开发人员在Snapdragon移动平台(无论是CPU,GPU还是DSP)上运行经过Caffe / Caffe2,ONNX或TensorFlow训练的一个或多个神经网络模型。
      Qualcomm神经处理SDK旨在帮助开发人员节省时间和精力,以优化带有Snapdragon的设备上经过训练的神经网络的性能。它通过提供用于模型转换和执行的工具以及用于通过功能和性能配置文件来针对核心的API以匹配所需的用户体验来实现此目的。高通神经处理SDK支持卷积神经网络和自定义层。
      Qualcomm神经处理SDK完成了在Snapdragon移动平台上运行神经网络所需的许多繁重工作,这可以帮助开发人员提供更多时间和资源来专注于构建新的创新用户体验。
      为了使AI开发人员的生活更轻松,Qualcomm神经处理软件开发工具包没有定义另一个网络层库。取而代之的是,它使开发人员可以使用熟悉的框架自由设计和训练网络,并在发布时支持Caffe / Caffe2,ONNX和TensorFlow。开发工作流程如下:

    16、model-compression

    Github链接

    model-compression是一个基于Pytorch的模型压缩工具。该工具具有如下的特点:

    (1)量化:任意位数(16/8/4/2 bits)、三值/二值
    (2)剪枝:正常、规整、针对分组卷积结构的剪枝
    (3)分组卷积结构
    (4)针对特征(A)二值的BN融合
    该项目当前支持的的功能如下所示:

    (1)普通卷积和分组卷积结构
    (2)权重W和特征A的训练中量化, W(FP32/16/8/4/2bits, 三/二值) 和 A(FP32/16/8/4/2bits, 二值)任意组合
    (3)针对三/二值的一些tricks:W二值/三值缩放因子,W/grad(ste、saturate_ste、soft_ste)截断,W三值_gap(防止参数更新抖动),W/A二值时BN_momentum(<0.9),A二值时采用B-A-C-P可比C-B-A-P获得更高acc
    (4)多种剪枝方式:正常剪枝、规整剪枝(比如model可剪枝为每层剩余filter个数为N(8,16等)的倍数)、针对分组卷积结构的通道剪枝(剪枝后仍保证分组卷积结构)
    (5)batch normalization融合及融合前后model对比测试:普通融合(BN层参数 —> conv的权重w和偏置b)、针对特征(A)二值的融合(BN层参数 —> conv的偏置b)
    转载自:
      (42条消息) 模型转换、模型压缩、模型加速工具汇总_WZZ18191171661的博客-CSDN博客_模型压缩工具

  • 相关阅读:
    转载 如何去掉超链接文字下的下划线
    Fedora 15安装 VirtualBox 4.1
    庆祝开通!
    Delphi直接读写XML修改版
    Perforce的资料一点也没查到
    AxWebBrowser的Navigate2方法写参数的偷懒方法
    腾讯2012实习生面试
    如何让div在IE6下自适应
    PhpStorm修改字体
    监听url
  • 原文地址:https://www.cnblogs.com/cy0628/p/15611929.html
Copyright © 2011-2022 走看看