主要内容

通过使用cuDNN代码生成深度学习网络

与GPU编码器™,你可以生成预测的优化代码的各种训练的深度学习网络深度学习工具箱™。生成的代码实现了深卷积神经网络(CNN)通过使用体系结构中,层,和参数中指定的输入SeriesNetwork(深度学习工具箱)DAGNetwork(深度学习工具箱)对象。NVIDIA的代码生成器利用®CUDA®深层神经网络库(cuDNN) NVIDIA gpu。cuDNN是一个GPU-accelerated库原语的深层神经网络。生成的代码可以集成到你的项目源代码,静态或动态库,或可执行文件,您可以部署到各种各样的NVIDIA GPU平台。

生成代码的卷积网络使用的方法之一:

  • 标准的codegen从MATLAB函数生成CUDA代码®入口点函数。

  • ,生成代码CUDA GPU编码器应用MATLAB入口点函数。

请注意

在以前的版本中,你可以通过使用目标cuDNN库cnncodegen函数。从R2021a开始,cnncodegen函数生成c++代码,使文件只手臂®马里GPU处理器。

通过使用GoogLeNet生成代码并对图像进行分类

在本例中,您使用GPU编码器生成CUDA pretrained的代码googlenet(深度学习工具箱)深卷积神经网络和图像进行分类。GoogLeNet已经在超过一百万个图像和训练可以分类图像到1000年对象类别(如键盘、咖啡杯、铅笔和动物)。网络已经学会丰富广泛的图像特征表示。网络需要一个图像作为输入,然后输出图像中对象的标签一起为每个对象的类别的概率。这个例子向您展示了如何为pretrained网络通过使用生成代码codegen命令和GPU编码器的应用。

需求

要求

这个示例中生成CUDA墨西哥人,有以下额外的需求。

  1. 深度学习工具。

  2. 深度学习工具箱GoogLeNet网络模型金宝app支持包。

  3. 为深度学习GPU编码器接口库金宝app支持包。

  4. CUDA启用NVIDIA GPU和兼容的驱动程序。8位整数精确,CUDA GPU必须6.1或更高的计算能力。

可选

等non-MEX构建静态、动态库,或可执行文件,这个例子有以下附加要求。

  1. CUDA工具包和cuDNN库。信息的支持版本的编译器和库,明白了金宝app安装必备产品下载188bet金宝搏

  2. 环境变量的编译器和库。有关更多信息,请参见环境变量

负载Pretrained网络

  1. 加载pretrained GoogLeNet网络。你可以选择加载不同pretrained网络图像分类。如果您没有所需的支持包安装,软件提供了一个下载链接。金宝app

    网= googlenet;

  2. 的对象包含了DAGNetwork对象。使用analyzeNetwork(深度学习工具箱)函数显示一个交互式可视化的网络架构,来检测网络中的错误和问题,并显示详细信息网络层。层信息包括层激活的大小和可学的参数,可学的参数的总数,复发性层的状态参数的大小。

    analyzeNetwork(净);

  3. 你要分类的图像必须有相同的大小作为输入网络的大小。GoogLeNet的大小imageInputLayer(深度学习工具箱)是224 - 224 - 3。的输出的属性classificationLayer(深度学习工具箱)包含类的名称由网络学习。10个随机类名的共有1000人。

    一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
    “快艇”“纱窗”“等足类动物”“木匙”“口红”“德雷克”“土狼”“哑铃”“草莓”“奶油苹果”

    有关更多信息,请参见深度学习层的列表(深度学习工具箱)

创建一个入口点函数

  1. 在MATLAB编写一个入口点函数:

    1. 使用coder.loadDeepLearningNetwork函数加载一个深度学习模型和构造和设置一个CNN类。有关更多信息,请参见负载Pretrained网络代码生成

    2. 调用预测(深度学习工具箱)预测的响应。

  2. 例如:

    函数= googlenet_predict(中)% # codegen持续的mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“googlenet”);结束%通过输入=预测(mynet,);

    一个持久化对象mynet加载DAGNetwork对象。在第一次调用的入口点函数,构造持久对象和设置。在随后的调用函数,要调用相同的对象被重复使用预测在输入,避免重建并重新加载网络对象。

    请注意

    代码生成需要加载到一个持久的网络对象。

  3. 您还可以使用激活(深度学习工具箱)网络激活特定层的方法。例如,下面的代码行返回指定的层的网络激活layerIdx

    出=激活(mynet layerIdx,“OutputAs”,“渠道”);

  4. 您还可以使用分类(深度学习工具箱)图像数据的方法来预测类标签使用训练网络,mynet

    [,分数]=分类(mynet,);

    LSTM网络,你还可以使用predictAndUpdateState(深度学习工具箱)resetState(深度学习工具箱)方法。使用笔记和这些方法的局限性,请参阅相应的条目金宝app支持功能表。

