
STM32是在国内非常流行的32位MCU芯片,它价格便宜,功能强大,已经占据国内MCU市场的半壁江山。大家知道,STM32 主打的是 arm-cortex M 芯片,也就我们常说的单片机芯片,它的处理能力不够强大,但它能不能运行对算力要求高的神经网络呢?答案是可以的,因为STM32的M4之上的芯片已经内置了DSP处理器,可以执行高精度浮点运算。正好可以拿来做神经网络计算。但是,神经网络计算除了要求能做浮点运算还要求可以存储大量的参数,这就需要大量的内存和flash空间,这也是单片机类芯片短板的地方。我们这次使用的单片机是M4系列的STM32F407,由于内存有限,我们仅仅实现了一个3层的神经网络,但也可以实现手写数字识别功能。 ![]() 理论基础:5 |; d5 T1 l( }1 p 首先设计一个3层的神经网络: 结构如下:" }/ M7 A0 W% J- D5 { U# B E ![]() 三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点 神经网络计算公式如下:; s4 ^$ p3 r: X inputx 为输入矩阵,w1, b1 为第一层的权重和偏移量 4 k) X Y* t6 ^, [. N; C 第一层计算' M) B+ H6 G; }; [1 ?: Z) H) n1 R$ V z1= inputx *w1+b1 0 o; |. T: f8 ]' U, E/ b+ h y2 =f(z1) f() 为sigmoid激活函数3 F N( R" l6 Q7 Y1 _" h3 E3 M1 q7 x / o7 }" S- G; T# `0 P/ ]0 \9 I 第二层计算7 y6 w8 t! L; d5 X& f z2 = y2*w2+b2 y2 为第一层输出,w2, b2 为第一层的权重和偏移量/ D0 h2 N1 u& D y3 = f(z2) f() 为sigmoid激活函数9 \- H0 M7 c: N1 e, m- r% y& Y4 \+ { y3 为输出结果矩阵0 J9 h. _& w7 P# G 训练模型 神经网络的训练使用TensorFlow keras实现 核心的代码如下3 y0 r3 A0 a- ~- Q& W ![]() 激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。 经过20次训练得到准确率96% ![]() 模型训练好了后把参数导出来。 ![]() 保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt6 y/ J8 J( L4 F7 c5 }2 l STM32实现" T* m6 Q* _* ? W0 X0 B 在STM32上使用的是DSP库函数进行矩阵乘法运算 4 s, f+ E3 y# t 核心函数是arm_mat_mult_f32() arm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1 核心代码" C' C* v) w5 z' G ![]() 液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。 完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git* o; N4 _# L; V. L/ J* F 文章出处:物联网电子世界$ W. z% H) j6 @9 `( {) v - d8 R6 y1 B1 U& B3 Q |