QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3006|回复: 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实现)/ l: V* H& B, r
    / n7 {( E0 h: v2 [
    背景
    9 `: f( b0 m0 s& m初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下% Y7 J7 a2 ~2 ~8 j$ e* K/ a  j2 y' v

    ( ?% I. x0 ]3 ^4 {" m" o5 ~【神经网络分类算法原理详解】5 E4 [* u& F' R7 A4 Q; f0 {
    $ M) p9 ~+ I8 ^  {, ~0 `
    注意$ c5 x  a7 R' u. a
    站长提供的图片有点小问题,我们更正如下6 B) q2 E2 r. ^5 p& s  x
    ; j  i# V  ~0 F9 j

    " ]! W, {2 V- r' O) {8 @, R7 g& C( T6 k/ E" ?7 Q
    问题
    . k# N$ ~+ h2 S7 w1 E根据上图所示,我们有已知
    + m* P3 S# `" L1 l+ U* _/ X
    8 a, H( M" j! V5 Y#输入层' t; t. w/ O7 D9 n/ S- I/ ]
    i1=0.05
    % S) L+ y- d3 K( `- |i2=0.1
    + F" w5 B) ~( N9 z( Y' Q4 x* C: j
    ) o9 X: v9 U$ K$ Q#输出层
    ( d7 @3 O& C, e( yo1=0.01; r8 ^  d1 p, i
    o2=0.99: N, M2 S8 J+ r2 }. M
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的; c1 Y% t8 I% H6 B% f6 h) `: X: h
    3 q7 J4 d$ o/ P' I# o1 t8 X0 U" e: a! }
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    ! F3 X+ I1 {% \8 }* C/ E5 A  i& f4 d& N
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ; m8 `1 r* I7 z. E' ^
    ) \) {( O& O9 H- q7 C. g神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出* g% L& L9 A  B! n3 v
    ) H6 x  w& H+ L- B
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))/ G( C- O! I; @4 Y/ u  _4 [

    ) k. `; t/ W1 e- {1 _同理. j2 W; O& g4 a/ l: B. y; q

    ) A5 U4 {1 _% g- Y& }9 g4 W) I神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    , \8 K+ R& a* h( h
    & B0 [, `1 W9 Y1 V接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式+ j# j/ r% l( ?  j; Y. F

    " Z9 r4 C; W4 O+ |0 R神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b20 a) Q- f4 L& ^" g' n
    ) z5 g0 G9 n' C, `7 l  H
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2$ y' n5 r7 t- A+ N; N: P  n

    7 [  q8 \3 @* W* G再经过非线性变换Sigmoid函数得到) m! X8 `, R% S7 W0 {
    , Y& C, q) J5 q$ Y
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))! X1 c9 l; Q; _/ \
    4 V: ~% |; t$ ?7 A6 ?) f* R
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 |2 S+ s+ K/ H0 W

    ! N. e0 ?9 Y  T% Y/ [我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    " j! t9 @! ^2 Q3 y% m7 x( r9 D8 c
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2! C8 C4 _  S5 ~4 p+ a

    * n5 d) G3 X1 C7 }3 B) H由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足7 z5 g& z- {; ?  }) u8 r9 ]' s# z" D
    : Q1 b7 u) F  d, Z* d: v
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    3 y: y( [! n! Z' p6 h3 z8 r5 @5 z8 q6 y% ^2 Y- u7 |- H
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    ; V; ~" \- a: h6 ~. J/ G% M0 ?" Z  D0 `  E0 a, _' v
    依次求解代求参数/ b6 b& }! ~6 O4 L5 j  C
    * S, r% A3 \1 w
    w1~w8,以及b1,b2$ X# \% z1 n: ~7 S8 Q
    7 O1 G2 \! P. K5 Q6 D

    8 e) h9 h/ x6 r! j& b& w+ [) B8 B4 n' h, @+ G9 O; P
    损失值 (eo) 的偏导数
    ; d5 }( n. r+ m, ~3 q( n) _4 l  q% c
    / j0 b  p* i8 S! E' ?# g再更新该参数,更新公式为4 V& V8 B5 o1 o+ @7 Y7 H
    & Y- S* a" j. O6 m3 o9 r9 `
    参数_new=参数-学习率*偏导(eo,参数)
    ( G- _0 \( R( D/ y: V* I* Q随后进入下一轮学习$ k& v0 o6 X% D
    ' t, y7 m' E+ L) V, O
    终止条件(满足其中一个即可停止训练)
    - u2 e7 {& s' |3 O: P3 m/ D  }6 I: S" J8 m
    1.学习次数达到上限
    & |' o6 S% @/ y3 ^3 i, Q
    ) c+ V$ _: l! k( e' ~3 n# N2.损失值达到可容忍的范围5 v# n7 u0 C2 }

    6 _9 n  X3 S' p导数+ [8 o2 l! J. t- ]$ i& ~
    f(x)=1/(1+e^(-x))的导数是
    / d' f7 i0 b$ e7 v7 ~f'(x)=f(x)*(1-f(x))' f$ ]# q$ a5 {! I- r0 n9 Q
    源码9 V. K' O' b4 T+ b0 b9 @
    import math
      u" p' z" q$ w- A/ a
    - E7 r6 w2 F. I( n( f4 x#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    3 T0 X9 }0 ]: B( b7 S  t) [#网址中图片有误,请看我博文上的图片/ w5 S# ~. Q3 g1 p3 E
    " o1 B8 D1 }( C) ~7 s5 k) a2 W: z! y
    #输入层
    $ l- n1 S& S+ R4 C% |0 Ri1=0.053 [" i: c' A+ H7 e6 Y4 n9 {
    i2=0.1
    : z1 I" i# _  u- m. W#权值参数1 E) U/ p* G* X0 {
    w1=0.15
    ( H* a% ^) R2 I/ \( A7 c5 H: Ww2=0.2( Q* N( Y5 ]! ]8 l* w) I, `7 C
    w3=0.25# ]; {3 C7 S' c5 o/ q6 Y
    w4=0.3
    : K# `7 Q& s& [6 U1 i4 ?2 bw5=0.44 v& Z& y; |% r. f( v
    w6=0.45: v! d  M+ j8 Q8 s2 C1 P% `+ f
    w7=0.5
    / M9 j7 }) m. Y! Uw8=0.55* _3 {: p2 ]9 G$ Y$ u6 ^+ b# m6 L$ C
    #输出层标记(即期望值)
    : v5 x# n5 D/ Xo1=0.01% {7 o* `5 Y/ y
    o2=0.99! t: b1 Q. ?6 W4 {2 _* [
    #偏置项参数$ q3 }/ l" [  F- L2 I
    b1=0.35
    $ P/ u. f0 Q$ N: ob2=0.6
    & f* m6 Y, @+ `+ _" z' M- l6 R2 K! m! w% P7 ]% E
    #学习率/ ^, d: H( l0 J' \" O; }3 [% I# h
    lr=0.5
    ( k- `- o/ s+ ]# c3 S#学习周期
      A$ S4 }9 ?, K5 o) Alt=0- X% [  O* }4 J# c1 X
    max_lt=10000
    / ^) B. t( l4 u( y$ T#允许误差7 \( |0 e( l3 ~  L
    eo_allow=1e-5
    , i5 L; g) J* ~1 J) \& D7 o) W' q  ]1 e7 p8 z3 t" c
    #线性转换
    5 \# }0 E" t/ [7 E0 `1 g& tdef linear(w_one,w_two,i_one,i_two,b):# [3 T/ s4 s: h+ t# m# C$ j
        return w_one*i_one+w_two*i_two+b) L+ k  ?1 D& M
    #非线性转换
    8 c4 @% `% Z/ Udef none_linear(i):0 q- _' m6 n0 l3 L% E" |+ ~; ?
        return 1.0/(1+math.exp(-i))
    0 a( [& ^: p' ]! T8 T: I  o% a6 D5 k( L
    ; _3 r- ?' H1 [8 Y& }6 ~8 ]4 ?& W* Tprint("训练开始")0 m2 |, z6 Z- Q1 w, {+ A
    #学习周期结束前一直学习
    ! v. z2 X+ E0 V6 o& fwhile lt<max_lt:: X8 z; B6 q7 }6 b8 d1 n0 G% j" y
        lt+=16 p1 p" X! u7 m; c
        #求h1和h2输入值
    6 f; b0 O& a+ B2 }1 q" l    hi1=linear(w1,w2,i1,i2,b1)* \6 s) L4 s' c: b
        hi2=linear(w3,w4,i1,i2,b1)% O' ^: ~# f& R5 _* h; d
        #求h1和h2输出值, s* n% [  Y5 b' @  w
        ho1=none_linear(hi1), |" M$ Q( S6 v: ]' O
        ho2=none_linear(hi2)( s4 z# Y' V" }- j% X
        #求o1和o2输入值  L( o* m  {/ K- ~4 j
        oi1=linear(w5,w6,ho1,ho2,b2)/ m  n' S% C/ s+ `
        oi2=linear(w7,w8,ho1,ho2,b2)' b0 a; a; Y% P  J# s' V8 o
        #求o1和o2输出值9 h/ r8 h2 ?' F6 ]
        oo1=none_linear(oi1), n/ W' E# ?4 M. a' y& m9 C  u" A$ Y
        oo2=none_linear(oi2)- v9 i8 q2 |; `; ]7 E
    & l- \4 z* y' \% ]) u8 G
        #求当前计算总误差
    4 F: M# Y1 z/ S5 D% \& Y. L/ b    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    4 i! p# M; n# S    print(f"第{lt}次训练,当前计算总误差={eo}")8 I; ~2 b  m: n% H: ?" @8 I
        #误差已经在允许范围,退出训练
    4 w; N0 U1 m: ~' t: \3 n( U    if eo<eo_allow:
    : [2 ]$ F9 D, g, T0 k) z- p        print("误差已经在允许范围,训练结束\n")9 R! N1 M& @& x8 `4 ~& B& L
            break: g" `' ]" A8 H/ {
        #偏导
    0 t# O8 ?+ R8 c' o" p' O    d_eo_oo1=oo1-o1$ S- W/ d; j+ [/ j1 A8 M  A
        d_eo_oo2=oo2-o23 B  r5 d" M" ~2 G; \
        d_oo1_oi1=oo1*(1-oo1)
      e; I7 _$ x9 J; q    d_oo2_oi2=oo2*(1-oo2)% P! f2 G5 O7 e
        d_eo_oi1=d_eo_oo1*d_oo1_oi1/ S' A' L. o: {0 G+ d
        d_eo_oi2=d_eo_oo2*d_oo2_oi2+ B- y7 r+ F( I8 K
        #求w5_new  N: T- t! e, k! \/ S
        d_oi1_w5=ho1
    ) ~# C6 k+ P- \$ g! Q4 f* U    d_eo_w5=d_eo_oi1*d_oi1_w5
    ' h7 R" o3 a  B. I# A9 Q: z, p1 `/ f$ S    w5_new=w5-lr*d_eo_w5
    1 }& S6 z! _: P* E. q' Y; V    #求w6_new+ O; R2 P/ z* U! \- ~# T
        d_oi1_w6=ho2  L) ]; ~" K% G) E2 s; n5 n
        d_eo_w6=d_eo_oi1*d_oi1_w6
    ( u( q) H0 W! P7 Z6 J    w6_new=w6-lr*d_eo_w6
    3 L& H. u: r  i2 ~    #求w7_new
    9 D& o7 m& }6 n2 X. g    d_oi2_w7=ho1
    $ a, V0 c  C& D# U, H1 u7 g    d_eo_w7=d_eo_oi2*d_oi2_w7
    5 E, s1 B2 M) e/ W5 x2 R$ h    w7_new=w7-lr*d_eo_w76 Z6 ?$ O5 G6 ?0 @  y
        #求w8_new0 _& M5 Z& C+ ?9 @- S5 R
        d_oi2_w8=ho2
    . n# V) i, \$ T) t    d_eo_w8=d_eo_oi2*d_oi2_w8
    , ?$ Q# i' S( d    w8_new=w8-lr*d_eo_w8% n9 Z% F7 O+ b5 S# N5 O
        #求b2_new2 B+ w/ r8 ?1 n5 R: }( C8 N- f8 K
        d_oi1_b2=1% h5 W1 x& W% R9 z+ _) x/ ^
        d_oi2_b2=1& U3 g3 g* I/ Z  ?6 U  S# B
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2; T. S2 A1 x0 c" ^+ V5 g/ W) P. \
        b2_new=b2-lr*d_eo_b2
    ! ^; J' D7 U4 `6 H$ G    d_oi1_ho1=w5: G9 e0 B" \* |/ ?6 Q% y3 r
        d_oi1_ho2=w6/ |9 Z8 J8 e/ i- ?
        d_oi2_ho1=w7& ^/ a& o. I, K" C( A
        d_oi2_ho2=w8
      u( ?8 n; K2 @- x7 x8 m    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    + U* @' W8 S* m    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    : u& A% U5 U/ ^$ l: n; A; r    d_ho1_hi1=ho1*(1-ho1); d; e& f! l3 Q5 o: o# L' f' r, q
        d_ho2_hi2=ho2*(1-ho2)7 O1 ~5 m; W1 e  E3 f2 ]5 P0 v
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    7 k5 h6 i( e) C- Z+ M    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    3 {' i+ k- g% f5 u$ ~! z/ L" h5 q: r    #求w1_new' n! p: z9 k* x( y' u0 H
        d_hi1_w1=i12 X7 _4 e3 Q6 {7 R, H6 q3 k
        d_eo_w1=d_eo_hi1*d_hi1_w1
    8 R8 ?8 L6 Q3 Y    w1_new=w1-lr*d_eo_w1/ s( r$ @. T1 @% v- x! v
        #求w2_new8 U3 K/ e4 |+ F, K2 ~: q  _
        d_hi1_w2=i2/ w" C, X# h6 _7 U  S  N6 ^# O
        d_eo_w2=d_eo_hi1*d_hi1_w2/ D, [+ @+ _+ S+ r# a, b% v
        w2_new=w2-lr*d_eo_w2' o5 @* U6 m5 l+ e% N# }
        #求w3_new+ ^: D4 F; ]7 Y6 Z; N' D3 y
        d_hi2_w3=i13 k* N5 |; Z( F$ |: S
        d_eo_w3=d_eo_hi2*d_hi2_w3
    6 q; K/ e' i* q3 ?, ?0 H+ P    w3_new=w3-lr*d_eo_w3
      c% G  n# p" ?4 Z6 i6 o8 m5 G    #求w4_new1 U3 ^7 W6 N! K7 F
        d_hi2_w4=i2- ?' f. Q9 u4 a7 P+ [" q
        d_eo_w4=d_eo_hi2*d_hi2_w4
    ' o: s  y4 U/ P8 ~' H! `4 V' l    w4_new=w4-lr*d_eo_w4
      ]# n7 y$ Y) U5 m: M& S% ^    #求b1_new8 E/ Z7 I/ C& r3 ?% U$ h1 R
        d_hi1_b1=1
    + W8 U: L+ T* C. M2 B    d_hi2_b1=1
    + G; R4 \: l' ~    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    # ]# g5 i7 a1 w! o/ P2 i# o0 W    b1_new=b1-lr*d_eo_b1
    + [7 C) j. t0 T" T! Z    #更新反向传播
    8 T3 J- G+ X( r# b) G) s/ T    w1=w1_new
    9 C5 h$ S  `$ O    w2=w2_new8 }. ^. N5 l7 m/ g& A( ?! _; c
        w3=w3_new8 q* E, V8 Y: k/ |: S
        w4=w4_new4 [' v. ]0 v1 u! |5 F) r! L
        b1=b1_new
    4 u4 `2 {# C0 s6 `7 ~    w5=w5_new& Y' w6 h# {+ i& x: N; R6 t: z
        w6=w6_new+ B0 R5 F3 o  H1 s
        w7=w7_new
    % z& D; |$ B5 X. I/ }0 P6 N    w8=w8_new
    ; J+ [: A" Q. k0 E  C* x) l& Q    b2=b2_new0 c2 M; Q% \/ e& s" }1 \
    print(f"当前计算总误差={eo}")" r, }6 W; A0 j5 a4 a
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")6 {+ X/ W6 `3 t, E6 E* Z- o% e
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! W5 x  B- ^4 e" ]+ G; r8 C6 @
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")7 p6 Y6 J5 @9 B5 c
    6 I9 C/ K& H+ R  t& x3 c. D
    结果9 x4 w" g4 _) w7 J4 {9 Q

    & r4 \6 a7 ], [7 a$ f- `% G/ ]( b% A) {0 S
    结语5 r  @' m4 J& }3 y0 j  U
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    : o$ \# j0 E  Z3 D! c
      f. R& O" s4 ^: l( ?补充0 B( v. j$ q6 ^6 q9 O( w
    程序中d_{a}_{b}格式的变量表示a对b偏导
    0 p" v. {, l3 ?% i————————————————
    * Y6 l! |% M7 p, h; g  c版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( d9 W& S, A7 h3 a) x  s原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    2 o5 l$ v  I2 N1 ?% A% C6 Z3 [: H- Q' W4 w: U2 c
    . y6 D/ I  H  ~4 ^6 C6 W. x: y
    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-4-22 07:06 , Processed in 0.360188 second(s), 51 queries .

    回顶部