
0 X, P# H: Y% K& U' Q! _2 s: D STM32是在国内非常流行的32位MCU芯片,它价格便宜,功能强大,已经占据国内MCU市场的半壁江山。大家知道,STM32 主打的是 arm-cortex M 芯片,也就我们常说的单片机芯片,它的处理能力不够强大,但它能不能运行对算力要求高的神经网络呢?答案是可以的,因为STM32的M4之上的芯片已经内置了DSP处理器,可以执行高精度浮点运算。正好可以拿来做神经网络计算。但是,神经网络计算除了要求能做浮点运算还要求可以存储大量的参数,这就需要大量的内存和flash空间,这也是单片机类芯片短板的地方。我们这次使用的单片机是M4系列的STM32F407,由于内存有限,我们仅仅实现了一个3层的神经网络,但也可以实现手写数字识别功能。1 A1 m$ q! ^3 P% g ![]() 理论基础: 首先设计一个3层的神经网络:2 Z# v* n5 m z% g- M3 M 结构如下:; L" ?2 J+ ~+ E( [ ![]() 三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点 神经网络计算公式如下:; r( A0 F" p! X9 K inputx 为输入矩阵,w1, b1 为第一层的权重和偏移量 9 N9 `- j! E' f& ]6 h& m1 a, a 第一层计算3 [8 ~2 }9 {% @5 W5 w1 c% j z1= inputx *w1+b1 y2 =f(z1) f() 为sigmoid激活函数 7 w: t8 a C; B$ }, q9 U. M 第二层计算 z2 = y2*w2+b2 y2 为第一层输出,w2, b2 为第一层的权重和偏移量 y3 = f(z2) f() 为sigmoid激活函数8 b$ K# f9 P8 U/ o+ _ y3 为输出结果矩阵! y' O- b8 x& c7 H) Y" ]; g, X9 O 训练模型0 _/ v3 G+ j& U+ C$ L8 B+ e 神经网络的训练使用TensorFlow keras实现1 t; U1 `; q& E( z 核心的代码如下+ q7 T* V i" U+ p/ J' ?' D, X ![]() 激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。 1 e9 t) B8 A' `; Q: O$ Y# \( ~* C% i+ h 经过20次训练得到准确率96% ![]() 模型训练好了后把参数导出来。 ![]() 保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt2 U! A$ o* J0 x( b ; z0 Z; S6 r" S# ^& r, u STM32实现 在STM32上使用的是DSP库函数进行矩阵乘法运算 Q8 R7 B2 o' f& I: t4 M) Q) @ 6 h) R# z8 L N% _& C% o+ Z& g 核心函数是arm_mat_mult_f32() arm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1 & y% B" \( T V* z4 Q0 D 核心代码7 R0 ?! V1 F( | }# S/ w1 @ ![]() 液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。* R+ F. s9 {; w" ~* y; {& K 完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git( Z0 p: O8 u9 | 6 E5 Q6 _$ I7 M: j7 P 文章出处:物联网电子世界 |