主要内容

深度学习网络的代码生成

这个示例演示了如何为使用深度学习的图像分类应用程序执行代码生成。它使用代码生成命令生成,通过使用图像分类网络,诸如MobileNet-V2,RESNET和GoogLeNet运行预测的MEX功能。

第三方的先决条件

要求

本例生成CUDA MEX,并具有以下第三方需求。

  • CUDA®支持NVIDIA®GPU和兼容驱动程序。

可选的

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

验证GPU环境

使用coder.checkGpuInstall函数来验证运行此示例所需的编译器和库是否正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg.DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

mobilenetv2_predict入口点函数

MobileNet-v2是一个卷积神经网络,在ImageNet数据库的100多万张图像上进行训练。该网络有155层深度,可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。该网络的图像输入尺寸为224 × 224。使用analyzeNetwork(深度学习工具箱)函数显示深度学习网络架构的交互式可视化。

净= mobilenetv2();analyzeNetwork(净值);

mobilenetv2_predict.m入口点函数取图像输入,并使用预先训练的MobileNet-v2卷积神经网络对图像进行预测。该函数使用持久对象我的网加载系列网络对象和重新使用持久对象为在后续调用预测。

类型(“mobilenetv2_predict.m”
% Copyright 2017-2019 The MathWorks, Inc. function out = mobilenetv2_predict(in) %#codegen persistent mynet;如果是空的(mynet) mynet = code . loaddeeplearningnetwork ('mobilenetv2','mobilenetv2');输入输出= mynet.predict(in);

运行MEX代码生成

要生成CUDA代码mobilenetv2_predict为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig函数来创建CuDNN深学习配置对象,并将其分配给DeepLearningConfig所述GPU代码配置对象的属性。跑过代码生成命令并且指定[224,224,3]的输入大小。此值对应于MobileNet-V2网络的输入层的大小。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);代码生成-configCFG.mobilenetv2_predict-args{酮(224,224,3)}报告
代码生成成功:查看报告

生成的代码说明

串联网络被作为包含155级的类和函数的阵列设置一个C ++类,呼叫预测产生的,并清理网络。

班级b_mobilenetv2_0{......公众:b_mobilenetv2_0 ();无效的设置();无效的预测();无效的清理();~ b_mobilenetv2_0 ();};

设置()方法为网络对象的每一层建立句柄并分配内存。这预测()方法执行为每个网络中的155层的预测。

该入口点函数mobilenetv2_predict ()在生成的代码文件mobilenetv2_predict.cu构造的静态对象b_mobilenetv2类类型并调用此网络对象上的设置和预测。

静止的b_mobilenetv2_0我的网;静止的boolean_Tmynet_not_empty
/ *函数定义*/无效mobilenetv2_predict(const real_T in[150528], real32_T out[1000]){如果!mynet_not_empty){DeepLearningNetwork_setup (&mynet);mynet_not_empty = true;}
/ *传中输入* / DeepLearningNetwork_predict(我的网,IN,OUT);}

二进制文件导出用于层用参数,例如网络中的完全连接和卷积层。例如,文件cnn_mobilenetv2_conv * _w和cnn_mobilenetv2_conv * _b对应于权重和偏置参数为网络中的卷积层。要看到生成的文件的列表,使用方法:

DIR(完整文件(PWD,“codegen”'MEX''mobilenetv2_predict'))

运行生成的墨西哥人

加载的输入图像。

IM = imread(“peppers.png”);imshow (im);

称呼mobilenetv2_predict_mex输入图像。

IM = imresize(1M,[224224]);predict_scores = mobilenetv2_predict_mex(双(IM));

获得前五名的预测成绩和他们的标签。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(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(“五大预测使用MobileNet-V2”

显然,在内存中加载的静态网络对象。

清晰的墨西哥人

基于ResNet-50网络的图像分类

您也可以使用DAG网络ResNet-50进行图像分类。深度学习工具箱的ResNet-50支持包中有一个用于MATLAB的预训练的ResNet-50模型。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解更多有关寻找和安装附加组件,请参阅获取和管理加载项

网= resnet50;DISP(净)
带有属性的DAGNetwork: Layers: [177×1 nnet.cnn.layer.Layer] Connections: [192×2 table] InputNames: {'input_1'} OutputNames: {'ClassificationLayer_fc1000'}

运行MEX代码生成

要生成CUDA代码resnet_predict.m为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。此入口点函数调用resnet50函数加载网络并对输入图像执行预测。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);代码生成-configCFG.resnet_predict-args{酮(224,224,3)}报告
代码生成成功:查看报告

称呼resnet_predict_mex输入图像。

predict_scores = resnet_predict_mex(双(im));

获得前五名的预测成绩和他们的标签。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(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(“五大预测使用RESNET-50”

显然,在内存中加载的静态网络对象。

清晰的墨西哥人

利用GoogLeNet(盗)网图片分类

预训练GoogLeNet模型MATLAB处于深度学习工具箱的GoogLeNet支持封装。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解更多有关寻找和安装附加组件,请参阅获取和管理加载项

净= googlenet;DISP(净)
带有属性的DAGNetwork: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'output'}

运行MEX代码生成

生成的代码CUDAgooglenet_predict.m入口点函数。此入口点函数调用googlenet函数加载网络并对输入图像执行预测。要为这个入口点函数生成代码,请为MEX目标创建一个GPU配置对象。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);代码生成-configCFG.googlenet_predict-args{酮(224,224,3)}报告
代码生成成功:查看报告

称呼googlenet_predict_mex输入图像。

IM = imresize(1M,[224224]);predict_scores = googlenet_predict_mex(双(IM));

获得前五名的预测成绩和他们的标签。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(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的五大预测”

显然,在内存中加载的静态网络对象。

清晰的墨西哥人

也可以看看

职能

对象

相关的话题