|
% {7 {$ A- C) u z# h/ z5 m - Y8 v2 u! |; T [1 j STM32是在国内非常流行的32位MCU芯片,它价格便宜,功能强大,已经占据国内MCU市场的半壁江山。大家知道,STM32 主打的是 arm-cortex M 芯片,也就我们常说的单片机芯片,它的处理能力不够强大,但它能不能运行对算力要求高的神经网络呢?答案是可以的,因为STM32的M4之上的芯片已经内置了DSP处理器,可以执行高精度浮点运算。正好可以拿来做神经网络计算。但是,神经网络计算除了要求能做浮点运算还要求可以存储大量的参数,这就需要大量的内存和flash空间,这也是单片机类芯片短板的地方。我们这次使用的单片机是M4系列的STM32F407,由于内存有限,我们仅仅实现了一个3层的神经网络,但也可以实现手写数字识别功能。( [% ?! i) u; j1 Z$ g8 `
理论基础:# w5 U( _5 ?8 A8 I 首先设计一个3层的神经网络:4 L; O) `! P& W3 m+ N, d0 H5 H6 M 结构如下:
三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点# e+ F; o9 C9 m5 ~( H 神经网络计算公式如下: inputx 为输入矩阵,w1, b1 为第一层的权重和偏移量 ( ^. h+ Z9 L2 o; T; n 第一层计算 z1= inputx *w1+b1 , w4 l$ ^' J6 K; g1 {( W% K9 L6 @ y2 =f(z1) f() 为sigmoid激活函数. h+ [& p1 T0 ?0 J* B- n2 K) f u 第二层计算* P2 T! M7 D# N9 w2 F z2 = y2*w2+b2 y2 为第一层输出,w2, b2 为第一层的权重和偏移量 y3 = f(z2) f() 为sigmoid激活函数 y3 为输出结果矩阵 训练模型* n1 A0 N! L2 Z3 j 神经网络的训练使用TensorFlow keras实现- \! h" m4 _9 I' u1 b. n- n3 v 核心的代码如下; T1 _/ V* u$ J3 l0 s
激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。( _- T8 Z1 J5 Z5 x( L+ _ 1 ^) y' G6 B) ^6 [0 |: v- ? 经过20次训练得到准确率96%
模型训练好了后把参数导出来。+ U. ^2 u' ~1 Z! Z
保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt STM32实现 在STM32上使用的是DSP库函数进行矩阵乘法运算 核心函数是arm_mat_mult_f32() arm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1 0 K/ ?2 p+ @% ?% }2 d# i2 Z2 f 核心代码
液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。 " ]( i# E8 V v7 L- J( r 完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git + F" d2 W5 }% I8 ]+ g 文章出处:物联网电子世界 |
微信公众号
手机版