基于MATLAB函数块的深度学习网络GPU代码生成
使用GPU Coder™,您可以为Simulink生成优化的代码®包含各种经过训练的深度学习网络的模型。可以在Simulink中实现深度学习功能MATLAB函数块或通过使用块从深层神经网络图书馆。在实现与MATLAB函数块,用coder.loadDeepLearningNetwork
函数加载经过训练的深度学习网络,并使用网络对象的对象函数来获得所需的响应。您可以配置代码生成器以利用NVIDIA®CUDA®用于NVIDIA gpu的深度神经网络库(cuDNN)和TensorRT™高性能推理库。生成的代码通过使用您在网络对象中指定的体系结构、层和参数来实现深度卷积神经网络(CNN)。
示例:使用GoogLeNet对图片进行分类
GoogLeNet已经接受了超过100万张图片的训练,可以将图片分类为1000个对象类别(如键盘、咖啡杯、铅笔和动物)。该网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。这个示例向您展示了如何执行模拟并为预训练的程序生成CUDA代码googlenet
用深度卷积神经网络对图像进行分类。
加载预先训练的GoogLeNet网络。您可以选择加载不同的预训练网络来进行图像分类。如果您没有安装所需的支持软件包,请根据软件提供的说明进行安装。
网= googlenet;
的对象
网
包含了DAGNetwork
对象。使用analyzeNetwork
函数显示网络体系结构的交互式可视化,检测网络中的错误和问题,并显示关于网络层的详细信息。层信息包括层激活和可学习参数的大小,可学习参数的总数,循环层的状态参数的大小。analyzeNetwork(净);
要分类的图像必须与网络的输入大小相同。对于GoogLeNet,大小
imageInputLayer
是224 - 224 - 3。的类
输出的属性classificationLayer
包含网络学习到的类的名称。查看总共1000个类名中的10个随机类名。一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
“快艇”、“窗纱”、“等足类动物”、“木勺”、“口红”、“德雷克”、“鬣狗”、“哑铃”、“草莓”、“奶油苹果”
创建GoogLeNet模型
创建一个Simulink模型并插入MATLAB函数块的用户定义函数图书馆。
添加一个图像文件块的计算机视觉工具箱™库并设置
文件名称
参数peppers.png
.添加一个调整块的计算机视觉的工具箱库到模型。设置指定参数的调整块
输出行数和列数
并输入(224 224)
作为的值输出行数和列数.这个bock将输入图像调整为网络输入层的图像。双击MATLAB函数块。控件中出现默认函数签名MATLAB函数块编辑器。
定义一个函数
googlenet_predict
,实现预测入口点功能。函数头声明在
作为一个参数googlenet_predict
函数,分数
而且indxTop
作为返回值。函数[分数,indxTop] = googlenet_predict(中)% # codegen持续的mynet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork (“googlenet”);结束输入传入率predict_scores =预测(mynet);[分数,indx] =排序(predict_scores“下”);indxTop = indx (1:5);
一个持久化对象
mynet
加载DAGNetwork
对象。在第一次调用入口点函数时,将构造和设置持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测
在输入端,避免重构和重新加载网络对象。你也可以使用
激活
(深度学习工具箱)方法来激活特定层的网络。例如,下面的代码行返回中指定的层的网络激活layerIdx
.出=激活(mynet layerIdx,“OutputAs”,“渠道”);
你也可以使用
分类
(深度学习工具箱)中图像数据的类标签预测方法在
使用训练过的网络mynet
.[,分数]=分类(mynet,);
对于LSTM网络,您可以使用
predictAndUpdateState
(深度学习工具箱)而且resetState
(深度学习工具箱)方法。有关这些方法的使用说明和限制,请参见支持功能.的块参数MATLAB函数块。在代码生成选项卡上,选择
可重用的功能
为函数包装.如图所示将这些块连接起来。将模型保存为
googlenetModel
.
设置GPU加速模式
模型配置参数决定了仿真过程中使用的加速方法。
打开“配置参数”对话框。打开解算器窗格。要编译加速模型并生成CUDA代码,请将模型配置为使用固定步长求解器。该表显示了本示例的求解器配置。
参数 设置 对生成代码的影响 类型 固定步
维护代码生成所需的恒定(固定)步长 解算器 离散(无连续状态)
应用固定步长积分技术计算模型的状态导数 固定的大小 汽车
Simulink选择步长 选择模拟目标窗格。设置语言来
c++
.选择GPU加速.
选项特定于GPU Coder现在可见模拟目标> GPU加速窗格。对于本例,您可以使用这些特定于gpu的参数的默认值。
在模拟目标窗格中,设置目标库参数深度学习集团
cuDNN
.您也可以选择
TensorRT
针对NVIDIA gpu的TensorRT高性能推理库。点击好吧保存并关闭“配置参数”对话框。
您可以使用
set_param
在MATLAB中对模型参数进行编程配置®命令窗口。set_param (“googlenetModel”,“GPUAcceleration”,“上”);
建立GPU加速模型
要构建和模拟GPU加速模型,请选择运行在模拟选项卡或使用MATLAB命令:
= sim卡(“googlenetModel”);
软件首先检查CUDA/ c++代码之前是否为您的模型编译过。如果代码是之前创建的,那么软件将运行模型。如果之前没有构建代码,软件首先生成并编译CUDA/ c++代码,然后运行模型。代码生成工具将生成的代码放在工作文件夹的子文件夹中
slprj / _slprj / googlenetModel
.以直方图的形式显示前五个预测标签及其相关概率。由于网络将图像划分为许多对象类别,而且许多类别是相似的,所以在评估网络时通常会考虑前五名的准确性。该网络以很高的概率将该图像分类为甜椒。
我= imread (“peppers.png”);classNamesTop = classNames(out.yout{2}.Values.Data(:,:,1)) h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁,im);barh (ax2 out.yout {1} .Values.Data(1、5:1:1,1)包含(ax2,“概率”) yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;sgtitle (“使用GoogLeNet的五大预测”)
为代码生成配置模型
模型配置参数为代码生成和构建过程提供了许多选项。
选择代码生成窗格。设置系统目标文件来
grt.tlc
.您也可以使用嵌入式编码器®目标文件
ert.tlc
或者自定义系统目标文件。对于GPU代码生成,自定义目标文件必须基于
grt.tlc
或ert.tlc
.有关开发自定义目标文件的信息,请参见自定义系统目标文件(仿真软件编码器).设置语言来
c++
.选择生成GPU的代码.
选择只生成代码.
选择工具链.Linux®平台,选择
NVIDIA CUDA | gmake(64位Linux)
.对于Windows®系统,选择NVIDIA CUDA (w/Microsoft Visual c++ 20XX) | nmake(64位windows)
.当使用自定义系统目标文件时,您必须为工具链方法设置构建控件。要了解关于自定义目标的工具链方法的更多信息,请参见支持自定义目标工具链方法(仿真软件编码器).
在代码生成>报告窗格中,选择创建代码生成报告而且自动打开报告.
在代码生成>接口窗格中,设置目标库在深度学习集团
cuDNN
.您也可以选择
TensorRT
针对NVIDIA gpu的TensorRT高性能推理库。当生成GPU的代码参数时,特定于GPU Coder的选项将在代码生成> GPU代码窗格。对于本例,您可以使用中特定于gpu的参数的默认值代码生成> GPU代码窗格。
点击好吧保存并关闭“配置参数”对话框。
你也可以用
set_param
函数在MATLAB命令窗口中以编程方式配置模型参数。set_param (“googlenetModel”,“GenerateGPUCode”,CUDA的);
为模型生成CUDA代码
在Simulink编辑器中,打开仿真软件编码器应用程序。
生成的代码。
消息出现在诊断查看器中。代码生成器生成CUDA源文件和头文件,以及HTML代码生成报告。代码生成器将文件放在建立文件夹,子文件夹名为googlenetModel_grt_rtw
在您当前的工作文件夹下。
限制
GPU代码生成MATLAB函数块Stateflow®不支持图表。
当GPU加速启用时,代码生成器不支持导入自定义代码用于导入定制编写的CUDA源文件(*.cu)。相反,使用
coder.ceval
在MATLAB函数块。的MATLAB函数块不支持MATLAB语言中的所有数据类型。关于支持的数据类型,请参阅块文档。
对于GPU代码生成,自定义目标文件必须基于
grt.tlc
或ert.tlc
.对于部署生成的代码,建议使用生成一个示例主程序选项来生成
ert_main.cu
模块。此选项需要嵌入式Coder许可证。你也可以使用
rt_cppclass_main.cpp
MathWorks提供的静态主模块®.但是,必须修改静态主文件,以便模型类构造函数指向深度学习对象。例如,静态googlenetModelModelClass: DeepLearning_googlenetModel_T googlenetModel_DeepLearning;静态googlenetModelModelClass googlenetModel_Obj{&googlenetModel_DeepLearning};
另请参阅
功能
open_system
(模型)|load_system
(模型)|save_system
(模型)|close_system
(模型)|bdclose
(模型)|get_param
(模型)|set_param
(模型)|sim卡
(模型)|slbuild
(模型)