主要内容

代码生成深学习网络与手臂计算库

马铃薯®编码器™,您可以针对使用ARM的嵌入式平台,从一个已经训练过的卷积神经网络(CNN)生成预测代码®处理器支持NEON扩展。万博1manbetx代码生成取ARM的优势计算库用于计算机视觉和机器学习。生成的代码实现了一个CNN,该CNN具有输入中指定的体系结构、层和参数SeriesNetwork(深度学习工具箱)DAGNetwork(深度学习工具箱)网络对象。

通过使用这些方法之一生成代码:

要求

  • 深度学习库的MATLAB编码器接口.要安装支持包,从MATLAB中万博1manbetx选择加载项菜单。

  • 手臂计算库对于计算机视觉和机器学习,必须在目标硬件上安装。

  • 深度学习工具箱™。

  • 编译器和库的环境变量。

请注意

ARM的计算库版本,在此帮助主题用途的例子可能不是最新版本的代码生成支持。万博1manbetx对于库的万博1manbetx受支持版本,以及有关设置环境变量的信息,请参阅先决条件深度学习与MATLAB编码器

利用代码生成codegen

通过使用生成ARM目标上的深入学习代码codegen

  • 编写一个入口点函数,加载预训练的CNN并调用预测.例如:

    功能= squeezenet_predict(中)% # codegen持续的网opencv_链接标志=pkg-config——cflags——libs opencv ";coder.updateBuildInfo(“addLinkFlags”, opencv_linkflags);如果net = code . loaddeeplearningnetwork (“挤压网”“挤压网”);结尾= net.predict(的);结尾

  • 如果您的目标硬件是Raspberry Pi™,您可以利用覆盆子PI硬件万博1manbetx的MATLAB支持包.有了支持包,万博1manbetxcodegen将生成的代码移动到树莓派上,并在树莓派上构建可执行程序。当您为没有硬件支持包的目标生成代码时,您必须运行命令来移动生成的文件并构建可执行程序。万博1manbetx

  • MEX代不支持代码生成ARM的目标深度学习。万博1manbetx

  • 对于ARM,对于输入预测(深度学习工具箱)与多个图像或观测(N> 1),一个MiniBatchSize不支持大于1的值。万博1manbetx指定一个MiniBatchSize1。

代码生成深学习上树莓派

当你有覆盆子PI硬件万博1manbetx的MATLAB支持包,在树莓派上生成深度学习代码:

  1. 要连接到树莓Pi,请使用raspi(MATLAB支万博1manbetx持包树莓派的硬件).例如:

    R = raspi(“raspiname”“用户名”'密码');

  2. 对库中创建代码生成配置对象,或通过使用可执行coder.config.设置TargetLang财产“c++”

    CFG = coder.config(exe”);cfg.TargetLang =“c++”

  3. 通过创建学习深配置对象coder.DeepLearningConfig.设置ArmComputeVersionArmArchitecture属性。设置DeepLearningConfig属性的代码生成配置对象编码器。手臂NEONConfig对象。例如:

    dlcfg = coder.DeepLearningConfig(“臂-计算”);dlcfg.ArmArchitecture =“armv7”;dlcfg。ArmComputeVersion ='19 0.05';cfg.DeepLearningConfig = dlcfg;

  4. 要为树莓派配置代码生成硬件设置,创建编码器。硬件对象,通过使用coder.hardware.设置硬件属性的代码生成配置对象编码器。硬件目的 。

    HW = coder.hardware(“树莓派”); 硬件=硬件;

  5. 如果生成可执行程序,则提供C++主程序。例如:

    cfg.CustomSource ='的main.cpp'

  6. 要生成代码,请使用codegen.通过使用指定码生成配置对象配置选择。例如:

    codegen配置cfgsqueezenet_predictarg游戏{酮(227,227,3, '单')}-报告

    请注意

    您可以为代码生成指定半精度输入。但是,代码生成器类型将输入强制转换为单精度。深度学习工具箱使用单精度,浮点算法在MATLAB中的所有计算。

代码生成当你没有一个硬件支持包万博1manbetx

