在本文中,我们将学习如何将神经网络集成到 SBC. 我们将创建一个 3 层神经网络来逼近函数 sin(x)。
该过程分为两部分: 1. 训练网络,这将在 PC 上完成; 2. 运行网络,这将在 SBC 中完成。
第 1 部分。神经网络训练
对于这一部分,我们将使用 Jupyter 笔记本,以及 Keras、Numpy 和 Pylab 库。
Step 1. 导入必要的库
步骤 2. 创建训练数据集
我们的数据集包含 10000-0*pi 范围内的 2 个随机数作为输入 X,它们对应的 sin 函数作为输入 Y。请注意,我们已将 Y 的范围调整为从 0 到 1。
步骤 3. 创建神经网络
为了创建神经网络,我们创建了一个模型对象并向其添加 3 层。 这是通过 Keras 库提供的 API 完成的。
第一层的神经元数量为 32,中间层为 32,输出为 1。
我们将使用 relu 和 sigmoid 激活。
使用的优化器是 Adam 和误差函数 MSE。
网络参数个数为 1153。
步骤 4. 培训
训练时,神经网络使用数据集来调整其参数,以使误差最小化。
在这种情况下,我们将整个数据集通过网络 10 次,分 32 个样本批次。
我们可以看到,在训练结束时,误差非常小,为 2.5e-5。
步骤 5. 验证
现在我们将最后一次测试神经网络并将其与预期值进行比较。 如图所示,网络非常接近正弦函数。
步骤 6. 导出数据
此功能允许您将神经网络的权重导出到文本文件,然后从 SBC 加载它。
第 2 部分。在 SBC 上执行
首先,我们将回顾神经网络的实现。
神经网络分为 4 类:Neural_Network、Layer、Perceptron 和 Activation。
每个类基本上都有一个称为 process 的方法,负责完成所有工作,以及加载和保存方法。
特 活化 类,实现线性、relu、sigmoid 和 tanh 激活函数。
特 感知器 类负责执行所有的乘法。 请注意,向量乘法功能是在 ASM 中实现的,以免牺牲性能。
ASM 与 Python 实现
向量乘法负责大部分 CPU 使用,因此在 ASM 上实现它可以大大提高库的性能。 在这个例子中,执行了一个简单的 100×100 向量乘法。 一个python实现需要1339us,而ASM实现只需要28us。 在保留相同输出值的同时,这大约快 50 倍。
特 层 类将几个感知器并行分组。
班级 神经网络 堆叠所有网络层。
最后,我们可以查看/检查网络的使用情况。
我们将带有权重的文件复制到 SBC 并执行以下 main.py。
此代码从 sine.unn 文件加载网络并计算 0.123 的正弦,然后显示网络获得的值和真实正弦,以及计算时间(以微秒为单位)。
输出:
如我们所见,输出近似于预期值,小数点后 4 位。
这个网络有 1153 个权重,需要 4612(1153*4) 字节的 RAM 来存储浮点值的权重,处理时间为 5.8ms。