QQ登录

只需要一步,快速开始

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

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

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

5250

主题

81

听众

16万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-12 18:40 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    人工神经网络——反向传播算法初体验(python实现)  N* b6 m! U: M

    . `. W$ g2 r" g) z; D背景8 [+ @1 S) X1 d8 G. [5 B
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    & H6 W$ u5 i8 e$ H6 q
    : l- H0 i+ X$ s& Z. S& U! f【神经网络分类算法原理详解】7 W( I# i; x5 a3 |

    3 A* J3 F9 i  Q3 p0 L注意9 O1 S" N/ N# V5 ?
    站长提供的图片有点小问题,我们更正如下: ^+ i- H$ z  c, ~6 D! H% K+ X% V

    - S: Q2 N% m% _  J2 P% y+ ?9 k0 W' h& q- s/ I2 V& y

    $ _$ E1 X8 j: {' P8 _问题
    " i. e  ]/ g( O7 I3 H7 h根据上图所示,我们有已知. Y" u) k5 t4 h7 r+ \: Q; G

    4 d7 w) Z! I% U9 g4 G#输入层
    4 d9 j9 k3 f* J9 D* m  Ni1=0.05
    / d% q; ?9 f- N! E* `% L3 }; l% `$ ri2=0.1
    # i. h- t! ]% L  {
    ' O. K  Z* D+ a! t5 w: M#输出层
    % K* a9 N0 z8 `' c7 i* K9 [o1=0.01
    # B2 O( R& D' C* no2=0.99
    - e" @8 l$ H* n. m这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    3 [. Y. O: k5 t; Y) ?
    - Z6 _  W1 r: q, h( Y9 O- v- S" [神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1% A4 q/ h$ O% H, p
    % r. E1 P) }5 ^/ ]+ j  `8 G% w
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    % O- P# b6 h8 q+ ]  z. T; Y. u& G: T# ^6 N1 E
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出& K+ R" u4 `/ q8 @! _$ N
    ' h6 V0 J9 `/ b* |
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))4 _4 B! P7 j$ b- G" a

    " C7 m" K1 A( k; U9 r+ i8 F+ @& U' N同理
    " Z/ O+ a: y% V1 G8 W; t4 E8 J# f: X/ H8 m/ N/ ~6 k. ?+ F5 j
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))- f9 T( W7 p3 S5 D

    5 b/ x# x  T1 V3 m& w接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式$ G+ Q) Q2 _9 P: O$ _; I! M

      W6 C: b, h8 h3 S5 b. m( @神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    6 e$ i3 Q" }8 |7 R1 k: ~4 S% b4 U4 l9 d1 \  X: T# q
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" n2 ?0 |. Z6 G9 I  ~5 l

    # s" u! Q& Q8 i7 }: F; V- n再经过非线性变换Sigmoid函数得到+ V% w' H$ l4 S
    + P% t- R1 v  |& y* `
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))! h9 U8 A# l4 G8 ?" p+ S: [6 D* M# M
    - R8 J' U# x  n5 \" d- f! V
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))/ v. O+ X; _7 B4 l: h

    2 |# A, r! |2 O' _$ n我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    + A1 o* H4 s# U7 A0 f% r" U* r
    , F6 P% g4 d1 K) H! V损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    ( l: B; c& w$ b  n$ M# M* m) ]7 |. V! G
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足$ y2 {  Q! v1 ~- J/ ?: O8 Z/ T0 N
    $ \$ D/ V4 i& s; q0 i
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    2 u+ r# ^' h3 [( ?# `. U0 e: E4 K* U$ r/ |" ^# [
    学习率 (learning_rate 简写为 lr)我们设定为0.5, x0 h& J" L5 L
    ; I# P% u" f* u8 E! E4 }. ^2 Z% Y
    依次求解代求参数  _% `2 n- s  B! B- m

    $ k% D! y7 ~) x3 }. ww1~w8,以及b1,b22 U7 c  _4 ?' t( S

    6 k, F% h" [- a( n* ^
    4 D6 F$ C, o" t( d4 r1 E, M) |5 z! }' D) `# L
    损失值 (eo) 的偏导数% N# g1 m' ^: x; H
    - C5 g9 B2 D9 o6 @5 }
    再更新该参数,更新公式为% |" W* g/ s4 I) b' p* c

    , g# a) j0 B! \3 K参数_new=参数-学习率*偏导(eo,参数)
    5 @% z" m( C0 u! ]/ O5 `) N4 q, ^: E随后进入下一轮学习
    5 e0 t' e3 A, p, v2 g
    : Z: W+ O. G- u" g% K7 b0 F终止条件(满足其中一个即可停止训练)% P9 L1 @) z- S0 J" U
    5 V0 v& e& a6 O; g2 D' D
    1.学习次数达到上限
    ; i  Y$ Y1 ^7 K0 v6 x3 j/ S
    : J4 b6 X( A9 u, j2 s. a9 R2.损失值达到可容忍的范围3 R0 z' T6 \' P

    , K" h6 I( n! G0 x导数5 j5 o4 Y8 ]; h6 A+ u
    f(x)=1/(1+e^(-x))的导数是2 A: Y1 }. v- |1 l" S: O
    f'(x)=f(x)*(1-f(x)); j8 x+ m# i/ C7 ?# h
    源码$ f: n6 h" q8 [/ n8 i3 N* I# r
    import math9 V9 C0 ]( {4 d8 o
    9 v1 b8 ~- `' s
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】3 O& D6 L# L- d8 V" l, t4 y
    #网址中图片有误,请看我博文上的图片0 P" m  f- r! A3 F. ^4 u: C& {
    1 Y9 e$ S" G! T& C2 ?
    #输入层
    1 {  B0 j1 ?9 Y- j" x8 ai1=0.05* Y2 q2 [& i6 g  A& a
    i2=0.12 `: S: f; \' G# J0 `
    #权值参数- k% f  |5 Q: g% a( {7 v& C
    w1=0.15
    , ?: K6 b( S$ O1 h3 k# N2 u5 v. b% A3 tw2=0.2+ z1 Z- j2 O  E% y2 L7 I: N5 k
    w3=0.251 x; Z; ?+ e! d, q4 I8 V
    w4=0.3/ T9 k4 j) E* @5 x9 K1 J# h& Z
    w5=0.4
    - ?6 O0 X: L0 {* pw6=0.45
    . d, ~# X. K9 D  {. Vw7=0.5+ ]% C! f& g4 Q8 g/ n
    w8=0.55
    : |" J' s6 Q1 C7 k! a8 K#输出层标记(即期望值)
    2 ~0 k" O+ g0 q( c' n/ |3 N: |o1=0.01* F* |* e" `" n9 l( R' b3 D, O
    o2=0.990 n! R- H& a* }5 D2 Z6 A- d; ^7 q
    #偏置项参数: C% d  C; F/ s8 B2 n
    b1=0.35
    ( @* L( p/ k; I$ O6 ]b2=0.6
    # l* T  s) ~( y1 J$ O. u3 S0 Q6 x5 F) l
    #学习率
    ! J- ?7 [% b3 R5 x. y2 Tlr=0.5! V+ X+ M& _2 a8 y3 t6 Z' G3 U
    #学习周期
    - |/ H% {& l7 c2 m# X" Olt=06 o" i0 S: B6 D
    max_lt=10000# n) S5 ^' D! M4 z% l
    #允许误差
    4 H- V* l! u% J; t; Ueo_allow=1e-5" Y7 o# N5 {* Z, a; G

    ! [& r$ W$ n. r3 [4 m#线性转换0 L9 T/ B8 N" y5 M4 v1 d1 v& D4 h, i
    def linear(w_one,w_two,i_one,i_two,b):$ h: X2 j4 h) x9 v0 i* _" e
        return w_one*i_one+w_two*i_two+b) o) {5 V- J; Q8 F
    #非线性转换
    $ k0 W; K% w; o- T$ vdef none_linear(i):
    # p6 p, V  R3 E+ A: K' e/ N0 s( E4 L    return 1.0/(1+math.exp(-i))  o$ A' f% e. W7 d
    ' D8 _* O0 I& f3 c" ~2 k! I$ K1 G
    print("训练开始")3 r& }! ]+ n& a4 ^. N* x2 Y
    #学习周期结束前一直学习
    2 z0 b: p6 Q* S5 v8 v; Q5 H: Swhile lt<max_lt:
    ) |9 a( T2 X3 B9 \    lt+=1
    5 I4 \  X8 L7 Z* t; \6 h    #求h1和h2输入值1 E$ S; D- \& W/ C" Y3 F
        hi1=linear(w1,w2,i1,i2,b1): L9 i; a+ N. g
        hi2=linear(w3,w4,i1,i2,b1)0 w3 ~3 r8 s/ [$ e! D& e+ U1 ]
        #求h1和h2输出值( l: c& y, G% a& G% A+ E
        ho1=none_linear(hi1)1 I1 Z1 b" w8 M/ v( y
        ho2=none_linear(hi2)
    ' [. n1 @( U/ f) z    #求o1和o2输入值
    $ z4 B  {% I' ^9 J  g& X9 ?' T( `, c    oi1=linear(w5,w6,ho1,ho2,b2)1 }3 b& c5 J8 P% F7 V
        oi2=linear(w7,w8,ho1,ho2,b2)
    5 d( j0 X) [1 y8 {2 E) L% K' ?    #求o1和o2输出值1 _' ?$ s1 q, i5 N! w  J8 R, b" {
        oo1=none_linear(oi1)
    7 P5 b- S1 v% e" n) }8 ^) m    oo2=none_linear(oi2): D6 T* Z  c( ?# ~0 d

    9 S  k" F4 N( l    #求当前计算总误差, I2 b* _( T5 ~: X+ q5 m: A+ X* g
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2& O- L* o1 R! I' o. M( K- \/ z4 b
        print(f"第{lt}次训练,当前计算总误差={eo}")
    2 ~- w# z1 u. `% V6 e    #误差已经在允许范围,退出训练
    % n- e1 C% m) [3 m& o* U& z    if eo<eo_allow:9 v2 T' c7 b" t7 t4 ]  u
            print("误差已经在允许范围,训练结束\n"): [) f# P: s) [; v. X& j
            break
    . W  I) T$ J/ E. R% x, c0 x' M    #偏导
    6 m6 h5 l# j1 b+ W5 }5 ]' E8 _    d_eo_oo1=oo1-o1
    ; Z- d# }) K: d) J7 b4 N    d_eo_oo2=oo2-o2
    0 C3 v0 o. m0 B/ _; R; I" Q    d_oo1_oi1=oo1*(1-oo1)
    ' G! V2 N; U+ o8 k    d_oo2_oi2=oo2*(1-oo2)
    " E9 E; l  L% q  q" r7 w, L$ s5 y    d_eo_oi1=d_eo_oo1*d_oo1_oi1
    * h$ |$ _( w, I/ C    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    # m# j6 B$ ~$ b5 t9 f0 G! Z    #求w5_new/ D8 X: C1 c+ m
        d_oi1_w5=ho16 r0 r! f# w8 k( K9 \. m% g
        d_eo_w5=d_eo_oi1*d_oi1_w5
    * M4 k: b/ T; M0 _- L0 D    w5_new=w5-lr*d_eo_w52 Q0 X0 J  d4 f) W) m4 N
        #求w6_new- M2 ~$ N. c, C# }' {8 V
        d_oi1_w6=ho2# ^3 t( e2 Y+ {- E) _: J5 }
        d_eo_w6=d_eo_oi1*d_oi1_w67 s6 Z5 M) h# k1 F9 n5 ^" {
        w6_new=w6-lr*d_eo_w66 H6 b7 k# v8 R' E3 E: N
        #求w7_new
    6 A2 M( _5 c2 F    d_oi2_w7=ho14 Z9 @1 {# a* e4 ^5 \4 T9 S* C2 N6 O
        d_eo_w7=d_eo_oi2*d_oi2_w74 J0 k$ C- C9 D
        w7_new=w7-lr*d_eo_w70 q5 ^& i3 f4 K+ o
        #求w8_new
    ( K1 O- F) P! b- d! v6 |    d_oi2_w8=ho23 N1 A. ?9 m0 a/ j1 ~; ]3 |
        d_eo_w8=d_eo_oi2*d_oi2_w8* H5 z$ n2 N6 g  K
        w8_new=w8-lr*d_eo_w85 X0 x+ @9 H, ~8 m- R- Y( L. F8 F
        #求b2_new
    # U0 c# a1 ]  J- s0 \    d_oi1_b2=1
    . s5 v: e; ^) ?) p9 ^    d_oi2_b2=1  }# P! g5 ]1 M* \" B5 u( X
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ) B) E7 Q: R5 M0 U2 x8 p. G8 c4 b    b2_new=b2-lr*d_eo_b26 Q2 S! t% x0 Q+ C# e  P
        d_oi1_ho1=w5
    1 \( Q( s- u+ b. t$ d1 v$ |0 Q    d_oi1_ho2=w6
    1 R' S; l& t- @9 c& u( V% D    d_oi2_ho1=w77 N0 A% s" R$ `5 `2 S
        d_oi2_ho2=w8. m9 E1 Y, j0 {
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1% i4 j, c' z; z7 C7 ^' b
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho22 X3 Y! a: Y/ ]4 ?* ]1 U$ p
        d_ho1_hi1=ho1*(1-ho1)
    % ~$ @/ `+ l0 B. c$ c( G  O/ ~( W    d_ho2_hi2=ho2*(1-ho2)
    7 T# D. p2 d+ {! H6 u$ P    d_eo_hi1=d_eo_ho1*d_ho1_hi14 W* w2 m. p, o4 p1 A( b4 t
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    & t0 h9 k' V0 `- H1 W, ^    #求w1_new9 y' B8 S7 ^# U: r5 B
        d_hi1_w1=i1
    0 C) u+ G2 I8 R    d_eo_w1=d_eo_hi1*d_hi1_w12 n2 ~5 v4 k: J( g
        w1_new=w1-lr*d_eo_w1
    + K( e! j7 ]( |- \    #求w2_new
    ( Z# @) p2 P6 a2 U$ `: S    d_hi1_w2=i2' j+ l* Q8 \' `0 w0 R7 @
        d_eo_w2=d_eo_hi1*d_hi1_w2
    " ^3 @0 e$ K& P# E" P1 D    w2_new=w2-lr*d_eo_w2
    1 j  H9 f9 F8 `! ~& V, a- i. W( \4 Y    #求w3_new% i- ]4 L, G! U9 W3 U; i: e
        d_hi2_w3=i1
    ' @1 {2 [" G4 t; K$ G; b8 p  m( [8 v    d_eo_w3=d_eo_hi2*d_hi2_w3
    1 i3 B/ f' M$ o    w3_new=w3-lr*d_eo_w3
    ! |; ^# v3 y* W- t9 M% Z9 t7 Y+ |    #求w4_new
    9 n' u. T; x: n4 `. K5 C    d_hi2_w4=i2
    % b$ H$ X0 ?0 U. [4 c, b1 @    d_eo_w4=d_eo_hi2*d_hi2_w4
    4 O" ]0 M! d0 [    w4_new=w4-lr*d_eo_w4% Y: W1 }# q4 o1 o* b
        #求b1_new
    0 L# r0 E, K- \- C* ]    d_hi1_b1=1
    . [# |+ r/ r; t' s4 Y2 c" a    d_hi2_b1=1
    2 z7 b& c& Y+ H' a  x( r    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b19 f. C+ F, @2 c9 m
        b1_new=b1-lr*d_eo_b1
    1 s8 g: B0 R0 r0 F    #更新反向传播& X& L" `9 W5 y% V; e9 u
        w1=w1_new  p- ~$ w0 V; g9 m  d5 r4 \' T
        w2=w2_new: L1 W1 q3 h8 [1 l9 _+ `* F! R# a
        w3=w3_new
    " i; D# |, B  |# x: v4 `    w4=w4_new; ]- }) O9 N; u- v
        b1=b1_new7 T( m3 F% M( E( ~
        w5=w5_new
    7 `6 ]: p7 T/ h% V! h8 }    w6=w6_new
    0 ^9 y  s! P& `- @6 O1 c# j5 J4 S    w7=w7_new
    9 A8 Z2 {8 }  g; O5 p. K* N: r    w8=w8_new& l- H4 ]3 v. X% ?
        b2=b2_new
    5 h/ e" {6 X( J. J: ~4 [" `: @print(f"当前计算总误差={eo}")$ }& C& o5 j% Z, G, \+ a: S$ q
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    ) w! J7 Y7 B0 W! o& }2 [print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n"), b" ~2 x/ i& [0 T" r( G) a
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    6 X( S4 V0 p4 V, @: F% |# u( F
    4 |8 j% o2 r/ |- T结果
    2 F' ^: Y# ~5 R  I, D( \
    # P; Z. w0 ^# Q6 m& R
    : E9 n6 g$ m+ i2 n+ ]结语
    # z0 w* \" }$ `$ s: Q可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    3 U& P. Y+ }2 m) `1 O# X% I/ {9 c9 b
    补充8 s+ y( H$ J4 @3 k! W
    程序中d_{a}_{b}格式的变量表示a对b偏导
    . b" |- t& z% m0 p$ T# h$ A3 n————————————————* a% O: B, \7 }6 M) p
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 H$ g/ B. ?, @. M* d  w3 _. g* B原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    , H/ K4 q0 X8 ]
    & C# F7 \& t+ m1 U4 `  B: o7 L
    ; p7 ~* I6 k2 o
    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, 2024-5-1 00:36 , Processed in 0.363856 second(s), 50 queries .

    回顶部