主要内容

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

这个例子展示了如何为一个使用深度学习的图像分类应用程序执行代码生成。它使用codegen命令生成MEX函数,该函数使用图像分类网络(如MobileNet-v2、ResNet和GoogLeNet)进行预测。

第三方的先决条件

要求

本例生成CUDA MEX,第三方需求如下。

  • CUDA®启用NVIDIA®GPU和兼容驱动程序。

可选

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

检查GPU环境

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

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

mobilenetv2_predict入口点函数

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

Net = mobilenetv2();analyzeNetwork(净);

mobilenetv2_predict.m入口点函数接受图像输入,并使用预先训练好的MobileNet-v2卷积神经网络对图像进行预测。该函数使用一个持久对象mynet加载系列网络对象,并在后续调用中重用持久对象进行预测。

类型(“mobilenetv2_predict.m”
The MathWorks, Inc. function out = mobilenetv2_predict(in) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('mobilenetv2','mobilenetv2');输入输出= mynet.predict(in);

运行MEX代码生成

生成CUDA代码mobilenetv2_predict入口点函数,为MEX目标创建GPU代码配置对象,并设置目标语言为c++。使用编码器。DeepLearningConfig函数创建CuDNN深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen命令并指定输入大小为[224,224,3]。该值对应MobileNet-v2网络的输入层大小。

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfgmobilenetv2_predictarg游戏{1 (224224 3)}报告
代码生成成功:查看报告

生成代码说明

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

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

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

入口函数mobilenetv2_predict ()在生成的代码文件中mobilenetv2_predict.cu的静态对象b_mobilenetv2类类型,并在此网络对象上调用setup和predict。

静态b_mobilenetv2_0mynet;静态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;}
/* pass in input */ DeepLearningNetwork_predict(&mynet, in, out);}

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

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

运行生成的MEX

加载一个输入图像。

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

调用mobilenetv2_predict_mex在输入图像上。

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

获得前五个预测分数及其标签。

[scores,indx] = sort(predict_scores,“下”);classNames = net.Layers(end).ClassNames;classNamesTop = classNames(indx(1:5));H =数字;h.位置(3)= 2*h.位置(3);Ax1 = subplot(1,2,1);Ax2 = subplot(1,2,2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,“概率”) yticklabels(ax2,classNamesTop(5:-1:1))YAxisLocation =“对”;sgtitle (“使用MobileNet-v2的五大预测”

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

清晰的墨西哥人

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

你也可以使用DAG网络ResNet-50进行图像分类。在深度学习工具箱的ResNet-50支持包中提供了MATLAB预训练的ResNet-50模型。万博1manbetx要下载和安装支持包,请使用Add-On资源管理器。万博1manbetx要了解有关查找和安装外接程序的详细信息,请参见获取和管理外接组件

Net = resnet50;disp(净)
DAGNetwork with properties: 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 = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfgresnet_predictarg游戏{1 (224224 3)}报告
代码生成成功:查看报告

调用resnet_predict_mex在输入图像上。

Predict_scores = resnet_predict_mex(双(im));

获得前五个预测分数及其标签。

[scores,indx] = sort(predict_scores,“下”);classNames = net.Layers(end).ClassNames;classNamesTop = classNames(indx(1:5));H =数字;h.位置(3)= 2*h.位置(3);Ax1 = subplot(1,2,1);Ax2 = subplot(1,2,2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,“概率”) yticklabels(ax2,classNamesTop(5:-1:1))YAxisLocation =“对”;sgtitle (“使用ResNet-50的五大预测”

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

清晰的墨西哥人

利用GoogLeNet (Inception)网络进行图像分类

在深度学习工具箱的GoogLeNet支持包中提供了一个用于MATLAB的预训练的GoogLeNet模型。万博1manbetx要下载和安装支持包,请使用Add-On资源管理器。万博1manbetx要了解有关查找和安装外接程序的详细信息,请参见获取和管理外接组件

Net = googlenet;disp(净)
DAGNetwork with properties: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'output'}

运行MEX代码生成

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

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告
代码生成成功:查看报告

调用googlenet_predict_mex在输入图像上。

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

获得前五个预测分数及其标签。

[scores,indx] = sort(predict_scores,“下”);classNames = net.Layers(end).ClassNames;classNamesTop = classNames(indx(1:5));H =数字;h.位置(3)= 2*h.位置(3);Ax1 = subplot(1,2,1);Ax2 = subplot(1,2,2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,“概率”) yticklabels(ax2,classNamesTop(5:-1:1))YAxisLocation =“对”;sgtitle (“使用GoogLeNet的五大预测”

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

清晰的墨西哥人

另请参阅

功能

对象

相关的话题