×

如何在微控制器中构建神经网络

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-07-07

李涛

分享资料个

描述

我们将使用 TensorFflow 训练神经网络并在微控制器中实现它。我们的神经网络将预测 sin(x)。使用相同的过程,我们可以用正确的数据预测不同的输出。

人工神经网络在维基百科中被定义为“受构成动物大脑的生物神经网络模糊启发的计算系统。此类系统通过考虑示例来“学习”执行任务,通常无需使用特定于任务的规则进行编程。

所以第一部分是我们必须教神经网络 sin(x) 函数是怎样的。

poYBAGORjeSAHrSZAAAM449YhFQ276.png
 

我们在 colab 中使用 TensorFlow,这里是链接https://colab.research.google.com/drive/1ABDULCjzvNZJ6TwHpTvAJnKeyM-_kfPR

我们需要训练数据,所以我们得到 x, y 对训练:

pYYBAGOSw2-ATlyNAAANPdlck58562.png
 

x, y 对用于测试我们的神经网络:

poYBAGOSw3OANuYeAAARIKLDNUo259.png
 

神经网络中的基本计算单位是神经或节点,它从其他一些节点或外部源接收输入并计算输出。每个输入都有一个关联的权重 (a),这是根据其对其他输入的相对重要性加上常量分配的,称为偏差 (b)。该节点将非线性函数应用于其输入的加权和,称为激活函数。在我们的例子中,我们使用 softsign 函数作为激活函数。

pYYBAGOSw3WAWYtaAAAKmrrjo4Y761.png
 

我们现在定义一个简单的神经网络,节点按层排列。相邻层的节点之间有连接边缘所有这些连接都有与之关联的权重。我们使用四层,一个输入层,两个隐藏层和一个输出层。

  • 输入节点——输入节点将外部世界的信息提供给网络,统称为“输入层”。在任何输入节点中都不会执行任何计算。
  • 隐藏节点——隐藏节点与外界没有直接联系(因此得名“隐藏”)。它们执行计算并将信息从输入节点传输到输出节点。隐藏节点的集合形成一个“隐藏层”。它可以有零个或多个隐藏层。
  • 输出节点——输出节点统称为“输出层”,负责计算和将信息从网络传输到外界。

我们在输入层有一个节点,在第一个隐藏层有 10 个节点,在第二个隐藏层有 3 个节点,在输出层有一个节点。这是图表:

poYBAGOhWuaAHzsFAACQ7pP5Ym8715.png
 

在 TensorFlow 中定义为:

pYYBAGOhWumAe1cLAAArLLP5Nek269.png
 

 

我们评估模型,误差非常低。

pYYBAGOhWu6AJyz2AAAmqQg5xIo866.png
 

为了在微控制器中实现模型,我们需要架构,我们之前定义了三层和每个节点的权重。

poYBAGOhWvGANkF4AABBjW59zjM428.png
 

正如我们所料,我们有三层,这些是权重:

pYYBAGOhWvSAR7rUAACxU41HtbE300.png
 

输入层只有一个输入 x 我们要计算 y = sin(x)。

第一隐藏层有10个节点,每个节点执行操作:

poYBAGOhWveAV5QxAAAGhlUgtQ8144.png
 

所以第一个数组有 10 个元素,每个节点一个“a”,第二个 10 个元素的数组是“b”。

poYBAGOhWv6AMKyNAAA3zsUpoI4065.png
 

第二个隐藏层有 3 个节点和 10 个输入,所以我们有一个 3x10 数组用于每个节点的“a”,以及 3 个数组用于“b”。

poYBAGOj9_yAa4kmAAAJl8nBDYg027.png
 
pYYBAGOj-ACAKqoNAABVKvyFGSw811.png
 

输出层是一个有 3 个输入的节点,所以我们有 3 个“a”和一个“b”。

poYBAGOj-AOARa1BAAAIl-89suw293.png
 
pYYBAGOj-AaAcdO2AAAPtMLMwFg055.png
 

我使用 platformio + vs 代码。对于 MT3620,您需要从此处安装平台支持https://github.com/Wiz-IO/platform-azure

现在我们可以在微控制器中实现它。我已经在 MT3620 板的 M7 内核和 ESP32 中实现了它。

我们只需要两个函数,一个用于层,我们传递每个节点的输入数、层中的节点数、权重、偏差和输入:

poYBAGOj-AqARZ8_AABHVTltNAM340.png
 

一个用于激活函数,softsign 函数:

poYBAGOj-AyAcJZVAAAQs6A73V4518.png
 

我们使用串行端口请求输入,然后将其传递给第一个隐藏层,结果传递给第二个隐藏层,输出传递给输出层:

poYBAGOj-BCAe_nLAAAtkP6Wrqs474.png
 

最后,我们将预测与 sin 函数的输出进行比较。

pYYBAGOj-BOABR9fAAAmw1fdOX8950.png
 

可以在 ESP32 中使用相同的代码并获得相同的结果。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !