主要内容

用于深度学习网络的代码生成手臂计算库

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

使用以下方法之一生成代码:

需求

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

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

  • 深度学习工具箱™。

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

请注意

本帮助主题中的示例使用的ARM Compute库版本可能不是代码生成支持的最新版本。万博1manbetx有关受支万博1manbetx持的库版本以及有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件

使用生成代码codegen

在ARM目标上生成用于深度学习的代码codegen

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

    函数Out = squeezenet_predict(in)% # codegen持续的净;opencv_linkflags =“pkg-config——cflags——libs opencv”;coder.updateBuildInfo (“addLinkFlags”, opencv_linkflags);如果isempty(net) net = code . loaddeeplearningnetwork (“squeezenet”“squeezenet”);结束Out = net.predict(in);结束

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

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

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

树莓派上的深度学习代码生成

当你有树莓派硬件的M万博1manbetxATLAB支持包,在树莓派上生成用于深度学习的代码:

  1. 要连接到树莓派,使用raspi(树莓派硬件MA万博1manbetxTLAB支持包).例如:

    R =树皮(“raspiname”“用户名”“密码”);

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

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

  3. 使用创建深度学习配置对象编码器。DeepLearningConfig.设置ArmComputeVersion而且ArmArchitecture属性。设置DeepLearningConfig属性的代码生成配置对象编码器。手臂NEONConfig对象。例如:

    DLCFG =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;

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

    Hw = code .hardware(“树莓π”);cfg。硬件= hw;

  5. 如果您正在生成一个可执行程序,请提供一个c++主程序。例如:

    cfg。CustomSource =“main.cpp”

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

    codegen配置cfgsqueezenet_predictarg游戏{ones(227,227,3,'single')}报告

    请注意

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

当您没有硬件支持包时生成代码万博1manbetx

在没有目标硬件支持包的情况下,生成用于深度学习的代码:万博1manbetx

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

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

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

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

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

    cfg。GenCodeOnly = true;cfg。TargetLang =“c++”

  4. 要使用ARM计算库指定代码生成,请创建一个编码器。手臂NEONConfig对象,使用编码器。DeepLearningConfig.设置ArmComputeVersion而且ArmArchitecture属性。设置DeepLearningConfig属性的代码生成配置对象编码器。手臂NEONConfig对象。

    DLCFG =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;

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

    • 对于ARMv7架构,请使用ARM兼容->ARM Cortex

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

    例如:

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

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

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

示例请参见基于ARM目标的深度学习代码生成

生成的代码

系列网络生成为包含层类数组的c++类。

class b_squeezenet_0 {public: int32_T batchSize;int32_T numLayers;real32_T * inputData;real32_T * outputData;MWCNNLayer *层[68];private: MWTargetNetworkImpl *targetImpl;公众:b_squeezenet_0 ();空白presetup ();空白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;//函数定义// //持久化对象网络用于加载DAGNetwork对象。//第一次调用该函数时,将构造持久对象并建立持久对象。当该函数后续被调用时,相同的对象将被重用//以对输入调用predict,避免重构和重新加载// network对象。//参数:const real32_T in[154587] // real32_T out[1000] //返回类型:void // void squeezenet_predict(const real32_T in[154587], real32_T out[1000]){//版权2018 The MathWorks, Inc. if (!net_not_empty) {DeepLearningNetwork_setup(&net);Net_not_empty = true;} DeepLearningNetwork_predict(&net, in, out);}

对于有参数的层导出二进制文件,例如网络中的全连接层和卷积层。例如,文件名具有模式的文件cnn_squeezenet_ * _w而且cnn_squeezenet_ * _b对应于网络中卷积层的权值和偏置参数。

cnn_squeezenet_conv1_b cnn_squeezenet_conv1_w cnn_squeezenet_fire2-expand1x1_b cnn_squeezenet_fire2-expand3x3_b cnn_squeezenet_fire2-expand3x3_w cnn_squeezenet_fire2-squeeze1x1_b cnn_squeezenet_fire2-squeeze1x1_b

int8代码生成

看到为深度学习网络生成int8代码

代码生成使用MATLAB编码器应用程序

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

  2. 生成代码的一步。(跳过检查运行时问题因为使用ARM计算库生成代码不支持MEX生成。)万博1manbetx

  3. 语言c++

  4. 指定目标ARM硬件。

    如果你的目标硬件是树莓派,并且你安装了树莓派硬件的M万博1manbetxATLAB支持包

    • 硬件板中,选择覆盆子π

    • 单击,进入树莓派设置更多的设置.然后,单击硬件.指定设备地址用户名密码,建立目录

    当你没有ARM目标的支持包时:万博1manbetx

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

    • 硬件板中,选择无-选择下方的设备

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

    • 设备类型

      • 对于ARMv7架构,选择手臂皮层

      • 对于ARMv8架构,选择ARM 64位(LP64)

    请注意

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

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

  6. 生成代码。

另请参阅

||

相关的话题