标题: c语言实现BP神经网络算法 [打印本页] 作者: syj52417 时间: 2015-4-24 18:21 标题: c语言实现BP神经网络算法 利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!0 S$ W# Q$ U/ s! R# p
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>, w5 T+ {- c) F. \; k/ H [
#include <time.h>. T2 g" Y& D, Z. d7 I( ^
#include <math.h> # C$ m( E: s9 D7 V; ]#include <stdlib.h>) L! ]. N4 i: W
#include <iostream>9 P/ U- N# }6 @8 J- J1 S
using namespace std; ) b) c! ]9 S* k7 q7 ]$ T/ y9 P$ P#define DATA 800, w) |3 i# `& k0 p* O/ ]6 m
#define IN 2) F+ U% S, N# e9 v: T2 n4 ^! I4 B
#define OUT 1 & t9 I5 b5 A8 H#define NEURON 45 . `( D( m9 t4 E6 ~2 F#define TRAINC 20000 ; Y$ J8 W* }& Z* t3 i " V; k/ S% Y& d. z6 ^! u# ~
double Fx(double x) $ B3 E8 H9 {; a1 }' b{) U" T2 l. |6 j- ]6 j2 Z! H
return 1 / (1 + exp(-1 * x));. }# A) G$ o& X8 t8 y+ E& _
} * n- X u) a5 A) T: L0 _//La输入层 Lb隐藏层 Lc输出层 . R# `( N$ q& D) t//样本输入 % V" B( A2 h3 \7 y" Adouble La[DATA][IN];* i" v# K& D. U. F/ y* ~% o0 C
//样本输出+ v5 x- K3 g2 v
double Lc[DATA][OUT]; / t- S4 c& s2 S: B//La->Lb权重 + i, J( C$ _5 |4 p1 cdouble Wab[NEURON][IN]; + h; C( J: B% v//Lb->Lc权重' u% q1 V( Q5 ]! o7 s
double Wbc[OUT][NEURON]; ( I: h3 \: d: Y' y* t, k' Y: Q//样本输入每个向量的最小值,最大值;输出...3 ^7 e$ {9 [: ?
double MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT]; + \/ o& w- ?4 Y* x; i$ l , f3 o/ |! D* q9 ~* r4 }# S
//Lb层输出+ x+ U0 W; ^8 f" S; ^" N; i
double LbOut[NEURON]; 3 P. D% X4 |, m//Lc层输出 ' [# N* O- c6 i0 W6 z2 L4 y4 M2 \double LcOut[OUT];4 Q f& k! u3 a
- m _; U: ~- s# h% G4 @' X1 V//Lc层单元的一般化误差 8 ^# q3 Z+ _' o6 pdouble Dc[OUT];! d4 u# }4 B: ^, k; B- h$ F
//Lb层单元的一般化误差# C/ X; `* F {/ C1 p, k
double Db[NEURON];" h" C4 f& {1 A7 C
3 s0 }7 R/ n. _$ Q2 Y//设置样本数据8 h Z, p& p9 v3 o+ \! z
void setSample()" r) m3 n! u$ n, `' q$ T# p& O
{ / ?+ w( W+ U! z6 @9 w srand((unsigned)time(NULL));: k9 _* q/ X( \2 x" [
int i, j;& r% L% |& Y; M9 B& ^; A* M
for (i = 0; i < DATA; i++); E% i" O1 I- a" K
{ 3 o# ^6 Z* k! F/ Z6 g7 E for (j = 0; j < IN; j++) H' h* ?1 n. m6 x% y! l
{/ D6 V+ B/ s" n( L7 @/ o( I0 x
La[j] = rand() % 1000 / 10.0; 2 R; y8 K* X1 \9 O7 q h } & [! ~9 Y! d/ Z2 Q u4 o* n! X% C9 |& ^- b, @. y
for (j = 0; j < OUT; j++) . r/ o! R) Q. R* y- H' N5 | Lc[j] = La[0] + La[1]; # l$ }1 I) r5 A# B }0 ^( m, Q4 q! D/ L) R% W8 E4 b7 b) c
} 2 S' T5 A$ i; h( `6 e( P2 k, A, `//初始化BP网络:权重,阈值(隐含节点+输出节点) : g2 j2 t5 T) c* ^7 z o) ]void initNet() + ?& c& X- f1 L* m{4 Z: P, p( \: {
srand((unsigned)time(NULL)); ; |% H5 q N5 i [; u# S //两部分的权值设置随机值【-1,1】 4 N- g, j, k2 N int i, j;: K$ i4 y$ [. ]* ]( T. [- W$ u
for (i = 0; i < NEURON; i++)1 ~4 f2 O8 _$ u" {1 ?
for (j = 0; j < IN; j++)% D; L6 s) Z# _) r8 ?- e
{ & F# Q# A8 r( C" r2 q& O+ z Wab[j] = rand()*2.0 / RAND_MAX - 1 ;5 n9 i4 v$ L+ X% r# i3 k. K
Wab[j] /= 20;! f- R4 N# j; g8 ` T: R$ Y
} ; l! i- l5 o* q2 s7 l 6 k" W1 `3 E R& V+ f0 D for (i = 0; i < OUT; i++)3 v& e4 g7 Q; p! {0 [ s
for (j = 0; j < NEURON; j++)- ^. g* {$ `8 d2 X- u9 M1 r2 k
{8 b+ i: r, u9 y- Q8 N2 Z
Wbc[j] = rand()*2.0 / RAND_MAX - 1; 5 f; G, w$ z. @ Wbc[j] /= 20;1 H9 u% M$ c9 v: z, S
} / l- K6 }& n6 F- @ " v% v# ^4 {0 `: K; ~5 M //找出每个向量最小最大值,并进行归一化 7 {" J6 K# P b' I for (i = 0; i < IN; i++); d) |$ b7 H% Z- _
{ ' C: r- K0 S5 H& _0 h2 w ( s* D9 i+ n3 w; v! r
MinIn = MaxIn = La[0];. O; _/ m2 O* D9 h/ s
for (j = 0; j < DATA; j++)4 i/ ~+ n# K+ y0 \# e& Q& _. ^
{% e+ j" z, D/ B8 e7 i# Y5 [, W. M1 z
if (MinIn > La[j]) 6 v# U( ^0 d# Q2 h/ o4 T MinIn = La[j]; 3 Y) Q- i# J. E if (MaxIn < La[j]) ; F1 |% L5 @" K; t9 z MaxIn = La[j];: K/ b) @0 d) B3 L7 H! i" {2 R' N
}" p# {- t9 W! ^! t- {8 k
0 z( m' O. [/ F2 j" | ( l5 @2 M# c! I' R6 ^ }! } M3 v, z/ {" R! Z* H y8 R
. U7 I4 A- A1 G& v
for (i = 0; i < OUT; i++)9 j( q' u4 f( `3 P z
{ , k! m ?6 k3 O0 Q0 M9 x! Z ! e* M) B( ~3 \9 H! r$ E; T% b MinOut = MaxOut = Lc[0];& v& C% q1 @+ S8 k$ E/ ~9 i
for (j = 0; j < DATA; j++) 1 k+ ~! _" s+ w1 ? {8 W0 k6 G7 u$ B9 e' O5 T
if (MinOut > Lc[j]) 7 e( k# J; J7 [; S3 M% L- A, Y( T8 t/ d MinOut = Lc[j];: X0 ]( u5 b' r7 I
if (MaxOut < Lc[j])' |2 ]& t7 y; U! _% `
MaxOut = Lc[j];8 q$ \- \, N, f8 H, k- E* W
}) o. O/ }! Y: d# o
2 Y D! w4 ?$ |9 B9 q
}8 v4 P; d# k0 R0 Y
) z, X: B6 D1 ` L4 y. o
//归一化 3 H! W" J }: A4 U for (i = 0; i < IN; i++) 5 G6 i) l7 f8 [3 e q4 y for (j = 0; j < DATA; j++) 3 y$ G ^2 T' R: |- t La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);& j+ M& C; N) A$ c
; Q1 W( h. y- f6 L( R' @6 O( p * f' Y" ^( U5 x' t. i) Y& h0 |; X for (i = 0; i < OUT; i++)) `% e, F" Z$ ^! J/ j* ?6 _& ~3 [
for (j = 0; j < DATA; j++)/ I h N5 y4 W' g& {
Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);9 }9 f! R0 B( t0 i5 ]% m' `
% n! y0 m: S+ A
% B6 E7 B' p" i/ O# J) ^5 L
& q$ K" \7 Q2 R; @0 j, u4 A
} 6 ]) p. t5 q, a" u: w4 r* h, pvoid getActiveVal(int dataIndex) : _# u C6 b9 ^# N' H3 B' h1 Q{ ) U( P* o `- t' R int i, j; - Z% {) y' `* g+ } m6 b double sum;% E6 l \% C. d1 V7 I
for (i = 0; i < NEURON; i++) 0 W$ m3 X' b$ {3 S( _7 f* K { % x/ C: N9 u$ |! ]) @& x6 I( v, t; V sum = 0;8 u4 P9 Z3 N* O" [' l
for (j = 0; j < IN; j++)- p( K- ?8 i4 A
sum += Wab[j] * La[dataIndex][j]; * V( z+ w& W( E2 _ ' _& V# h. T! d0 n1 o LbOut = Fx(sum); L1 M D- A" F 7 Q; K$ }7 F6 M/ _2 {( ] } 2 C4 B- S7 g& I- K+ E* T2 F2 e 8 @4 l8 g* n6 [
for (i = 0; i < OUT; i++)# m; J4 L; S; ?
{ 6 b8 n3 X) e; i4 q3 `1 D/ ]& R sum = 0; 1 | N5 \, ]6 W# V) [# u: m' N for (j = 0; j < NEURON; j++) 6 }! w+ `6 F0 R6 R2 ~# i sum += Wbc[j] * LbOut[j]; - v7 J2 l; J8 t6 W7 A0 V & z# h @$ j9 ^1 q, y! d1 d% f7 v5 z
LcOut = Fx(sum); : i) `- s& P r \ g } 4 u) ]9 J `& o5 y} + V3 H( ?" M6 S0 L/ `void backUp(int dataIndex) : D- H, ]0 `+ }1 y' W/ I{ # I* W: s' }4 B9 L- D8 f int i, j; ' }% u, ?! b8 @" n X double sum = 0; ; t; M" w2 P8 ]. k; r //Lc层单元的一般化误差6 A% T) p. Z6 w8 ]2 c o
for (i = 0; i < OUT; i++), f# @+ `5 }* L3 P! ^* o4 n6 _6 d# _
Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);+ t+ j4 z3 X/ U( l! m L; i9 e6 C
; j2 O3 a. K q' C% q
//Lb层单元的一般化误差( f* u0 o# [! L
for (i = 0; i < NEURON; i++) 7 j0 n" \3 A) f0 m1 v: P; Q { ) g8 [) H: R( [ S1 W9 Z6 T sum = 0;5 \5 C% r3 H3 V+ [
for (j = 0; j < OUT; j++)" P) W0 Z* r+ Z* a
{0 t* g5 r$ F2 g/ V" r
sum += Wbc[j] * Dc[j];; m6 M( w6 [4 h/ n7 D
} ) u, v# ?' e% g Db = LbOut * (1 - LbOut) * sum; ) N) a' [6 t8 H! ^2 } } 4 [ K# \0 u9 G! b' Y6 a 4 z1 E# R# N% V8 t" R
double beta1 = 0.08, beta2 = 0.1; 0 }. y6 |" ^. v& B( W % s6 h: c" B8 c: h( J+ k+ [/ L' M" O
for (i = 0; i < OUT; i++) 2 j+ E; r3 k Q- r5 y for (j = 0; j < NEURON; j++) ! w4 t: X! {$ J( @4 r; V Wbc[j] += beta1*LbOut[j] * Dc; " I9 K3 Y: S8 R& { 0 u1 T# G6 ^- O) Q+ w: T
for (i = 0; i < NEURON; i++) ' } k2 D# ^5 P for (j = 0; j < IN; j++) ; i' i9 V: u+ p* E; d Wab[j] += beta2*Db * La[dataIndex][j]; # w0 v J# \) a& S" d7 h: C7 x. C , u0 w3 l# F2 @ 9 Q3 N4 _$ b6 ^& x4 h ' @1 V o: ^# Q" {% @8 D' [% D}/ ]* ~" W! u, U& E4 E. b
$ @5 E E2 p! X# l3 A) xdouble result(double d1, double d2) 0 J2 P9 S# t2 F: Q$ }' M% a{9 e+ G( j; h( U [* z
int i, j;( Q8 J. z. C% X$ P/ X- G( I `$ u
double sum;1 e# i& O1 y) E' p' I p
d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);; " s. r F- p3 X1 o0 h d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);0 d9 Y; U7 A) \+ @8 e* C' N4 r
/ u2 D ^9 L6 K" B: n; v/ J for (i = 0; i < NEURON; i++)# ?' X# [- R; e2 u( g/ n
{; h" ^& c- m$ W1 a0 h, X% F) g
sum = 0; % u- b, l# {3 i' s: e
sum = Wab[0] * d1 + Wab[1] * d2 ; * T5 t. B; F$ j u' q; U/ l+ w6 E LbOut= Fx(sum);3 C4 r6 Q1 n: L# w: j f' P$ o
} E, A" s% h" \- r* U8 S; M
& `6 K+ L) Y6 z0 r2 x sum = 0; ! f" l3 N3 m( i, I! }$ g for (j = 0; j < NEURON; j++)6 T; m' C; ^2 a8 ?& x4 @% |) V
sum += Wbc[0][j] * LbOut[j];0 r& [5 X1 T/ a/ F
& [; ^0 Z, I& E* b
LcOut[0] = Fx(sum);1 n) _7 W9 U' c, u2 W- G
) p1 }/ ~3 J: A- _3 l8 }4 G& c ) y6 I$ A. G; \} + f5 _4 e. r6 cvoid train()' L8 o8 K- i* o! l2 x/ Z' d/ z
{ 6 a9 D; u$ @- F- y# d. E1 I int i, j, no = 0;! U h: x2 A2 U3 y0 A( L
double e = 0;! e* k$ {* M0 j$ M. x
do{ ; m) M9 W( L/ w! {; @2 g e = 0;! v. z0 ?% D% ~: j) V
for (i = 0; i < DATA; i++) - p, _* J, q9 z9 N* i {) h% G0 e: M% I. m5 k
getActiveVal(i); ) T) R' a' d1 e4 [ backUp(i); * ]2 P3 G; E$ `" f e += 0.5*pow((LcOut[0] - Lc[0]), 2);4 _# Y+ q! e! Q* D h
} 1 x3 Y6 k7 S* R$ c% _! n 3 j% _% F6 G; R9 Q0 D
cout << no << " " << e << endl;+ T4 }1 W$ Q( `1 m
no++; " B) q% E4 [) e) [8 R m1 Q) d' D } while (no < 1000); 3 `' Q6 G) `4 a/ T& o ) I! |; t+ o. C6 d. f
4 W/ x9 _- v \# g# F
}& [* W( j) Z. D6 G7 g
/ o# b X4 q: k$ k, pvoid main(int argc, char const *argv[]) " ]0 r5 F/ p4 X" }{" u- P, X# R# ^5 I+ j h. c
) u9 I+ z! z; J7 y! E
setSample();2 Y; N- a8 D# X# Q3 L1 E
initNet(); ) H6 F' g9 ~; ~- U( e5 K train();( F: M4 `- \# g' R( }6 j
double a, b; 6 x9 s; n3 R& ]+ \ while (1) 2 Q* l6 v d9 O { R) m ^6 n' C' `: S& H! O cout << "print two numbers" << endl;) z. ^2 N8 `: c2 ^! k8 h
cin >> a >> b; , A; s$ U- J# b2 k5 y cout << "result:" << result(a, b) << endl; - ^! ?0 S$ ?! V4 n B } 5 W# T- {) h8 w4 @ L" r ( m4 q7 b" N3 t% c/ z$ ?5 _: J
; M; G6 }: m. i8 t3 x3 y" `# I}[/code]+ w, ]! w r) b& j5 n% ]