QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3042|回复: 0
打印 上一主题 下一主题

[其他资源] 人工神经网络——反向传播算法初体验(python实现)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-12 18:40 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    人工神经网络——反向传播算法初体验(python实现)
    7 |* K; l% ?( a  k, }3 _
    2 ], d- G6 O; p# T/ C1 p0 q背景* O7 A' R& ^/ v4 ?
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    * }7 p! C1 T& T8 s# N$ P0 r
    1 ?4 T" i5 q: e6 U' {$ l【神经网络分类算法原理详解】6 s9 K% a/ C) W6 Z

    0 g! d+ U) Z# V. N3 \注意
    6 Y9 y2 s0 m8 [- v$ ^站长提供的图片有点小问题,我们更正如下
    $ J0 O- E6 a$ c; F) N( q. \
    7 h; B% |- j) u* h% ]3 h3 r8 F6 h7 j5 U& @# u

    $ c. [3 L; J$ h( W; J* g问题0 o1 J3 N* W5 Z; k" l
    根据上图所示,我们有已知
    ! c: S, I( ?: l0 N/ R
    2 U$ ^& U9 U( j2 B5 P' J#输入层* e! y9 n3 {, k- T$ r& }9 w$ |5 ?
    i1=0.05' P! [/ [# t. m( N/ U" |
    i2=0.1
    ; N( m" X' J3 F) ?$ p# y& g9 f3 T8 y1 `/ r+ j. ~" q/ T' @
    #输出层, P- A% U( T! F3 [6 S
    o1=0.013 V. i' t/ y$ L% L% t) L$ r
    o2=0.993 V) F- D, t1 S
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ) ?' v* W- B) j8 C9 ~
    , ?  B$ N7 X& \7 D神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1# N7 u# S4 A4 {0 x6 K
    ) G+ G# D0 H- [  L
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ' t6 H- A6 v" n# p0 x8 U( G1 z8 s" j! H( ?
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    ( I! K% [  R9 _, W$ `
      n7 }) n* ], I8 L: v! [* C# {神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))6 s% ^: @$ c6 B$ z5 K( L( Z; c6 y3 q
    " h# q; f8 P$ @9 k
    同理
    $ X8 v& M% ~0 ^$ k& b# |
    4 W5 f- `. E' m0 r) I) Q神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))$ |9 G  F. P; B. j0 ~$ `" A. O4 p
    $ C! G  C. U% U+ H% i; \% m) E8 R
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    $ H6 X( |9 V- P& ?+ o
    $ b, Q- ]; N1 `' D# w) j神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2% k( |& _- K9 C
    8 L) V' F, b/ e7 R& t; K
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2! c, u5 v- O' \/ }
    , n! a( t% d! f& p& p# `
    再经过非线性变换Sigmoid函数得到
    + V9 a+ S2 P! h8 D  G) w$ }1 X& g% t1 l4 d8 E- a( M
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    $ t0 x2 a; t" \4 G* b7 G* Y5 W
    5 _* k1 a6 ]) E8 u, ]: k4 [神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    # K9 G! F7 V, D. d. ~! K% H. h, d
    3 I, \, c+ K8 j我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    ; t9 d6 O* k& S& d
    3 F$ l5 |+ i/ i& o损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    6 o/ C# X8 ]4 o
    ' I8 g: J* @( M% o由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    3 _5 n6 s( k% b' s  ]+ N3 E
    & R) v" R" H2 u7 y学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    $ w  }/ e3 t: Q/ \: H7 I7 ~: X! B& r. [; J  H$ q6 }
    学习率 (learning_rate 简写为 lr)我们设定为0.55 y" Q4 ]$ Q# ^* x. z2 {# D

    ) V+ o/ Z) x! }+ S依次求解代求参数1 {3 i! ]2 r: Y. g7 f4 m6 v2 r# B

    $ w& ]* F! V+ J" _8 @w1~w8,以及b1,b2
    ( M: i* S; b- a1 x' p3 @
    6 I) r$ k+ G: [* n2 ~$ V
    % ~3 N6 s8 S& Q9 A$ T1 f
    ( J5 w- o. ]( g" W损失值 (eo) 的偏导数
    % E, F  L' J: \  x4 B( B
    2 B. j* ]7 |4 ]. _  q2 C5 H+ y+ s再更新该参数,更新公式为5 C! m2 Z+ A4 k; I2 J

    ( a* Y1 d- N6 V$ {2 A参数_new=参数-学习率*偏导(eo,参数)( h! D# B- q+ ]9 v0 z
    随后进入下一轮学习
    % ?& x& y( t# w  }  E% l( a1 n( n- {' n
    终止条件(满足其中一个即可停止训练)- C! B2 c) A7 j& X

    3 d7 t7 o3 [$ M: G, j" H2 ?" _/ i1.学习次数达到上限2 N' e# b* E- r0 W) Y8 f

    : T9 m+ v& `, \% ^2.损失值达到可容忍的范围9 z/ e% @. u# T* C5 t

    4 ]/ }# ^% R* m- Z& U6 y- G导数; U- x& v% i" @" m3 i8 V# h5 D0 {
    f(x)=1/(1+e^(-x))的导数是3 `4 O2 L" I' ]6 s$ K2 j. J1 D7 u
    f'(x)=f(x)*(1-f(x))/ O/ }8 E1 S: |
    源码/ _( K, z; }( |& z3 @" l2 x7 P
    import math+ ?( u# f% ?5 F/ i, X

      ^' M5 C+ m0 Y) H: a8 C' ~3 M: X8 |#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】" Z" K% Y; f$ c, o0 R4 y
    #网址中图片有误,请看我博文上的图片! Z( m% q% b. `6 u. @
    0 |& V; j8 |8 q, R2 x
    #输入层5 F3 }( {* J/ @" Z3 `! w9 `
    i1=0.05. Y+ N* E* x8 z. J# H
    i2=0.12 K( s2 V3 h- [2 Y7 Z; n% |
    #权值参数
    8 o  a* s! z9 t: d* t* S% H7 `2 Cw1=0.15
    ( L1 ?! W, G$ u" G1 h  Ww2=0.2/ k8 u4 m6 q# ]! ~
    w3=0.25
    ' r4 j- D0 S! ?! sw4=0.36 h2 ~6 S% ^1 O2 S. C8 p
    w5=0.4
    9 y' O+ E) u3 Q6 ]9 O" c% P3 p8 Gw6=0.45
    9 ?( M1 Y! n$ R6 P* \w7=0.54 q2 d, x$ w! |. z
    w8=0.55
    5 U/ ~4 [  i% o/ x8 B3 D#输出层标记(即期望值)* K- S' c8 l4 V
    o1=0.01& c* K- H2 v* U) Z! Y
    o2=0.99# |. n1 [" \0 k( W3 X5 H
    #偏置项参数
      z+ ^6 D4 q3 w+ `8 _: xb1=0.35
    , q7 y( |' ~3 j* i3 S" gb2=0.65 }7 f8 w, R5 J; X; w0 Y7 s4 w3 F
    : l! B. a! E, y4 o- x
    #学习率5 C2 n% ^; V: f  M! ]7 I
    lr=0.5) ^8 \+ f: {% ?. H4 j& u
    #学习周期& d1 f- d& _/ \& i
    lt=0
    9 G" D! b+ d2 W. _$ x! Nmax_lt=10000
    , \5 N, ]" }+ [! `1 u3 O#允许误差
    * F0 @0 I, `+ N( Feo_allow=1e-5
    3 h  [: J5 ~; n- J& T* Y
    1 _2 v, y+ i3 }+ O8 |. w$ Q#线性转换; e* i; Q  B. Q2 `; u" X( m
    def linear(w_one,w_two,i_one,i_two,b):( B$ L0 P+ r# ~# h3 Y" M. J* I
        return w_one*i_one+w_two*i_two+b% G' t( Z+ c0 ?) E9 H3 ~6 p
    #非线性转换
    8 Q+ w$ _3 }2 udef none_linear(i):
    ; a$ A3 p  K5 r& x    return 1.0/(1+math.exp(-i))! C7 w0 C& h2 s/ n% R
    2 h0 H# p1 i0 o/ Q
    print("训练开始")' H( Y! `( X0 m2 i% O
    #学习周期结束前一直学习
    6 W1 Q( E$ O* N  U6 `5 Xwhile lt<max_lt:- q+ u9 `2 X( c
        lt+=1; ?! D2 O" B; t7 r( T$ o
        #求h1和h2输入值
    : B% O8 w7 S+ J% j+ H    hi1=linear(w1,w2,i1,i2,b1)& c) k( Y/ o4 [: G- E$ V) A
        hi2=linear(w3,w4,i1,i2,b1)3 R3 H0 p; K. F: u. v: [! q7 f5 W( P
        #求h1和h2输出值- L+ s) S$ G4 f- K
        ho1=none_linear(hi1)% W0 P- X- E6 [3 |) E
        ho2=none_linear(hi2)
    , h0 }' V7 N8 u. ?1 Y/ z    #求o1和o2输入值: r  \5 d* J1 W( o" c- m$ ^
        oi1=linear(w5,w6,ho1,ho2,b2); S- |+ [3 s  y- B
        oi2=linear(w7,w8,ho1,ho2,b2)6 z8 g+ I$ `2 C: ?* q
        #求o1和o2输出值
    9 {6 T% }/ C8 M7 o9 s1 U    oo1=none_linear(oi1)
    4 r4 d" H. ~- o  j1 r$ y& j) @    oo2=none_linear(oi2)  [9 I% t/ }* b' i2 c

    7 S$ b- ^; u. F0 A; H0 W0 C9 s    #求当前计算总误差
    / m% c: o& R! G2 J1 c. D    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 |9 P9 R# b1 H4 L
        print(f"第{lt}次训练,当前计算总误差={eo}")* @: r' c$ G# N* [- f- X- X
        #误差已经在允许范围,退出训练
    9 X% K" S" C" T% p) T2 T    if eo<eo_allow:3 f8 Q" ^; z) K0 \: Q/ d- ?1 M
            print("误差已经在允许范围,训练结束\n"); Y  h1 t& T# v4 g
            break/ E, ?- P8 m+ b5 [
        #偏导2 @$ v, H4 J* v' Y
        d_eo_oo1=oo1-o1) J4 j8 Z; J' J: y0 Z( J
        d_eo_oo2=oo2-o2; v. M' o# A# U1 O+ D  |
        d_oo1_oi1=oo1*(1-oo1)
    / O( E* c( s; s. Q5 s# h/ Y    d_oo2_oi2=oo2*(1-oo2), I& X3 `- K0 R. `" `% E2 P* \  Y% Y
        d_eo_oi1=d_eo_oo1*d_oo1_oi1' B& W6 Z' h) O( ~% z1 a
        d_eo_oi2=d_eo_oo2*d_oo2_oi2. c4 E. f) a$ O! j5 S
        #求w5_new
    4 j: e+ T4 E0 [: c    d_oi1_w5=ho1
    : }9 B& b4 ]7 |+ |0 E4 H# m$ {    d_eo_w5=d_eo_oi1*d_oi1_w5% a- m6 T! ]4 ^* d
        w5_new=w5-lr*d_eo_w59 l' o% y. D3 g8 l! @0 X
        #求w6_new
    * e, u; {7 D& w# t+ L# T    d_oi1_w6=ho2/ [, b" Y% k' Y2 G
        d_eo_w6=d_eo_oi1*d_oi1_w6. B/ g$ U( a9 ^- j' g% s/ B
        w6_new=w6-lr*d_eo_w6( M2 j# _+ I; [4 C9 _# x
        #求w7_new& X* a- V5 P5 l( N: P3 Z6 ^* O4 U
        d_oi2_w7=ho1$ K5 p" t3 S0 ~$ ?
        d_eo_w7=d_eo_oi2*d_oi2_w78 m3 j0 J8 K& y" H7 U, F! O5 h6 [
        w7_new=w7-lr*d_eo_w7
    0 B7 E9 T: P3 s$ c2 S9 D$ I& x    #求w8_new
    5 M9 B0 q5 g  t+ q% w    d_oi2_w8=ho2
    ( A# A. y* O& G; R% Y' Q    d_eo_w8=d_eo_oi2*d_oi2_w8
    0 V3 w5 F$ i+ W* a3 J* K    w8_new=w8-lr*d_eo_w8$ X9 U2 ?; L% j6 ~+ x
        #求b2_new, @% P& W8 V- l9 O; a
        d_oi1_b2=1
    ! E3 H( V/ \7 r8 r( ^0 ]* L, o    d_oi2_b2=1
    9 B7 k9 G8 n/ Y+ c' X  S& ~/ M8 ^    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b23 ?2 M/ }) Q4 |" F! p! o/ ^$ ]
        b2_new=b2-lr*d_eo_b2( y5 B9 ?& {. {: _5 T. Q* }+ V
        d_oi1_ho1=w5
    * G$ D; O! F" P9 m9 ]7 f' h; E' S/ U    d_oi1_ho2=w6
      l$ V8 X3 c  f& f# T) z" P  X    d_oi2_ho1=w75 |: I- s3 H# j2 F
        d_oi2_ho2=w8
    0 E! v: m: j6 S" u4 P    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    * F% w9 Q/ G8 z2 [7 `2 b$ D    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho20 P* J6 t$ m# k6 W# }! y4 H; g
        d_ho1_hi1=ho1*(1-ho1)
    7 N' W" L4 \1 f% ^8 \    d_ho2_hi2=ho2*(1-ho2)8 K& p( U/ D! h4 i
        d_eo_hi1=d_eo_ho1*d_ho1_hi1, B8 A* p5 M, {5 P- k1 J+ m
        d_eo_hi2=d_eo_ho2*d_ho2_hi2& m8 g* |/ }- b4 }! B6 [! f! m
        #求w1_new/ R! E, I! \4 T; ?0 {4 W% i
        d_hi1_w1=i1: F6 S' u" c- X; g
        d_eo_w1=d_eo_hi1*d_hi1_w14 i. _2 z6 b/ R5 P9 [
        w1_new=w1-lr*d_eo_w1
    - m% f, ?, [9 G3 A9 ?6 r    #求w2_new9 U* M4 i) r: B( t0 T! F( y
        d_hi1_w2=i2& g, T4 I  u7 u# z
        d_eo_w2=d_eo_hi1*d_hi1_w24 ^: M' J9 \) _. S3 U: o6 y
        w2_new=w2-lr*d_eo_w24 M( N" K; I  J4 h/ y2 T
        #求w3_new
    7 a" q' t9 p0 U  }* S    d_hi2_w3=i1
    # G- x' R/ J- l7 @0 R, H5 Y( ]    d_eo_w3=d_eo_hi2*d_hi2_w3
    8 T/ _8 D& D. F5 q. K    w3_new=w3-lr*d_eo_w3) T# Q3 P: Z' Q; h: Z
        #求w4_new
    6 [. m5 }8 ]9 O6 F  R    d_hi2_w4=i2% _# ~4 r5 {3 w; Q6 ~  W: [7 m
        d_eo_w4=d_eo_hi2*d_hi2_w4
    ) q6 K- A( ?; w    w4_new=w4-lr*d_eo_w4  r& o; c" ?' M4 Y1 d5 g# ]
        #求b1_new
    # D" q: {" ~6 L% I1 _+ V) ^; }' O9 Y    d_hi1_b1=15 u  d+ X+ O( H: r* u
        d_hi2_b1=1- s9 E' J; b- ?6 _' X$ z2 p
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    + }; S7 [4 q- v4 h9 k- Y$ \    b1_new=b1-lr*d_eo_b13 N, ^* E, M1 S& I. s
        #更新反向传播
    4 ^  g- T3 N+ v" u. Y    w1=w1_new
    2 {5 m7 p. ]$ B9 X( Q    w2=w2_new, N" u1 I8 l/ d; J
        w3=w3_new
    - x' }9 ~% c# ~    w4=w4_new: M9 T% v% p4 c. C
        b1=b1_new" r) [( @) u5 O/ v5 d
        w5=w5_new
    ) F/ W) ^+ h0 I! m8 Z- H+ O4 b* n& O    w6=w6_new- y1 p1 u/ e# ?3 o# Q8 d
        w7=w7_new
    4 x# k* n* K7 a0 s. x0 m. \+ J    w8=w8_new6 J4 }5 r% I7 ~& U2 O0 l# E# F
        b2=b2_new
    " P, ]. j- X4 ]8 \1 @print(f"当前计算总误差={eo}")+ L" z$ A, f2 O  X; ?3 ]2 |# t
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")8 i. N5 P( {$ ^+ q, x
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    9 z) @5 x; F( \) yprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) \. r0 [1 u, T- {
    3 R" q7 c3 F$ |) U# _& D6 T
    结果
    , A* P$ S7 `0 Y' I8 U$ q+ v$ ?  T
    7 Q; a% m3 ^/ ]8 w, Q
    / n. v( a4 ?, c% ]结语" e% P+ C  z* ?- m5 X5 U. m7 t# \# g2 Z
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。% d; ]5 M  |' K+ S, I: }* U) w

    4 l2 V' Y" K+ r( n' ^8 O补充
    4 p( @  N8 \+ y" ]6 J, P2 ?程序中d_{a}_{b}格式的变量表示a对b偏导
    & ?: ?1 q# H. X& N$ M0 Z3 O1 U————————————————# S! e4 Q, w" m" m9 }: s) _0 b
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 h2 C6 D# R3 P. v* X6 _4 R3 p原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    5 M; i" o( ]! u$ c7 Y: Y& c" ]$ E2 [: t+ e; J

    1 b; ^- A6 m1 g) e+ t; n+ P
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-9 18:42 , Processed in 0.337754 second(s), 51 queries .

    回顶部