这是一个轻量级的 ANN 库,可以运行在 Flash,RAM 都非常有限的 stm32 上面。隐藏层节点数目可以选择,但是每个隐藏层节点大小默认一样。
以经典的 Iris 数据集为例,使用一层隐藏层、隐藏层节点为4,激活函数为 sigmoid,训练 150 个样本,迭代 500 次,下面是不同 MCU 训练时间。
MCU | 工作主频 | FLASH | RAM | 训练时间 | 预测时间 | 预测精度 |
---|---|---|---|---|---|---|
STM32F429IGT6 | 180MHz | 1024KB | 256KB | 9秒 | 7毫秒 | 96.0% |
STM32F401RET6 | 84MHz | 512KB | 96KB | 18秒 | 15毫秒 | 96.0% |
STM32L475VET6 | 80MHz | 512KB | 128KB | 24秒 | 22毫秒 | 96.0% |
STM32F103RCT6 | 72MHz | 256KB | 20KB | 32秒 | 26毫秒 | 96.0% |
STM32F103C8T6 | 72MHz | 64KB | 20KB | 32秒 | 26毫秒 | 96.0% |
Arduino M0 Pro | 48MHz | 256KB | 32KB | 135秒 | 97毫秒 | 96.0% |
ATmega 2560 | 16MHz | 256KB | 8KB | 182秒 | 138毫秒 | 96.0% |
iris 数据集在 doc/iris.data 里可以找到,也可以去官网下载 https://archive.ics.uci.edu/ml/datasets/Iris/
当然,示例程序只是为了 benchmark 计算力,并没有考虑 train test split,normalization 等等,不过这说明一些比较小的 ANN 模型在 stm32 上还是可以跑跑前向传播的,当然前提是内存足够大能够顺利加载模型。
这是用 asciinema 录制的演示视频,你可以在自己的电脑上回放,视频保存在 doc/rt-thread.cast:
asciinema play rt-thread.cast
说明:目录结构
名称 | 说明 |
---|---|
doc | 文档目录 |
examples | 例子目录 |
src | 源代码目录 |
参见源码内许可证
- 如果从外部加载训练集或者模型,需要打开文件系统支持,并且支持 POSIX 接口
使用 libann 需要在 RT-Thread 的包管理器中选择它,具体路径如下:
RT-Thread online packages
miscellaneous packages --->
[*] libann: a light-weight ANN library, capable of training, saving and loading models.
然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update
命令更新包到 BSP 中。
这个库只是为了测试不同开发板运行 ANN 的计算能力而设置的,实际的机器学习流程需要 train test split, noramalization 等等。
除了测试算力,这个软件包也可以帮助理解 ANN 模型结构,保存的模型使用的是 ASCII 格式,所以可以直接打开看模型各层大小和参数,每个隐藏层节点大小默认是一样的。