要在没有针对目标的硬件支持包时生成用于深入学习的代码,请执行以下操作:万博1manbetx

  1. 生成在Linux代码®只有主机。

  2. 创建库配置对象。例如:

    CFG = coder.config(“自由”);

    不要在可执行程序中使用配置对象。

  3. 配置代码生成,以生成C ++代码,并只生成源代码。

    cfg.GenCodeOnly = TRUE;cfg.TargetLang =“c++”

  4. 为了与ARM计算库指定代码生成,创建编码器。手臂NEONConfig通过使用coder.DeepLearningConfig.设置ArmComputeVersionArmArchitecture属性。设置DeepLearningConfig属性的代码生成配置对象编码器。手臂NEONConfig对象。

    dlcfg = coder.DeepLearningConfig(“臂-计算”);dlcfg.ArmArchitecture =“armv7”;dlcfg。ArmComputeVersion ='19 0.05';cfg.DeepLearningConfig = dlcfg;

  5. 要配置特定于目标硬件的代码生成参数,请设置ProdHWDeviceType财产HardwareImplementation对象。

    • 对于ARMv7架构,使用'ARM Compatible-> ARM皮质'

    • 为ARMv8架构,使用ARM兼容->ARM 64位(LP64)

    例如:

    cfg.HardwareImplementation.ProdHWDeviceType =ARM兼容->ARM 64位(LP64)

  6. 要生成代码,请使用codegen.通过使用指定码生成配置对象配置选择。例如:

    codegen配置cfgsqueezenet_predictarg游戏{one (227, 227, 3, 'single')}-darm_compute

对于一个示例,请参见代码生成深学习ARM的目标

生成的代码

串联网络被作为含有层类的数组C ++类生成。

类b_squeezenet_0 {市民:int32_T BATCHSIZE;int32_T numLayers;real32_T * inputData;real32_T * outputData;MWCNNLayer *层[68];私人:MWTargetNetworkImpl * targetImpl;公共:b_squeezenet_0();无效预先设置();空隙postsetup();空隙设置(); void predict(); void cleanup(); real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex); ~b_squeezenet_0(); };

设置()类设置手柄和分配存储器,用于所述网络对象的每一层的方法。的预测()方法对网络中的每一层调用预测。假设您为一个入口点函数生成代码,squeezenet_predict.在生成的“for you”文件中,squeezenet_predict.cpp,在入口点函数squeeznet_predict()构造的静态对象b_squeezenet_0类类型并调用设置预测在网络对象上。

静态b_squeezenet_0净;静态boolean_T net_not_empty;//函数定义// //持久化对象net用于加载DAGNetwork对象。//在第一次调用该函数时,构造并设置持久对象。当该函数随后被调用时,相同的对象被重用//以调用预测输入,避免重新构造和重新加载//网络对象。// Arguments: const real32_T in[154587] // real32_T out[1000] //返回类型:void // void squeezenet_predict(const real32_T in[154587], real32_T out[1000]) {// Copyright 2018 The MathWorks,公司if (!net_not_empty) {DeepLearningNetwork_setup(&net);net_not_empty = true;} DeepLearningNetwork_predict(&net, in, out);}

二进制文件导出对于具有参数,如完全连接和卷积层网络中的层。例如,对于名称的文件具有图案cnn_squeezenet _ * _ w ^cnn_squeezenet _ * _ b对应于网络中卷积层的权重和偏差参数。

Cnn_squeezenet_conv10_b cnn_squeezenet_conv10_w cnn_squeezenet_conv1_b cnn_squeezenet_conv1_w cnn_squeezenet_fire2-expand1x1_b cnn_squeezenet_fire2-expand1x1_w cnn_squeezenet_fire2-expand3x3_b cnn_squeezenet_fire2-expand3x3_w cnn_squeezenet_fire2-squeeze1x1_b

代码生成量化深学习网络

看到代码生成量化深学习网络

使用马铃薯编码员应用程序

  1. 完成选择源文件定义输入类型脚步。

  2. 去医院生成代码步。(跳过检查运行时问题步骤,因为MEX代不支持代码生成与ARM计算库)。万博1manbetx

  3. C ++

  4. 指定目标ARM硬件。

    如果你的目标硬件树莓派你安装了覆盆子PI硬件万博1manbetx的MATLAB支持包

    • 硬板中,选择覆盆子PI.

    • 单击,进入“树莓派”设置界面更多的设置.然后,点击硬件.指定设备地址用户名密码, 和生成目录

    当你没有一个支持包为您的ARM目标:万博1manbetx

    • 确保构建类型静态库动态库并选择只生成代码复选框。

    • 硬板中,选择无 - 选择以下设备

    • 设备供应商中,选择ARM兼容

    • 为了设备类型

      • 对于ARMv7架构,请选择臂皮质

      • 对于ARMv8体系结构,选择ARM 64位(LP64)

    请注意

    如果您在ARM目标上生成用于深度学习的代码,并且不使用硬件支持包,则只在Linux主机上生成代码。万博1manbetx

  5. 在里面深度学习窗格中,设置目标库臂计算.指定ARM计算库版本ARM计算架构

  6. 生成代码。

另请参阅

||

相关话题