数学建模社区-数学中国

标题: c语言实现BP神经网络算法 [打印本页]

作者: syj52417    时间: 2015-4-24 18:21
标题: c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!. }+ @0 m1 @' H( K4 E
ps:不要吐槽语言。我知道这是c c++杂交体。[code=c]#include <stdio.h>) g, ^: B1 H. x" m
#include <time.h>. K' D  f  i0 X
#include <math.h>
) S# E. T4 [9 f#include <stdlib.h>
1 f/ X9 }" S0 E#include <iostream>6 @+ L* H* Z% l" A
using namespace std;% e9 b  r6 j8 D( e
#define DATA  800
1 v, L( u0 U9 [4 o4 q#define IN 2
, ?) R( M3 |- A; K! x. p#define OUT 10 X& Q# c1 S3 H+ y! z5 F
#define NEURON 45
  I( m6 J) J% e4 M& W: ?3 K, [* r#define TRAINC 20000
7 ^. i' ]! A# o) c, O$ y" P2 m
' S6 @: ^: F  }; Idouble Fx(double x)9 [; R! ]1 @: t6 I" y2 q4 b0 n0 L
{- W% b2 u. d2 T- C$ D; p
    return 1 / (1 + exp(-1 * x));
+ Z- k6 U' o8 Z4 X" L7 U2 c1 w}/ s# Y; X) f0 w( ?4 R
//La输入层  Lb隐藏层  Lc输出层4 l4 X3 M! {4 i, X6 i) z& w
//样本输入
9 p3 t5 C, C( ~9 G, Jdouble La[DATA][IN];
; m, @9 T' ]* F9 T( W- U' P7 P//样本输出
# |& [4 w3 |8 M, Wdouble Lc[DATA][OUT];
1 e4 X" r$ k, Q2 X6 i; N//La->Lb权重
# q+ ^' D5 ^7 _' t1 D  {3 o2 ?double Wab[NEURON][IN];
% q+ o6 ]) q7 l' y5 H! q4 E, n//Lb->Lc权重
3 D3 w0 R( O7 Edouble Wbc[OUT][NEURON];! k! v; T+ [4 V$ c. E
//样本输入每个向量的最小值,最大值;输出...
/ B& \) E0 H( M2 F# g4 ddouble MaxIn[IN], MaxOut[OUT], MinIn[IN], MinOut[OUT];5 w# h' C1 s# l9 ]' W; b9 o, r1 |
* g  C' R+ O2 p4 ]8 C3 ?: r  A8 O
//Lb层输出
# {7 t6 l! k+ t8 Bdouble LbOut[NEURON];
' d$ y. V. v% O$ y2 i//Lc层输出8 G+ g) E# h- V/ a! L
double LcOut[OUT];0 i# i  i* y! }- ]( R

4 a# b6 S7 {6 X5 o//Lc层单元的一般化误差
% {- T' ]& t1 x$ H/ e* d5 pdouble Dc[OUT];
& T, i: B. A7 r& w1 W7 G//Lb层单元的一般化误差
4 r. L$ M6 v* U. mdouble Db[NEURON];1 m% r9 \' E) ]8 g1 `/ U
2 N+ ]$ X: c4 `* N: s& k2 V/ @  [
//设置样本数据
2 Y+ F. G; m& K$ u4 n2 a6 x8 w" tvoid setSample()) w7 `+ [( d6 B
{  V5 G1 D% ]7 L: x" M8 s2 J# Q
    srand((unsigned)time(NULL));! ]! ^% `* b5 q4 Q
    int i, j;
; A& O" h. M  h- c. W/ X8 Z% P    for (i = 0; i < DATA; i++)8 f$ `' S0 @+ l; \4 P2 q
    {) t2 B% t: u! b& q" V7 w! N
        for (j = 0; j < IN; j++)
. ~" J( |' s' G2 s- k8 N: a4 B        {- J" e! d& V! [8 b' ?  L9 [
            La[j] = rand() % 1000 / 10.0;
& C: a, \, u* ]8 f% F( e' u        }
3 u0 w$ i, r7 D5 ~9 a; _# ^
  ^" p1 |2 J& f; c! y        for (j = 0; j < OUT; j++)% H) K; `8 {" b' T; Z3 p3 P7 R3 `, k
            Lc[j] = La[0] + La[1];
- ~, r0 f) @. |: ^    }
1 b9 v. [' ^. \}
' m: T  k! d  `) `//初始化BP网络:权重,阈值(隐含节点+输出节点)8 y' Y0 V7 k9 X8 j6 b
void initNet()
6 @+ z+ Y, D% {/ t% f+ w* t: c# `& }1 A1 B{
. g; h( J; A2 w  l1 t7 K+ v  W8 c    srand((unsigned)time(NULL));9 ~% e) D( d  N+ \8 N1 `8 F. Q
    //两部分的权值设置随机值【-1,1】
! c9 c  d4 [) S( M0 s; Y$ f    int i, j;
2 d1 o7 j( ?3 L* w$ O    for (i = 0; i < NEURON; i++)
- U# n' g5 W3 C$ F0 w# _% c6 i. S0 e0 x        for (j = 0; j < IN; j++)
- _6 ?1 o( q0 [0 M. Q" ^        {' _) Y* S7 a# z* `) u
            Wab[j] = rand()*2.0 / RAND_MAX - 1 ;
7 u+ O$ q& c1 S            Wab[j] /= 20;
$ b  ?' w, J, M4 p7 ?* j        }+ S4 y1 D, t# k/ \  o+ w! G
4 j4 W. u# ]: a% t2 L% g
    for (i = 0; i < OUT; i++)1 D' B7 o- X: \1 M8 v0 a3 i
        for (j = 0; j < NEURON; j++)2 \3 O7 J; T+ g, D# X2 F
        {% m  J, l- z' O8 ?+ J
            Wbc[j] = rand()*2.0 / RAND_MAX - 1;5 Y' H$ f7 L3 i6 n* F
            Wbc[j] /= 20;
2 A, |7 P5 Z& n4 r6 d0 y        }
- J+ [+ T; Q2 B" d* u     ; @6 g% D* U: [' s% Z
    //找出每个向量最小最大值,并进行归一化
$ C4 B  j: K1 ]9 B$ L1 Y    for (i = 0; i < IN; i++)
2 M: P. T5 I- N$ f9 s    {
9 B, {! [" S0 ?7 p- P) X$ g) P* }3 B         
, Q, t; h( g0 F9 Z5 f' w) w        MinIn = MaxIn = La[0];: R9 X" d# e" R7 ~( B/ Q
        for (j = 0; j < DATA; j++)9 @" u* d: m) j% c: z( W# R. R
        {
' i6 c8 t4 Y* V5 A2 R; s            if (MinIn > La[j])$ ^$ t7 c* S5 [  B3 A  z  V  f
                MinIn = La[j];
1 F/ l5 V, M( ~1 \: m4 p* S            if (MaxIn < La[j])1 ^. M- K9 L0 `+ a0 _
                MaxIn = La[j];. E& s% `2 L; b: m" E
        }
# a: r3 R& `: m* j( d) ^     - A/ L! Z! f, [& F0 I8 ?7 O
           |, V# Y' i" K3 w4 r0 e
    }
, ]7 t2 @& x4 M! X  g( v5 C
5 v& Z1 L8 i: w5 M" u% k    for (i = 0; i < OUT; i++)
: j; {9 R" N7 E% o! j    {
. d. W5 u1 ^3 [7 B' n# K5 ]6 h         3 {* |# R; L% C: d
        MinOut = MaxOut = Lc[0];
) Y4 ~! N5 D0 |8 F        for (j = 0; j < DATA; j++)& g7 A. K  @1 T, r7 S
        {" q* q- R, K2 Q* f6 x6 O
            if (MinOut > Lc[j])* Q3 C: v5 V- z1 D
                MinOut = Lc[j];
) ?1 I: z1 T* c- o1 Z8 O- J            if (MaxOut < Lc[j])
8 H) y+ D. z/ o0 [5 z                MaxOut = Lc[j];: m' W: ]) }8 s1 A
        }
) q7 J- Y* G: w& d7 Q  Z 9 o1 i0 G& W4 U8 |/ W
    }
6 z' [' R8 \% D& i  s
9 J% h: f" [5 d% e; X8 Q2 L; s3 c    //归一化
/ ]  ~' I$ Q) u: G5 l/ G( P& Q" f1 p    for (i = 0; i < IN; i++)9 K1 @* O8 Q9 ^9 G/ c, ?" U  P
        for (j = 0; j < DATA; j++)# Z) z* m) [( x/ ?7 E3 ~
            La[j] = (La[j] - MinIn + 1) / (MaxIn - MinIn + 1);; o0 ?* {9 R. D2 `( K4 V
               K; Q3 |9 g2 `5 c2 D

, T* I- y% c  e# @$ l4 P, z    for (i = 0; i < OUT; i++)
8 d- v9 }0 K: H        for (j = 0; j < DATA; j++); t( \2 ]% f9 D1 u! N
            Lc[j] = (Lc[j] - MinOut + 1) / (MaxOut - MinOut + 1);" X# x! C$ Y, Y" X1 b5 W5 J
         ' P& R$ X  P; o' r
            
+ @( }5 V1 b- c; j 2 {) P7 ]1 s' ]9 i2 z2 A
}7 V# j* v4 E- U! O# p5 G
void getActiveVal(int dataIndex)
# C5 B, ~6 k4 c7 O  J9 G& K6 c{
+ ?$ p. D8 ~/ H. B( e* n6 j1 k    int i, j;9 d: Q  z8 K. g$ |* |. V7 }$ F1 V
    double sum;
) }/ {; u+ m# M    for (i = 0; i < NEURON; i++)
$ a+ k5 T- Y2 r. e5 h    {
! i  q: R3 P/ C! E, K6 D. H+ |3 T        sum = 0;
/ ^# Y2 l& a  e1 v) I7 `        for (j = 0; j < IN; j++)+ H# K$ j  X8 P% y' z+ @
            sum += Wab[j] * La[dataIndex][j];
& f5 a2 {8 f1 j) X         
* N& m1 T7 e  a* G9 }        LbOut = Fx(sum);
& W4 s( l; ]! w- [! W: b* r# n% R
4 g! E! D! ]( a* \+ ]    }
5 I+ X3 s1 R5 u9 E$ x" w+ c
3 H2 _& D9 ^  M, p2 M    for (i = 0; i < OUT; i++)$ F( {1 \! r! n! U) Y) V1 r/ m  I) `
    {7 s& p$ K6 Z" Z; h! O
        sum = 0;
, W5 X& F& C" _/ ]% E2 k        for (j = 0; j < NEURON; j++)' G! _: ^. S) M: s0 p' d7 E" E
            sum += Wbc[j] * LbOut[j];7 ~4 ]( {4 _3 H* V
         ' ^. p- T+ \$ q' d& `+ `7 U) A- a
        LcOut = Fx(sum);
2 s  _8 O  M" Y( u, V) s& ]    }
4 b/ z, |$ _  o}3 ~% u- u/ v  @! Z
void backUp(int dataIndex)9 `. K! R! C! b! T6 i* Q
{
$ ], w2 `4 b6 F: j- y    int i, j;  X/ K7 u8 a( P. d0 S! T0 y
    double sum = 0;5 U* U4 @- R( `
    //Lc层单元的一般化误差$ k9 b6 i" P, m0 J8 W' n
    for (i = 0; i < OUT; i++)
& j) {5 o5 ?; B+ G8 g; i        Dc = LcOut * (1 - LcOut)*(Lc[dataIndex] - LcOut);/ ~% b  O) D' x7 ~6 x+ F- [) u
& r* s2 Y+ W$ T3 q# B! W0 e
    //Lb层单元的一般化误差' @1 W' e" h$ R9 X; Z1 E$ X8 G1 f
    for (i = 0; i < NEURON; i++)
$ X' o4 R3 W4 H* \    {7 d) y* w- F! Z4 p. r& M- M' H
        sum = 0;
6 [4 F. [  h. L1 }! K1 M        for (j = 0; j < OUT; j++)
8 u0 L  x" ^( i& Q        {
% `( F0 b: T8 f( l1 \7 y! u            sum += Wbc[j] * Dc[j];. a$ ]% b  x3 |! m$ `, D9 [
        }! L- E# Q3 {# W  l
        Db = LbOut * (1 - LbOut) * sum;
/ K! ]6 N% ?" }" Q4 ]    }
0 e; s4 A" P* _) h4 V# L; u7 X
8 Y; C% m5 Q  z    double beta1 = 0.08, beta2 = 0.1;
- X0 A# g8 z# i8 v# D
) @. {: z+ s0 B6 I' w7 }' e0 k    for (i = 0; i < OUT; i++)3 n, i/ G( A: {9 U( v0 c" f
        for (j = 0; j < NEURON; j++)$ u& s! f! b7 E# i& w8 @- g) M
            Wbc[j] += beta1*LbOut[j] * Dc;
& [2 u4 \  v: W8 H
: N; J8 @  T# l' P    for (i = 0; i < NEURON; i++)8 t0 P" e1 o$ s4 N+ s( z* U% e
        for (j = 0; j < IN; j++)
% t! w! K9 t0 n, n$ @6 P            Wab[j] += beta2*Db * La[dataIndex][j];
/ P7 {; U+ h& x" ]. X3 D3 F; C 1 [* w6 W3 g% b8 _6 l! C
     5 g7 ]5 a5 q' R) t" r# \: t
     
! _: M3 V2 }9 S8 O- s7 q1 A}0 O# K9 o3 g# w3 p

; V# W5 \! ?6 v8 zdouble result(double d1, double d2)
& [) Y/ Q" F6 u{  Q; q- Q6 @8 X0 \& Z, R" f$ g& l
    int i, j;
& l7 w- F0 D9 \4 J  r5 h    double sum;
; u/ n' c/ n# m% p* N    d1 = (d1 - MinIn[0] + 1) / (MaxIn[0] - MinIn[0] + 1);;+ j* R3 E9 M" [  Z; {0 }9 w
    d2 = (d2 - MinIn[1] + 1) / (MaxIn[1] - MinIn[1] + 1);
7 q# p2 C, ^/ G + @  X. T) q( h2 s# ^
    for (i = 0; i < NEURON; i++), Z0 ~& f1 T$ c* V
    {. q  ~2 Y" W  Y$ b8 _( N
        sum = 0;         
3 \+ |& d7 H3 h7 }8 L8 r: |1 C- G        sum = Wab[0] * d1 + Wab[1] * d2 ;
. _5 |% Z) p" d- u/ }4 Y4 g        LbOut= Fx(sum);
# ]( k5 D- B4 Q" G    }
- R7 e$ R! N* ?
6 [/ g7 L2 ]* \8 B: k    sum = 0;% _) _( C& W+ N* O, ]
    for (j = 0; j < NEURON; j++)
# ~. g4 Y) G$ M5 `. i        sum += Wbc[0][j] * LbOut[j];
* r' J7 a' G+ e     ) H3 [" p( \0 e2 u
    LcOut[0] = Fx(sum);
# d" C( M- a: U3 u1 t. ~* V! g- W; d     
% p# ?8 q! \: e$ j  Y$ y" D    return LcOut[0] * (MaxOut[0] - MinOut[0] + 1) + MinOut[0] + 1;
# }* b2 |# {3 |- k
# l1 Q6 z' |8 p6 X3 q- V1 u  b
" R* A( K) w  o: J}
" G% e: j$ I% L+ W# qvoid train()& r% l( I3 y# m. L! ]; _8 g
{# j& b0 g/ L+ {+ i0 k
    int i, j, no = 0;% M7 m! ?4 q9 y% A) C, h
    double e = 0;, |% y3 x/ |: s9 O% t
    do{
3 N( B6 H9 O8 k$ _/ k: K+ z3 _        e = 0;
! t; E2 [0 g, C, P9 w' H6 W# [; v        for (i = 0; i < DATA; i++)+ m3 T: Y$ X: ^- A5 p) u
        {4 l" z- }0 ?3 O8 ]
            getActiveVal(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ; g9 B* a" ^( K% E( W
            backUp(i);
9 _2 M" [5 I4 u% G            e += 0.5*pow((LcOut[0] - Lc[0]), 2);
: {& D+ k5 S3 L        }' H: c  q4 @, X' H7 L# c
         7 N6 @0 O9 Q+ q& I# C$ T# ^3 k6 H+ L
        cout << no << " " << e << endl;/ }, ^2 O9 I. ^* z
        no++;, H% e" G$ F! Q% p6 k
    } while (no < 1000);
% n( k' G! p# B9 y' f! p9 d7 i # V! l$ i' d! |- C7 b6 F7 U% p0 i

/ F  l, S0 ~8 W) Y& _. d}" ]6 P1 f9 J" m! i" B$ E# k! ~5 Q
  c) y  K, D- y) I
void  main(int argc, char const *argv[])4 j7 C, C- k- n4 y/ O& m  r& H. f
{3 _/ t4 g0 b8 B. D' `0 p2 G
     . u6 K' e* n) a: }5 i- y3 S, g
    setSample();: Z3 @8 T' Y: q' A9 `# m* l
    initNet();/ P2 A; S& v9 r5 O: f. _4 [
    train();
1 ~0 m% {7 S8 u    double a, b;# ]4 i& U1 h+ B; F/ G
    while (1); q9 ?9 f" `7 c6 T; T
    {
& }+ L+ e0 D% B7 d9 U- g        cout << "print two numbers" << endl;1 Q9 `% E$ H9 U! u, z
        cin >> a >> b;
. y) G0 G0 f2 l1 Z# G        cout << "result:" << result(a, b) << endl;" X3 C; e- X6 ?7 y% U* P; p) g
    }
+ Y9 ^, J/ @) e' w9 }8 l$ e     ( s0 x- A  q2 ]5 w4 u: q* ?/ _
     
; ?* F3 {' C0 h! W. C}[/code]
* e! H  D) C& t: J" Y  E
  b( W  y' G; @, f. r




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5