主要内容

使用CUDNN的深度学习网络代码生成

使用GPU编码器™,您可以生成优化的代码,用于预测来自Deep Learning Toolbox™的各种培训的深度学习网络。生成的代码通过使用在输入中指定的架构,层数和参数来实现深卷积神经网络(CNN)系列网络(深度学习工具箱)DAGNetwork(深度学习工具箱)对象。代码生成器利用了NVIDIA®CUDA.®NVIDIA GPU的深神经网络库(CUDNN)。CUDNN是深神经网络的GPU加速基元图书馆。生成的代码可以作为源代码,静态或动态库或可执行文件集成到您的项目中,或者可以部署到各种NVIDIA GPU平台。

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

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

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

笔记

在以前的版本中,您可以使用中使用CUDNN库cnncodegen.函数。从R2020b开始,建议使用codegen命令代替cnncodegen.函数,因为在未来的版本中cnncodegen.函数将生成C ++代码并仅为ARM构建静态库®Mali GPU处理器。

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

在此示例中,您可以使用GPU编码器生成预读数的CUDA代码googlenet.(深度学习工具箱)深度卷积神经网络并分类图像。Googlenet已接受过超过一百万个图像的培训,并可将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和动物)。该网络已经学习了丰富的特征表示,以获得各种图像。网络将图像作为输入拍摄,然后将图像中的对象的标签与每个对象类别的概率一起输出。此示例显示如何通过使用备用网络为预磨损网络生成代码codegen命令和GPU编码器应用程序。

需求

要求

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

  1. 深入学习工具箱。

  2. google网络的深度学习工具箱模型万博1manbetx支持包。

  3. 深度学习库的GPU编码器接口万博1manbetx支持包。

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

可选的

对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。

  1. CUDA工具包和CUDNN图书馆。有关有关编译器和库的支持版本的信息,请参阅万博1manbetx安装先决品产品s manbetx 845

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

负载Pretrained网络

  1. 加载预制googlenet网络。您可以选择加载不同的预制网络以进行图像分类。如果未安装所需的支持软件包,则该软件提供了一个下载链接。万博1manbetx

    net = googlenet;

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

    分析(网);

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

    ClassNames = Net.Layers(END).Classes;numclasses = numel(classnames);DISP(CLASSNMES(RANDPERM(NUMCLASES,10)))
    “快艇”“纱窗”“等足动物”“木勺”“口红”“德雷克”“鬣狗”“哑铃”“草莓”“奶油苹果”

    有关更多信息,请参阅深度学习层名单(深度学习工具箱)

创建一个入口点函数

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

    1. 使用Coder.LoadDeePlearningnetwork.函数加载深度学习模型和构建和设置CNN类。有关更多信息,请参阅加载代码生成的预磨损网络

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

  2. 例如:

    函数OUT = GOOGLENET_PREDICT(IN)% # codegen执着的yeNet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork ('googlenet');结尾%通过输入出局=预测(Mynet,In);

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

    笔记

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

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

    OUT =激活(MYNET,IN,LayerIDX,'Outputas','频道');

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

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

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

使用代码生成codegen

  1. 要配置构建设置,例如输出文件名,位置和类型,可以创建编码器配置对象。要创建对象,请使用Coder.gpuconfig.函数。例如,在使用CUDA MEX时使用codegen命令,使用cfg = coder.gpuconfig('mex');

    其他可选方案有:

    1. cfg = coder.gpuconfig('lib');,创建用于使用的代码生成配置对象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财产至A.编码器。CuDNNConfig使用使用的对象编码器。DeeplearningConfig

    cfg = coder.gpuconfig('mex');cfg。TargetLang =“c++”;cfg.deeplearningconfig = coder.deeplearningconfig('cudnn');cfg.deeplearningconfig.autotuning = true;cfg.deeplearningconfig.datatype =.'fp32'

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

    笔记

    代码生成INT8数据类型不支持入口点函数中的多个深度学万博1manbetx习网络。

    在进行推理时INT8使用CUDNN版本8.1.0的精度,NVIDIA库中的问题可能会导致性能显着降低。

  3. 跑过codegen命令。这codegen命令生成CUDA代码googlenet_predict.mmatlab入口点函数。

    codegen配置CFG.googlenet_predict-  args.{ONE(224,224,3)}-报告

    1. -报告选项指示codegen生成可用于调试MATLAB代码的代码生成报告。

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

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

    笔记

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

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

  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文件夹中。

笔记

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

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

googlenet_predict.cu文件

使用应用程序生成代码

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

生成代码步:

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

  2. 点击更多设置.在深度学习窗格,套目标库CUDNN.

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

生成的makefile.

为了'lib'“dll”,'可执行程序'目标,代码生成器创建* _rtw.mk.制作文件codegen文件夹中。在这个make文件中,生成代码的位置通过使用START_DIR变量部分。默认情况下,此变量指向生成代码的当前工作文件夹的路径。如果计划移动生成的文件并使用Makefile来构建,请替换生成的值START_DIR使用适当的路径位置。

运行生成的mex

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

    Im = imread(“peppers.png”);InputLayerSize = Net.Layers(1).Inputsize;IM = Imresize(IM,InputLayersize(1:2));
  2. 调用GoogLeNet对输入图像进行预测。

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

    [得分,Indx] =排序(预测_coves,“下降”);ClassNamestop = ClassNames(Indx(1:5));h =图;H.Position(3)= 2 * H.Position(3);AX1 =子图(1,2,1);AX2 =子图(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))XLABEL(AX2,'可能性') yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;sgtitle ('使用googlenet的前5名预测'

也可以看看

职能

对象

相关的话题