NNoM 系列 - 在单片机和RT-Thread上撸个简单的 MNIST 数据集吧

MNIST-SIMPLE

MNIST 是一个手写数字库,由250个人的手写数字组成。每个数字被裁剪成 28 * 28 的灰度图片。

image

MNIST 经常被用来做为分类任务的入门数据库使用。在这个简单的例子里面,我们也用它来试试数据归类。

1. 下载并启用NNoM

在 RT-Thread 的包管理中

RT-Thread online packages  --->
    miscellaneous packages  --->
        [*] NNoM: A Higher-level Nerual Network ... --->

*选择 latest 版本
*需要打开 msh 支持        

源码请到GitHub

2. 复制例子文件

packages/nnom-latest/examples/mnist-simple/mcu 目录下的三个文件 image.h, weights.hmain.c 复制到工程目录的 application/。替换掉默认的 main.c。先不用管这三个文件的内容。

(如果你是好奇宝宝:)

  • image.h 里面放置了 10 张从 MNIST 数据集里面随机挑选的图片。
  • weights.h 是 NNoM 的工具脚本自动生成的模型参数。
  • main.c 包含了最简单的模型初始化和 msh 交互命令。

3. 跑起来

用你喜欢的方式,编译,下载,运行

3.1 模型编译

RT-Thread 启动后,接着会在 main()函数里面调用 model = nnom_model_create();
这条语句将会载入我们藏在 weights.h 里面的模型,将它编译并把信息打印出来。

 \ | /
- RT -     Thread Operating System
 / | \     4.0.0 build Mar 29 2019
 2006 - 2018 Copyright by rt-thread team
RTT Control Block Detection Address is 0x20000a8c
msh >
INFO: Start compile...
Layer        Activation    output shape      ops          memory            mem life-time
----------------------------------------------------------------------------------------------
 Input      -          - (  28,  28,   1)        0   (  784,  784,    0)    1 - - -  - - - - 
 Conv2D     - ReLU     - (  28,  28,  12)    84672   (  784, 9408,  432)    1 1 - -  - - - - 
 MaxPool    -          - (  14,  14,  12)        0   ( 9408, 2352,    0)    1 - 1 -  - - - - 
 Conv2D     - ReLU     - (  14,  14,  24)   508032   ( 2352, 4704,  864)    1 1 - -  - - - - 
 MaxPool    -          - (   7,   7,  24)        0   ( 4704, 1176,    0)    1 - 1 -  - - - - 
 Conv2D     - ReLU     - (   7,   7,  48)   508032   ( 1176, 2352, 1728)    1 1 - -  - - - - 
 MaxPool    -          - (   4,   4,  48)        0   ( 2352,  768,    0)    1 - 1 -  - - - - 
 Dense      - ReLU     - (  96,   1,   1)    73728   (  768,   96,  768)    1 1 - -  - - - - 
 Dense      -          - (  10,   1,   1)      960   (   96,   10,   96)    1 - 1 -  - - - - 
 Softmax    -          - (  10,   1,   1)        0   (   10,   10,    0)    - 1 - -  - - - - 
 Output     -          - (  10,   1,   1)        0   (   10,   10,    0)    1 - - -  - - - - 
----------------------------------------------------------------------------------------------
INFO: memory analysis result
 Block0: 1728  Block1: 2352  Block2: 9408  Block3: 0  Block4: 0  Block5: 0  Block6: 0  Block7: 0  
 Total memory cost by network buffers: 13488 bytes

这里面的信息有:

  • 模型有三个卷积层组成,每个卷积层都使用 ReLU 进行激活 (ReLU: 大于0的数值不变,小于0的数值重新赋值为0)。
  • 三个卷积后面跟着两个 Dense 层 (Densely-connected,或者也叫 fully-connected 全连接层)。
  • 最后模型通过 Softmax 层来输出 (将数值转换成概率值)
  • 各层的内存信息,输出的数据,计算量 (定点乘加操作:MAC-OPS)
  • 总网络内存占用 13488 bytes

3.2 跑个模型

之前我们介绍过 image.h 里面藏有十张图片。我们现在可以通过 mnist 这个自定义的 MSH 命令来预测一下这十张图。

命令使用方法如下, num 是 0~9 里面的任意数字。代表十张图片里面的第几个图片(注意:输入的数字并非指图片的数字,图片是随机拉取的)。

mnist num

我输入了 msh >mnist 6,我要测试第六张图片。

msh >mnist 6

prediction start.. 
                                                        
                                                        
                                                        
                                                        
                                                        
                                ..]]  ((ZZOO))^^        
                          ``//qq&&))  kkBB@@@@ff        
                    "">>\\pp%%ZZ,,    [[%%@@BB11        
                ^^}}MM@@@@oo{{      rr@@@@OO<<          
                nn@@@@aajj..    ++dd@@88nn''            
              \\%%@@hh!!      ++88@@oo::                
            !!%%@@kk>>      ;;88@@oo::                  
            ))@@@@<<      ^^pp@@oo::                    
            ::oo@@WWzzll!!bb@@bb''                      
              ttBB@@@@%%WW@@**,,                        
                ll}}LL%%@@@@@@bbtt''                    
                    ``&&@@MMCC&&%%hh[[                  
                    ((@@@@((    II**@@nn''              
                    ??@@##``        QQ@@>>              
                    ((@@@@^^        [[@@pp              
                    [[@@@@^^        nn@@jj              
                    ..aa@@[[        ZZ%%++              
                      __@@**,,    xx@@OO                
                        {{&&**jj00@@aa::                
                          ^^YYpppp||,,                  
                                                        
                                                        
                                                        
Time: 62 tick
Truth label: 8
Predicted label: 8

额,如果恶心到你了,那我道歉...

不要怀疑,上面那一坨是 ASCII 码表示的 28 * 28 的手写图片...

输出的信息里面记录了

  • 此次预测的时间,这里用了 62 tick,我这是相当于 62ms
  • 这张图片的真实数字是 8
  • 网络计算的这张照片的数字 8

赶快去试试,其他的 9 张图片吧。

简单的体验就到这。

4 建立自己的模型

对于没有机器学习基础的同学,想要在 MCU 上跑自己的模型,需要先学会在 Keras 里面建立一个模型。

在这里可以参照网络上 Keras 的教程来修改这个例子里面的模型。

这个例子的模型在 nnom/example/mnist-simple/model 里面的 mnist_simple.py,请自行实践。

*需要把 nnom/scripts 下的几个 python 脚本文件复制到以上目录。

环境是 Python3 + Keras + Tensorflow。推荐使用 Anaconda 来安装 python 环境而不是 pip。

模型训练完成后,会生成 weights.h 还会生成随机图片文件 image.h。 接下来按照上面的操作从头来一遍就好。

5 结语

使用 NNoM 来部署神经网络真的很简单。基础的代码不过两三行,NNoM 能轻松让你的 MCU 也神经一把~ 变成真正的 Edge AI 设备。

这个例子仅使用了最简单的 API 搭建了最基础的卷积模型。

高级用法和更多例子请查看API 文档其他例子

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容