这个示例演示了如何为使用深度学习的图像分类应用程序执行代码生成。它使用编码基因
命令生成MEX函数,该函数通过使用图像分类网络(如MobileNet-v2、ResNet和GoogLeNet)运行预测。
要求
本例生成CUDA MEX,并具有以下第三方需求。
CUDA®支持NVIDIA®GPU和兼容驱动程序。
可选择的
对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。
英伟达工具包。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和设置必备产品s manbetx 845.
使用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
(深度学习工具箱)函数显示深度学习网络架构的交互式可视化。
net=mobilenetw2();分析网络;
这个mobilenetw2_predict.m
入口点函数取图像输入,并使用预先训练的MobileNet-v2卷积神经网络对图像进行预测。该函数使用持久对象mynet加载series网络对象并重用持久对象以在后续调用中进行预测。
类型(“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);
要为服务器生成CUDA代码,请执行以下操作:mobilenetv2_predict
为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig
函数创建一个CuDNN
深度学习配置对象并将其分配给DeepLearningConfig
GPU代码配置对象的属性。运行编码基因
命令并指定输入大小[224224,3]。此值对应于MobileNet-v2网络的输入层大小。
cfg=coder.gpuConfig(“墨西哥”); cfg.TargetLang=“C++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen-配置cfgmobilenetv2_predict-args{one(224224,3)}报告
代码生成成功:查看报告
该系列网络是由包含155层类和函数的数组组成的C++类,用于建立、调用预测和清理网络。
班b_mobilenetv2_0{....公众:b_mobilenetv2_0 ();无效的设置();无效的预测();无效的清理();~ b_mobilenetv2_0 ();};
这个设置()
方法为网络对象的每一层建立句柄并分配内存。这个预测
该方法对网络中的155层中的每一层执行预测。
入口点函数mobilenetv2_predict ()
在生成的代码文件中mobilenetv2_predict.cu
构造的静态对象b_mobilenetv2类类型并调用此网络对象上的设置和预测。
静止的b_mobilenetv2_0mynet;静止的boolean_T我的网络不是空的;
/ *函数定义*/无效mobilenetv2_predict(const real_T in[150528], real32_T out[1000]){如果(!mynet_非_空){DeepLearningNetwork_setup (&mynet);mynet_not_empty = true;}
/*传入输入*/DeepLearningNetwork_predict(&mynet,in,out);}
二进制文件是为具有参数的层导出的,例如网络中的完全连接层和卷积层。例如,文件cnn\u mobilenetv2\u conv*\u w和cnn\u mobilenetv2\u conv*\u b对应于网络中卷积层的权重和偏差参数。要查看生成文件的列表,请使用:
目录(完整文件),“codegen”,“墨西哥”,“MobileNet V2_预测”))
加载输入图像。
im=imread(“peppers.png”);imshow (im);
呼叫mobilenetv2_predict_mex
在输入图像上。
im=imresize(im[224224]);预测分数=mobilenetv2\u预测分数(双倍(im));
获取前五名预测分数及其标签。
[分数,indx]=排序(预测分数,“下降”);classNames=net.Layers(end).classNames;classNamesTop=classNames(indx(1:5));h=figure;h.Position(3)=2*h.Position(3);ax1=子批次(1,2,1);ax2=子批次(1,2,2);image(ax1,im);barh(ax2,分数(5:-1:1))xlabel(ax2,“概率”) yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;头衔(“使用MobileNet-v2的五大预测”)
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
您也可以使用DAG网络ResNet-50进行图像分类。深度学习工具箱的ResNet-50支持包中有一个用于MATLAB的预训练的ResNet-50模型。万博1manbetx要下载和安装支持包,请使用Add-On Explorer万博1manbetx。要了解有关查找和安装附加组件的更多信息,请参见获取和管理加载项.
网= resnet50;disp(净)
带有属性的DAGNetwork: Layers: [177×1 nnet.cnn.layer.Layer] Connections: [192×2 table] InputNames: {'input_1'} OutputNames: {'ClassificationLayer_fc1000'}
要为服务器生成CUDA代码,请执行以下操作:resnet_.m
为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。这个入口点函数调用resnet50
函数加载网络并对输入图像执行预测。
cfg=coder.gpuConfig(“墨西哥”); cfg.TargetLang=“C++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen-配置cfg预测-args{one(224224,3)}报告
代码生成成功:查看报告
呼叫预测
在输入图像上。
predict_scores = resnet_predict_mex(双(im));
获取前五名预测分数及其标签。
[分数,indx]=排序(预测分数,“下降”);classNames=net.Layers(end).classNames;classNamesTop=classNames(indx(1:5));h=figure;h.Position(3)=2*h.Position(3);ax1=子批次(1,2,1);ax2=子批次(1,2,2);image(ax1,im);barh(ax2,分数(5:-1:1))xlabel(ax2,“概率”) yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;头衔(“使用ResNet-50的五大预测”)
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
深度学习工具箱的GoogLeNet支持包中提供了一个针对MATLAB的预先训练的GoogLeNet模型。要下载并安装支持包,请使用附加模块资万博1manbetx源管理器。要了解有关查找和安装加载项的更多信息,请参阅获取和管理加载项.
净=谷歌网;显示(净)
带有属性的DAGNetwork: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'output'}
为服务器生成CUDA代码googlenet_predict.m
入口点函数。此入口点函数调用googlenet
函数加载网络并对输入图像执行预测。要为这个入口点函数生成代码,请为MEX目标创建一个GPU配置对象。
cfg=coder.gpuConfig(“墨西哥”); cfg.TargetLang=“C++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen-配置cfggooglenet_predict-args{one(224224,3)}报告
代码生成成功:查看报告
呼叫googlenet_predict_mex
在输入图像上。
im=imresize(im,[224224]);predict_scores=googlenet_predict_mex(double(im));
获取前五名预测分数及其标签。
[分数,indx]=排序(预测分数,“下降”);classNames=net.Layers(end).classNames;classNamesTop=classNames(indx(1:5));h=figure;h.Position(3)=2*h.Position(3);ax1=子批次(1,2,1);ax2=子批次(1,2,2);image(ax1,im);barh(ax2,分数(5:-1:1))xlabel(ax2,“概率”) yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;头衔(“使用GoogLeNet的五大预测”)
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
coder.checkGpuInstall
|编码基因
|编码器。DeepLearningConfig
|coder.loadDeepLearningNetwork
|mobilenetv2
(深度学习工具箱)|resnet50
(深度学习工具箱)|googlenet
(深度学习工具箱)coder.gpuConfig
|编码器。CodeConfig
|coder.EmbeddedCodeConfig
|coder.gpuEnvConfig
|编码器。CuDNNConfig
|编码器。TensorRTConfig