在Simulink中为深度学习网络生成通用的C/C++代码
Table of Contents
引言
在R2021a版本之后,Simulink Coder和Embedded Coder可以从包含深度神经网络的Simulink模型生成通用的C和C++代码。这些通用的C和C++代码不依赖于第三方库,因此可以部署到任何编译C和C++代码的嵌入式处理器中,包括ARM Cortex-M系列处理器、DSP以及来自各种设备供应商的微控制器。
生成通用的C和C++代码
在Simulink中,可以使用Simulink Coder和Embedded Coder生成通用的C和C++代码。这些代码可以从Simulink模型中的深度学习神经网络生成,而且不依赖于任何第三方库。生成的代码可以用于各种类型的卷积神经网络和递归深度学习神经网络。具体支持的网络和层次可以在官方文档中找到。
支持的深度学习神经网络
Simulink Coder和Embedded Coder支持多种深度学习网络和层次的通用C和C++代码生成,包括卷积神经网络和递归深度学习神经网络。通过使用来自深度学习工具箱的模块,如Stateful Classify和Stateful Predict,或者使用MATLAB函数块,可以将这些网络对象与Simulink模型中的其他模块结合使用。
在Simulink中部署深度学习网络
借助Simulink,我们可以将深度学习网络部署到各种嵌入式处理器上。以ARM Cortex-M处理器为例,在Simulink中可以轻松地将LSTM网络部署到该处理器上。在一个示例中,我们使用了一个已经训练好的LSTM网络来预测涡轮发动机的剩余寿命。该网络接收来自17个发动机传感器的序列数据,并输出以循环为单位的剩余寿命预测结果。通过使用Deep Network Designer应用程序,我们可以深入了解网络的结构,并查看其包括6个层次,其中包括一个LSTM层。
使用ARM Cortex-M处理器运行模型
为了在ARM Cortex-M处理器上运行模型,我们需要将生成的通用C代码部署到目标处理器上。在配置参数中,我们选择了STM32F746G-Discovery开发板作为硬件板。在代码生成设置中,我们选择了Embedded Coder作为系统目标文件,并将目标语言设置为C。我们还使用了针对ARM嵌入式处理器的新工具链。为了消除对第三方库的依赖,我们将深度学习目标库设置为none。
评估模型准确性
在Simulink中进行模型仿真可以帮助我们评估深度学习网络的准确性。在仿真过程中,我们可以观察到预训练的神经网络相对准确地预测了每个观测值中涡轮发动机的剩余寿命。预测值与实际值非常接近,均方根误差为20.37。
代码生成和部署
使用Simulink Coder和Embedded Coder,我们可以生成通用的C和C++代码,并将其部署到嵌入式处理器上。通过设置正确的配置参数,我们可以确保生成的代码不依赖于第三方库,并可以在各种嵌入式处理器上运行。生成的代码包含用于计算神经网络输出的权重和偏差。
使用处理器进行验证
为了验证生成的代码的输出与Simulink模型的仿真结果是否一致,我们可以使用处理器来执行代码,并与Simulink仿真结果进行比较。在第二个模型中,我们将之前观察到的预测块置于模型引用中,并将其仿真模式设置为PIL。通过在PIL模式下运行生成的代码,并选择以SIL/PIL模式运行的模型块作为测试系统,我们可以比较生成的代码在硬件上的预测输出与Simulink仿真结果。
总结
本文介绍了如何使用Simulink Coder和Embedded Coder生成通用的C和C++代码,以部署深度学习网络到嵌入式处理器上。我们还讨论了支持的深度学习网络类型,并展示了如何在Simulink中仿真和部署这些网络。通过使用ARM Cortex-M处理器运行模型并验证输出结果,我们可以验证生成的代码与Simulink仿真结果的一致性。
常见问题解答
Q: Simulink Coder和Embedded Coder支持哪些嵌入式处理器?
A: Simulink Coder和Embedded Coder支持任何能够编译C和C++代码的嵌入式处理器,包括ARM Cortex-M系列处理器、DSP等。
Q: 如何在Simulink中部署深度学习网络?
A: 使用Simulink Coder和Embedded Coder可以从深度学习模型生成通用的C和C++代码,然后将代码部署到目标嵌入式处理器上。
Q: 如何验证生成的代码的准确性?
A: 可以在Simulink中运行仿真来验证生成的代码的输出与模型的预期结果是否一致。同时,还可以使用处理器来执行生成的代码,并与Simulink仿真结果进行比较。
Q: 生成的C代码是否依赖于第三方库?
A: 通过正确的配置参数,可以生成不依赖于第三方库的通用C和C++代码。
Q: 如何评估深度学习网络的准确性?
A: 可以使用模型仿真来评估深度学习网络的准确性。比较预测值与实际值之间的误差可以帮助我们了解模型的性能。
Q: 如何将模型部署到ARM Cortex-M处理器上?
A: 首先,需要生成通用的C代码。然后,将生成的代码部署到ARM Cortex-M处理器上,并使用适当的工具链进行编译和下载。
Q: Simulink Coder和Embedded Coder支持哪些网络和层次?
A: Simulink Coder和Embedded Coder支持多种深度学习网络和层次的通用C和C++代码生成。具体支持的网络和层次可以在官方文档中找到。
Q: 如何确保生成的C代码在硬件上的准确性?
A: 可以使用处理器来执行生成的代码,并与Simulink仿真结果进行比较,以验证生成的代码在硬件上的准确性。
Q: 如何选择适合的硬件板进行代码生成和部署?
A: 可以根据项目需求选择适合的硬件板。在配置参数中,选择与目标硬件板相匹配的系统目标文件和目标语言。
Q: 如何了解更多关于深度学习代码生成和Simulink的信息?
A: 可以点击下面的链接或参考官方文档,以获取有关深度学习代码生成和Simulink的更多信息。