代码生成通过使用codegen

  1. 等配置构建设置输出文件名称、位置和类型,您将创建编码器配置对象。创建对象,使用coder.gpuConfig函数。例如,当生成CUDA墨西哥人使用codegen命令,使用cfg = coder.gpuConfig(墨西哥人);

    其他可用的选项是:

    1. cfg = coder.gpuConfig(“自由”);,创建一个代码生成配置为使用对象codegen当生成一个CUDA C / c++静态库。

    2. cfg = coder.gpuConfig (dll);,创建一个代码生成配置为使用对象codegen当生成一个CUDA C / c++动态库。

    3. cfg = coder.gpuConfig (exe);,创建一个代码生成配置为使用对象codegen当生成CUDA C / c++可执行文件。

  2. 为cuDNN指定代码生成参数,设置DeepLearningConfig属性到一个coder.CuDNNConfig使用您创建的对象coder.DeepLearningConfig

    cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);cfg.DeepLearningConfig。自动调谐= true;cfg.DeepLearningConfig。数据类型=“fp32”;

    指定精度的推理计算通过使用支持层金宝app数据类型财产。在32位浮点数进行推理时,使用“fp32”。8位整数,使用“int8”。默认值是“fp32”INT8精度需要CUDA GPU与最低6.1的计算能力。使用ComputeCapability财产的GpuConfig对象设置适当的计算能力值。

    请注意

    代码生成的INT8数据类型不支持多个深度学习网络的入口点金宝app函数。

    当执行推理在INT8NVIDIA精密使用cuDNN版本8.1.0、问题库可能会导致显著的性能退化。

  3. 运行codegen命令。的codegen命令生成CUDA代码的googlenet_predict.mMATLAB入口点函数。

    codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告

    1. 报告选项指示codegen生成的代码生成报告,可以使用它调试MATLAB代码。

    2. arg游戏选项指示codegen要编译的文件googlenet_predict.m通过使用类、大小和复杂性为输入指定。的值(224224年,3)对应于输入层GoogLeNet网络的大小。

    3. 配置选项指示codegen使用指定的配置对象代码生成。

    请注意

    您可以指定half-precision输入的代码生成。然而,代码生成器类型将输入转换为单精度。深度学习工具箱使用单精度浮点算法,在MATLAB计算。

    代码生成器使用默认列为主的布局。通过使用行布局-rowmajor可以选择的codegen命令。另外,为行布局通过修改配置代码cfg.RowMajor参数代码生成配置对象。

  4. 当代码生成成功,您可以通过单击视图生成的代码生成报告查看报告在MATLAB命令窗口。该报告是在报告中查看器显示窗口。如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。看到代码生成报告

    代码生成成功:查看报告

生成的代码

生成DAG网络作为一个c++类包含一个78层类数组。代码生成器可以减少使用层融合优化的层数卷积和ReLU层。类声明的一个片段googlenet_predict_types.h文件显示。

googlenet_predict_types.h文件

  • 设置()类的方法设置处理,为每一层的网络对象分配内存。

  • 预测()方法调用预测网络中为每个78层。

  • DeepLearningNetwork.cu文件包含定义对象的函数b_googlenet_0类。

二进制文件导出为层参数完全连接和卷积等在网络层。例如,文件cnn_googlenet_conv * _wcnn_googlenet_conv * _b参数对应的重量和偏见FusedConvReLU在网络层。代码生成器这些二进制文件的地方codegen文件夹中。

默认情况下,生成的应用程序查找文件的重量codegen文件夹中。如果你将生成的应用程序和重量文件到另一个位置如嵌入式,创建一个环境变量USER_DL_DATA_PATH的值是搬迁重量文件的位置。生成的应用程序将寻找重量文件在这个位置。

请注意

在Windows上®系统,一些杀毒软件如后卫可以正确识别一些重量文件感染和删除它们。这些病例是假阳性,文件可以标记为安全的防病毒程序。

在生成的代码文件中googlenet_predict.cu的入口点函数,googlenet_predict ()构造一个静态的对象b_googlenet_0类类型并调用设置和预测网络对象。

googlenet_predict.cu文件

通过使用应用程序生成代码

指定的入口点函数和指定的输入类型,完成应用程序的程序。通过使用GPU编码器应用代码生成

生成代码步骤:

  1. 设置构建类型墨西哥人

  2. 点击更多的设置。在深度学习窗格中,设置目标库cuDNN

  3. 关闭设置窗口。生成CUDA代码,点击生成

生成Makefile

“自由”,“dll”,exe”目标,代码生成器创建* _rtw.mk使文件codegen文件夹中。在这个文件,生成的代码通过使用指定的位置START_DIR变量中部分。默认情况下,这个变量指向当前工作文件夹的路径生成的代码。如果您计划将生成的文件和使用makefile构建,取代生成的值START_DIR适当的路径位置。

运行生成的墨西哥人

  1. 你要分类的图像必须有相同的大小作为输入网络的大小。读到你想要的图片进行分类并调整输入网络的大小。这稍微调整图像的纵横比变化。

    我= imread (“peppers.png”);inputLayerSize = net.Layers (1) .InputSize;我= imresize (im, inputLayerSize (1:2));
  2. 叫GoogLeNet预测输入图像。

    predict_scores = googlenet_predict_mex (im);
  3. 显示五大标签及其相关预测概率直方图。因为网络将图像分为很多对象类别,和许多类别相似,通常考虑五大精度在评估网络。网络分类甜椒和高概率的形象。

    [分数,indx] =排序(predict_scores“下”);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁, im);barh (ax2,分数(5:1:1))包含(ax2,“概率”)yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;sgtitle (“五大预测使用GoogLeNet”)

另请参阅

功能

对象

相关的话题