这个例子展示了如何对使用深学习图像分类应用程序执行码生成。它使用codegen
命令,生成MEX函数,该函数使用MobileNet-v2、ResNet和GoogLeNet等图像分类网络运行预测。
要求
这个例子生成CUDA MEX,并具有以下第三方要求。
启用CUDA®GPU的NVIDIA®和兼容的驱动程序。
可选
对于非MEX构建诸如静态,动态库或可执行文件,此实施例具有以下附加要求。
NVIDIA工具包。
NVIDIA 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
(深度学习工具箱)函数来显示深学习网络架构的交互式可视化。
网= mobilenetv2 ();analyzeNetwork(净);
的mobilenetv2_predict.m
入口点函数拍摄图像输入,并使用预训练MobileNet-V2卷积神经网络的图像上运行预测。该函数使用一个持久化对象mynet加载系列网络对象并重用持久对象,以便对后续调用进行预测。
类型('mobilenetv2_predict.m')
%版权所有2017年至2019年MathWorks公司功能OUT = mobilenetv2_predict(上)%#CODEGEN持久我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork( 'mobilenetv2', 'mobilenetv2');结束输入%的合格出= mynet.predict(IN);
生成的CUDA代码mobilenetv2_predict
入口点函数,用于创建一个MEX目标一个GPU代码配置对象和目标语言设置为C ++。使用coder.DeepLearningConfig
函数创建CuDNN
的深度学习配置对象,并将其分配给DeepLearningConfig
图形处理器代码配置对象的属性。运行codegen
命令并指定输入大小[224,224,3]。该值对应于MobileNet-v2网络的输入层大小。
cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.DeepLearningConfig = coder.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类类型并调用设置和预测该网络对象。
静态b_mobilenetv2_0mynet;静态boolean_Tmynet_not_empty;
/ *函数定义* /空白mobilenetv2_predict(常量real_T在[150528],real32_T出[1000]){如果(! mynet_not_empty) {DeepLearningNetwork_setup(我的网);mynet_not_empty = TRUE;}
/*通过输入*/ DeepLearningNetwork_predict(&mynet, in, out);}
二进制文件导出的层与参数,如完全连接和卷积层在网络。例如,文件cnn_mobilenetv2_conv*_w和cnn_mobilenetv2_conv*_b对应于网络中卷积层的权值和偏置参数。要查看生成的文件列表,请使用:
dir (fullfile (pwd,“codegen”,墨西哥人的,“mobilenetv2_predict”))
加载一个输入图像。
我= imread ('peppers.png');imshow(IM);
调用mobilenetv2_predict_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,classNamesTop(5:-1:1))= ax2.YAxisLocation“对”;sgtitle (“使用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_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
在输入图像上。
predict_scores = resnet_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,classNamesTop(5:-1:1))= ax2.YAxisLocation“对”;sgtitle (“使用ResNet-50的五大预测”)
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
深度学习工具箱中的GoogLeNet支持包中有一个用于MATLAB的预先训练的GoogLeNet模型。万博1manbetx要下载和安装支持包,请使用Add-On Explorer万博1manbetx。要了解有关查找和安装附加组件的更多信息,请参见获取和管理附加组件.
网= googlenet;disp(净)
DAGNetwork与属性:层:[144×1 nnet.cnn.layer.Layer]连接:[170×2表] InputNames:{ '数据'} OutputNames:{ '输出'}
生成CUDA代码googlenet_predict.m
入口点函数。这个入口点函数调用googlenet
函数加载网络并对输入图像执行预测。为了产生用于这入口点函数代码,创建用于MEX目标一个GPU配置对象。
cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}-报告
代码生成成功:查看报告
调用googlenet_predict_mex
在输入图像上。
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,classNamesTop(5:-1:1))= ax2.YAxisLocation“对”;sgtitle (“五大预测使用GoogLeNet”)
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
coder.checkGpuInstall
|codegen
|coder.DeepLearningConfig
|coder.loadDeepLearningNetwork
|mobilenetv2
(深度学习工具箱)|resnet50
(深度学习工具箱)|googlenet
(深度学习工具箱)coder.gpuConfig
|coder.CodeConfig
|编码器。EmbeddedCodeConfig
|coder.gpuEnvConfig
|coder.CuDNNConfig
|coder.TensorRTConfig