主要内容

基于cuDNN的深度学习网络代码生成

使用GPU Coder™,您可以从深度学习工具箱™生成用于预测各种训练有素的深度学习网络的优化代码。生成的代码通过使用您在输入中指定的架构、层和参数来实现深度卷积神经网络(CNN)SeriesNetwork(深度学习工具箱)DAGNetwork(深度学习工具箱)对象。代码生成器利用了NVIDIA®CUDA®适用于NVIDIA GPU的深度神经网络库(cuDNN)。cuDNN是一个GPU加速的深度神经网络原语库。生成的代码可以作为源代码、静态或动态库或可执行文件集成到项目中,您可以将其部署到各种NVIDIA GPU平台。

使用其中一种方法生成卷积网络代码:

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

  • 从MATLAB入口点函数生成CUDA代码的GPU编码器应用程序。

请注意

在以前的版本中,您可以使用cnncodegen函数。从R2020b开始,建议使用codegen命令而不是cnncodegen函数,因为在未来的版本中cnncodegen函数将生成C++代码并仅为该臂构建静态库。®马里GPU处理器。

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

在这个例子中,你使用GPU编码器为预先训练的CUDA生成代码水壶(深度学习工具箱)深度卷积神经网络和图像分类。GoogLeNet接受过超过一百万张图像的训练,可以将图像分为1000个对象类别(如键盘、咖啡杯、铅笔和动物)。该网络已经学习了大量图像的丰富特征表示。该网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。此示例演示如何使用codegen命令和GPU编码器应用程序。

需求

要求

本例生成的CUDA MEX具有以下附加要求。

  1. 深度学习工具。

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

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

  4. CUDA支持NVIDIA GPU和一个兼容的驱动程序。对于8位整数精度,CUDA GPU必须具有6.1、6.3或更高的计算能力。

可选

对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。

  1. CUDA toolkit和cuDNN库。有关支持的编译器和库版本的信息,请参阅金宝app安装必备产品下载188bet金宝搏

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

负载Pretrained网络

  1. 加载预训练的GoogLeNet网络。您可以选择加载不同的预训练网络进行图像分类。如果您没有安装所需的支持包,软件将提供下载链接。金宝app

    净=googlenet;

  2. 的对象包含DAGNetwork对象。使用分析网络(深度学习工具箱)功能用于显示网络体系结构的交互式可视化,检测网络中的错误和问题,并显示有关网络层的详细信息。层信息包括层激活和可学习参数的大小、可学习参数的总数以及状态参数的大小f复发层。

    分析网络;

  3. 您想要分类的图像必须与网络的输入大小相同。对于GoogLeNet来说,它的大小imageInputLayer(深度学习工具箱)是224乘224乘3。这个输出属性分类层(深度学习工具箱)包含由网络学习的类的名称。查看总共1000个类名中的10个随机类名。

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

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

创建一个入口点函数

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

    1. 使用coder.loadDeepLearningNetwork函数加载深度学习模型,并构建和建立CNN类。有关更多信息,请参见用于代码生成的负载预训练网络

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

  2. 例如:

    函数out=谷歌网预测(in)% # codegen持续的mynet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork (“googlenet”);结束输入通过率=预测(mynet,);

    一个持久化对象mynet加载DAGNetwork对象。在第一次调用入口点函数时,构造并建立持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测在输入时,避免重构和重新加载网络对象。

    请注意

    代码生成需要将网络加载到持久对象中。

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

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

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

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

    对于LSTM网络,也可以使用predictAndUpdateState(深度学习工具箱)resetState(深度学习工具箱)方法。有关这些方法的使用注意事项和限制,请参阅金宝app支持功能表格

使用代码生成codegen

  1. 若要配置生成设置(如输出文件名、位置和类型),请创建编码器配置对象。若要创建对象,请使用coder.gpuConfig作用例如,在使用codegen命令,使用cfg=coder.gpuConfig('mex');

    其他可选方案有:

    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指定代码生成参数,请设置深度学习配置属性到一个编码器。CuDNNConfig使用创建的对象编码器。深度学习配置

    cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”; cfg.DeepLearningConfig=coder.DeepLearningConfig(“cudnn”); cfg.DeepLearningConfig.AutoTuning=true;cfg.DeepLearningConfig.DataType=“fp32”

    的方法指定支撑层中推理计算的精度金宝app数据类型财产。在32位浮点数中执行推断时,使用“fp32”.对于8位整数,使用“int8”.默认值是“fp32”INT8精度要求CUDA GPU的最小计算能力为6.1。使用计算能力财产的GpuConfig对象设置相应的计算能力值。

    请注意

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

    在进行推理时INT8使用CUDNN版本81.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使用指定的配置对象生成代码。

    请注意

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

    默认情况下,代码生成器使用列主布局。要使用行主布局,请传递-rowmajor可以选择的codegen命令。或者,通过修改罗梅杰参数在代码生成配置对象中。

  4. 代码生成成功后,可以通过单击查看生成的代码生成报告查看报告在MATLAB命令窗口中。报表显示在“报表查看器”窗口中。如果代码生成器在代码生成期间检测到错误或警告,则报告将描述问题并提供问题MATLAB代码的链接。看到代码生成报告

    代码生成成功:查看报告

生成的代码

DAG网络是作为一个包含78层类数组的c++类生成的。代码生成器通过对卷积层和ReLU层进行层融合优化,减少了层数。类声明的代码片段googlenet_predict_types.h显示文件。

googlenet_predict_types.h文件

  • 设置()方法为网络对象的每一层建立句柄并分配内存。

  • 预测()方法对网络中的78层中的每一层调用预测。

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

二进制文件导出的层与参数,如完全连接和卷积层在网络。例如,文件cnn_googlenet_conv * _wcnn_googlenet_conv * _b对应的权值和偏差参数FusedConvReLU网络中的层。代码生成器将这些二进制文件放置在codegen文件夹中。

请注意

在窗户上®系统,一些反病毒软件(如Bit Defender)可能会错误地识别出一些权重文件为受感染文件并删除它们。这些情况是假阳性和文件可以标记为安全在你的杀毒程序。

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

googlenet_predict.cu文件

使用应用程序生成代码

要指定入口点函数和指定输入类型,请在应用程序中完成该过程使用GPU编码器应用程序生成代码

生成代码步骤:

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

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

  3. 关闭“设置”窗口。要生成CUDA代码,请单击生成

生成的生成文件

“自由”“dll”,“exe”目标时,代码生成器创建* _rtw.mkcodegen文件夹中。在这个make文件中,生成代码的位置通过使用START_DIR变量部分。默认情况下,该变量指向生成代码的当前工作文件夹的路径。如果您计划移动生成的文件并使用makefile进行构建,请替换生成的值START_DIR具有适当的路径位置。

运行生成的MEX

  1. 您想要分类的图像必须与网络的输入大小相同。读取要分类的图像,并将其调整为网络的输入大小。这个大小调整稍微改变了图像的宽高比。

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

    预测分数=谷歌预测指数(im);
  3. 以直方图的形式显示前5个预测标签及其相关的概率。由于网络将图像分类为如此多的对象类别,而且许多类别是相似的,因此在评估网络时,通常会考虑前五名的精度。该网络将图像分类为一个高概率的甜椒。

    [分数,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的5大预测”

另请参阅

功能

对象

相关的话题