主要内容

深度学习网络的代码生成

此示例演示如何为使用深度学习的图像分类应用程序执行代码生成codegen命令,生成MEX函数,该函数使用MobileNet-v2、ResNet和GoogLeNet等图像分类网络运行预测。

第三方先决条件

要求

此示例生成CUDA MEX,并具有以下第三方要求。

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

可选

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

验证GPU环境

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

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

美孚预测入口点函数

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

网= mobilenetv2 ();analyzeNetwork(净);

mobilenetw2_predict.m入口点函数接收图像输入,并使用预训练的MobileNet-v2卷积神经网络对图像进行预测。该函数使用持久对象mynet加载系列网络对象并重用持久对象,以便对后续调用进行预测。

类型(“mobilenetw2\u predict.m”
%版权所有2017-2019 MathWorks,Inc.函数out=mobilenetv2_predict(in)%#codegen persistent mynet;如果isempty(mynet)mynet=coder.loadDeepLearningNetwork('mobilenetv2','mobilenetv2');end%传入输出=mynet.predict(in);

运行MEX代码生成

生成的CUDA代码美孚预测入口点函数,为MeX目标创建GPU代码配置对象,并将目标语言设置为C++。coder.DeepLearningConfig函数创建一个CuDNN的深度学习配置对象,并将其分配给深度学习配置图形处理器代码配置对象的属性。运行codegen命令并指定输入大小[224,224,3]。该值对应于MobileNet-v2网络的输入层大小。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”; cfg.DeepLearningConfig=coder.DeepLearningConfig(“cudnn”);codegen配置cfg美孚预测arg游戏{1 (224224 3)}-报告
代码生成成功:查看报告

生成的代码描述

系列网络是作为一个c++类生成的,包含155个层类和函数,用于设置、调用预测和清理网络。

b_mobilenetv2_0...public:b_mobilenetv2_0();void setup();void predict();void cleanup();~b_mobilenetv2_0();};

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

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

静态b_mobilenetv2_0mynet静止的布尔值mynet_not_empty
/*函数定义*/无效的mobilenetv2\u预测(常量实输入[150528],实输出[1000])如果! mynet_not_empty) {DeepLearningNetwork_设置(&mynet);mynet_not_empty=true;}
/*通过输入*/ DeepLearningNetwork_predict(&mynet, in, out);}

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

dir (fullfile (pwd,“codegen”墨西哥人的“mobilenetv2_predict”))

运行生成的MEX

加载输入图像。

我= imread (“peppers.png”)(imshow);;

调用mobilenetv2\u predict\u mex在输入图像上。

Im = imresize(Im, [224,224]);predict_scores = mobilenetv2_predict_mex(双(im));

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

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);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,类名top(5:-1:1))ax2.YAxisLocation=“对”;sgtitle (“使用MobileNet-v2的五大预测”

清除加载到内存中的静态网络对象。

清晰的墨西哥人

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

您还可以使用DAG网络ResNet-50进行图像分类。深度学习工具箱的ResNet-50支持包中提供了一个针对MATLAB的预训练ResNet-50模型。要下载和安装支持包,请使用加载项资源管理器。要了解有关查找和安装加载项的更多信息,请参阅金宝app获取和管理附加组件

净=resnet50;显示(净)
带有属性的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 (墨西哥人的);cfg。TargetLang =“c++”; cfg.DeepLearningConfig=coder.DeepLearningConfig(“cudnn”);codegen配置cfgresnet_predictarg游戏{1 (224224 3)}-报告
代码生成成功:查看报告

调用resnet_predict_mex在输入图像上。

预测分数=resnet\u predict\u mex(双倍(im));

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

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);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,类名top(5:-1:1))ax2.YAxisLocation=“对”;sgtitle (“使用ResNet-50的五大预测”

清除加载到内存中的静态网络对象。

清晰的墨西哥人

基于GoogLeNet (Inception)网络的图像分类

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

网= googlenet;disp(净)
具有属性的DAG网络:层:[144×1 nnet.cnn.layer.layer]连接:[170×2表]输入名称:{'data'}输出名称:{'output'}

运行MEX代码生成

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

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”; cfg.DeepLearningConfig=coder.DeepLearningConfig(“cudnn”);codegen配置cfg古格伦arg游戏{1 (224224 3)}-报告
代码生成成功:查看报告

调用谷歌网在输入图像上。

Im = imresize(Im, [224,224]);predict_scores = googlenet_predict_mex(双(im));

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

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);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,类名top(5:-1:1))ax2.YAxisLocation=“对”;sgtitle (“使用谷歌网的五大预测”

清除加载到内存中的静态网络对象。

清晰的墨西哥人

另请参阅

功能

对象

相关的话题