|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
人工神经网络的基本概念:
# C: k+ D5 F2 M* q, F* j) c* o人工神经网络是对脑神经元结构的抽象。大脑中的神经元可以自行连接一定距离内的其他相同个体并与之通信,而人工神经元则是层层传递,其中每个人工神经元都设有有激活函数,并由此来决定到底是向下一次层传递兴奋信号还是抑制信号。激活函数中可变的是权值和阈值,在神经网络的训练过程中,就是不断对权值和阈值进行修正,使之更好的拟合训练集的数据。6 Q- n8 T; c1 l* u$ @ y
2 Z* b l$ O. V2 u常见神经网络拓扑:
1 C9 u* c# t: d) g% H% u数层若干神经元层层连接,就形成了神经网络。某种程度上,神经网络就是一个图问题,根据拓扑结构的不同,又有如下区分:
. B* u, [" o2 b% ^( s; [& y1. 单层前向神经网络
8 [: J+ B$ U0 |+ ?1 P* ^这种神经网络的的缺陷是只能对线性问题分类。改进思路就是修改激活函数(把分类线变成曲线,如椭圆线)、增加神经网络层数(让两条直线或多条直线来分类)。
5 A* a+ Y# ?6 Z2 A- q: z
' S& ^$ a6 W& ~$ F- K- M0 I! i
主流做法是增加层数,于是有了多层感知器 。
; H. k" b3 R" t) Y0 Q% o2.多层前向神经网络
: L8 ]% V- _. z
* O9 X) { ^3 ~9 M. H3.反馈神经网络
" s' _; j! C/ c- N
/ I0 C& y' [, e( W! t# v4.随机神经网络6 Z. p% ?( ?" _0 V5 d1 U, v2 {
: y. q9 g- B' M" ~$ J" X0 Z: `; g
5.竞争神经网络(一个神经细胞兴奋后抑制周围的神经细胞)
! u8 u! z7 }2 z: f
9 N$ u) S5 d. |$ K+ D4 V" U9 @7 z& W
随着时间的发展,深度神经网络不断出现,如最后的循环神经网络,卷积神经网络等。但是对于单片机而言,由于算力的限制,简单的浅层神经网络有更大的使用价值。而大部分浅层神经网路输入输出可以表示为下列公式:
' W! I/ u! s' V& r 2 ^3 }) [* P6 z% m3 T! W/ N
其中的u指的是输入神经元的值,w与b分别是需要通过训练确认的权值和阈值,公式的迭代则反映的是神经网络内神经元的层级结构。
6 W' i6 S% O- Q3 t( w7 d
1 E j" e# v/ u8 B单片机中运行神经网络的程序源码:
" P; Y" @& w+ s. H程序代码如下:
, o. k. E+ a6 @+ L8 M#include <reg52.h>
8 g) j) A8 X$ u/ z5 U! u- h#include <absacc.h>
; d2 {, @# \ C+ O#include <stdio.h>8 `( v& m3 Q* Q8 ?7 ]: Q: L3 E' x2 s
#include <math.h>
j' T. O( w- l" X1 \#define uchar unsigned char; w" L& c6 s& a3 O4 i
uchar num;+ |; m' K2 r3 N% y6 `8 `& H; u0 y
flOAT s1_out1,s1_out2,s1_out3,s1_out4,s2_out1,s2_out2,s2_out3,s2_out4;, G0 S6 l9 N9 E
float yout,u1,u2,u3,u4;
( N4 U6 }5 U. {) A- n, { G5 a" p( H, k( i, A% w/ f
void main() U* b, r7 j" W6 d6 Y
{
$ X; ~' v3 e& H0 p4 s+ h$ A, c1 UEA = 1;$ ?9 M5 P1 i* R2 T
ET0 = 1;
' f: W1 C4 D# l$ zTMOD = 0x01;" k* L5 j1 @- S Z' [ b5 g
TL0 = 0x00;
2 L% Y! F! n T7 l* E0 J# YTH0 = 0x00;: |9 p' y# ?( `% A' Y
num = 0;
& Q# M6 b4 U4 T" b* I" V. Ku1 = 0.0107;) I) ^9 I4 q8 U9 s h7 H
u2 = 0.3055;
" w; M* m3 U9 i# P1 ]u3 = 0.3046;" D _' W1 Y6 y5 M- h
u4 = 0.3038;( W% h$ P) `+ u1 H, z
TR0 = 1;8 G3 n. m+ G7 y/ @$ v7 z; b$ x
s1_out1 = (-0.6133*u1+1.1958*u2+0.1451*u3-1.4079*u4+2.0969);
7 n" }! Q- f: E8 ]0 n2 S' Z. as1_out1 = 2/(exp(-2*s1_out1))-1;
* ]) \6 N# }: F% w, l! \5 e: xs1_out2 = (0.7955*u1+0.4564*u2+1.6416*u3-0.6515*u4-0.6728);9 G* t: w( F6 ^* ~8 _
s1_out2 = 2/(exp(-2*s1_out2))-1;
! x, }7 ], j4 A( l9 N2 o2 ]s1_out3 = (0.1069*u1+0.6961*u2+1.3756*u3-1.5583*u4-0.0661);
2 f* C& P; {# z6 C& Js1_out3 = 2/(exp(-2*s1_out3))-1;( Y" Y1 \ I: F+ z. u% C) A
s1_out4 = (0.1996*u1+1.0877*u2+1.09058*u3-0.34468*u4-2.8265);
: B2 ?, o" F0 }7 a- \* {4 ]' ^9 x# I4 is1_out4 = 2/(exp(-2*s1_out4))-1;9 H8 A2 V2 n+ C% w! T. M
* m( u) s$ a! ]' U
s2_out1 = (-1.0413*s1_out1+0.8898*s1_out2-1.3195*s1_out3-0.2691*s1_out4+2.0827);* Q4 H' d2 X- k5 ]1 e; V. \
s2_out1 = 2/(1+exp(-2*s2_out1))-1;) C. Z+ W: h) ?( N: c8 l' |# ]2 C( [
s2_out2 = (-1.3146*s1_out1+0.4266*s1_out2-1.7021*s1_out3-0.0018*s1_out4+0.6756);0 a% [" t- p" d4 |! Y
s2_out2 = 2/(1+exp(-2*s2_out2))-1;9 b* e7 ~6 N' m9 z# R7 j2 _
s2_out3 = (1.6830*s1_out1-0.9289*s1_out2-0.3520*s1_out3-0.2839*s1_out4+0.6526);
* I2 ~1 i% I/ S% I( R1 ds2_out3 = 2/(1+exp(-2*s2_out3))-1;, j1 X" }6 {2 r! s+ |
s2_out4 = (-1.4929*s1_out1-0.1193*s1_out2-0.4037*s1_out3-1.2339*s1_out4+0.20409);
8 k- J K& n9 |0 [8 Ms2_out4 = 2/(1+exp(-2*s2_out4))-1;1 y: p0 `1 N( U: M0 d* a8 x
yout = (-0.1805*s2_out1+0.9100*s2_out2+0.5065*s2_out3-0.2351*s2_out4-0.1674);6 u' m/ C* o3 M5 h
TR0 = 0;
% Y* A4 K; I. K# H, j! PET0 = 0;5 P9 N0 X% s g& f4 z* z/ G
while(1);# Y4 I, U1 j, {1 W* @& }' _) t
/ Q1 p% P# _% b i}
! {, B w0 j, y( n( zvoid intsVR1() interrupt 1 using 12 U) h/ [) F4 A7 Y
{% z& G! Q$ k" A n
num++;; b6 ?# R- n9 g& e8 f) O) W, S
TH0 = 0x00;9 f5 L& u) U; G* y' u# S8 J
TL0 = 0x00;
& l- {5 s5 y! |}
8 _: v# {, y$ [4 ~& b& w# [程序中的神经网络的权值和阈值,已经在先前训练阶段所确定,并且由于单片机对ROM和RAM的资源限制,我们选择将权值和阈值写成了立即数的形式。% Q8 R/ o e1 {& o4 A- U
由于我们这是训练后的神经网络,所以使用分段多项式的方式来拟合激活函数tanh,这也符合单片机计算浮点数较慢的现实。
! c& f% d3 n2 [+ l- q# A在保证一定预测精度的情况下,使用单片机来实现神经网络,应考虑现实条件的制约,将神经网络模型尽可能的简化。
; U. b$ ~9 g* P6 Y" T/ K; m5 _6 |& K) Z |
|