QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3035|回复: 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实现)/ T' V3 b  n0 t
    & D5 s# D: ~+ c2 F! U
    背景8 P) }+ @  F/ n# M) h) W; ^
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下0 N- B  T" Y/ O3 g8 P

    $ g! u2 H7 s3 \" w7 A% m【神经网络分类算法原理详解】
    4 n0 S3 R0 u- k; \. p* P6 h( i1 ?4 {1 f6 q! m8 I
    注意
    5 V8 X# H3 j0 x- f站长提供的图片有点小问题,我们更正如下
    $ z0 ^( n( F6 m$ s+ o' F; A, U: k  N6 U7 B

    8 I' [, j. {- ?: {! A4 P+ f; T+ d5 v  q( ]; S
    问题( b6 q# D* |/ |; m1 `
    根据上图所示,我们有已知4 [( ?$ b0 f$ x. W' J/ ~" a4 e

    - P8 c1 g3 v  E  K, A# A3 f0 }' ]#输入层
    1 D& H1 {0 g# c' J' c' m' Ui1=0.05- T5 u; j! h& c8 ^
    i2=0.1
    - x6 }9 e* h# U1 A- ~
    4 {) J" u2 r  ~#输出层
    4 d6 L0 Z; x3 bo1=0.01. P; E: T' G" L' J) W+ r
    o2=0.99
    8 o3 @6 i! @5 u9 w# k这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    : |2 s9 N2 n( `; _( W; X2 y6 t! e3 m
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    * b0 i* g' d3 L: m+ q* V: I( Q( v: _+ _6 K+ G1 K. ]5 i- \
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    " A/ S3 x- c! `5 p7 C+ }5 u$ F& }* L0 I0 i4 r7 c
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出; g  c9 [0 s1 z1 N5 r7 [' U2 h; E
    $ h8 ^$ C4 Y+ K5 N( b( h; E9 X
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    / p" A- ^) F- V& v4 t8 o$ `: O8 ?8 j) X/ E
    同理$ X# H' ^; A" L1 m8 k% B( i
    ) I: d) f! W) f- u7 p: n
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))& `' {: m3 K+ q$ J: f3 M. G8 u7 Q. M
    7 n1 J; J$ j, C$ q
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式, j# t5 _! ]# \1 }) H

    " E% _4 h0 Q3 y/ P# R# O  m神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    # \2 E4 J7 ]/ ^
    & O. p" I+ ]: ^3 `* z# {+ E神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2- a: G& e+ t1 E

    8 r! r1 z  D1 C( i: Y- p8 w再经过非线性变换Sigmoid函数得到
    9 R. s. ?- Y/ M$ ?/ X- W1 R* O- E+ i" l
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), w. K- }" o4 Z( S8 |8 C, j) [4 U
    ) w. E& o2 g  B$ z
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))4 g, z! z% p- Y; r0 ?

    6 g$ k# r) x: X& Q' P) _我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为& L; ]; p8 ]5 e" p1 I4 E& N
    0 a! T9 {2 M1 }
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/23 V5 L+ o7 U0 P( l' ^
    6 T7 a, p! p/ h; n- d4 x  X: z
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足' u" W% p7 ^* I, _, E8 a5 `
    3 e$ ^" B2 _( v( Y/ \9 L
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    - j5 k# Q3 R( q& {' e( f" |5 D: q  r) y% B! j
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    6 ~# |, i- X. i9 s9 L% h6 X$ ~6 \# S9 P0 Z# y( @0 a& M
    依次求解代求参数4 W; O/ J- U' _4 F1 s8 c9 C* H; O

    6 C! H6 t; I$ L6 d- n6 ew1~w8,以及b1,b2
    1 r3 j: l" F/ r+ o) v3 y% ~2 `' |0 q/ a' u2 l5 n% O/ P

    4 Y# e0 l# r0 C2 `
    1 z9 N4 t" w7 n损失值 (eo) 的偏导数( d7 q0 \6 T+ @. R  q" w
    9 W  e3 X+ b% W9 V6 l
    再更新该参数,更新公式为+ \' ]; t" A5 k
    ! B) W  F5 o! P6 q, W
    参数_new=参数-学习率*偏导(eo,参数)# P$ |4 H0 f: {+ M" @% _' J, j
    随后进入下一轮学习- ?8 L& ?* n; i8 D; c/ D5 k
    ) M1 i0 S0 `, \
    终止条件(满足其中一个即可停止训练). ~$ E' F- y  Q! O% B6 F4 k0 _: P
    ! W" v6 A, D( w, t$ r* _
    1.学习次数达到上限
    4 t* ~/ `( N' j+ n  _+ d6 j& k4 ]) j4 u& O
    2.损失值达到可容忍的范围9 J' _3 x+ F8 Q! q; L# N

    ' L; A8 h9 ^) W9 o, d导数
    7 M+ K; h! |9 O: ~9 J$ \f(x)=1/(1+e^(-x))的导数是
    - Y$ [$ z( Y; ?' Tf'(x)=f(x)*(1-f(x))# H3 o0 `% d- g% r( [+ T  s1 C/ Z
    源码. ]0 \9 v$ V5 `; A' l! h
    import math
    / R5 |/ W1 o8 f, r9 B( S- c$ y0 t" ?& L0 ]) D2 B" x, t
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    1 D; c( ~* w3 X. o& }) }5 w+ r$ k#网址中图片有误,请看我博文上的图片
    ' c8 O! `( `1 T. e
    / s+ o% ^  g; ^' Z& N) y#输入层5 u. I$ n. f: z. q7 M5 F5 M
    i1=0.055 ?4 a2 ]4 O# D2 o& d0 ]1 o
    i2=0.1
    : j0 U3 U# N1 E* ^; D% l8 R6 T! X1 ^: p#权值参数$ e0 r7 h. \/ A( O* U( U8 n! @
    w1=0.152 L& R% z0 H3 {. d8 J4 A7 N: o
    w2=0.21 Z# Q6 x! T8 q
    w3=0.25* U# E) _8 H! v0 H/ @
    w4=0.3
    4 R# r/ Y- W+ U9 M* r& Bw5=0.4
    4 _, A6 h; M. Q; \1 vw6=0.45
    5 B/ C/ K! T2 A% L) I. B7 U6 nw7=0.5$ r) m% o" ]; d& I
    w8=0.55( S, m7 o  E/ W' ]5 Q
    #输出层标记(即期望值)/ n9 @+ I$ S( Z) a4 t' T' \  Y% o! ^
    o1=0.01
    0 j7 q9 I# v- ?' _o2=0.99
    2 Q( N5 k4 _& T  k#偏置项参数
    2 E1 T( A% ?' }- L& |. kb1=0.35
    1 W* _$ [* P( R& Jb2=0.6
    3 E5 i- H- y/ Q1 j8 e* y7 q4 P; I9 @& @7 K
    #学习率
    / s& E8 V, Q: S% u) V0 X: ~  Alr=0.5
    0 n. g: C2 R" D* }/ B& y. h3 ^+ _8 W#学习周期
    ) X3 N* D2 V) K; b% alt=09 }( r3 E. h8 B1 V) F3 n' R& \
    max_lt=10000! E' m& r0 b* x9 P4 J  h
    #允许误差, W* |# b& v2 D
    eo_allow=1e-58 Z1 A& M- J5 q) B! z: o

    " X+ r$ ]1 _/ S5 ^#线性转换3 m" c/ o: o5 k  U6 O
    def linear(w_one,w_two,i_one,i_two,b):
    . `0 A" k; `/ K9 U7 p% e4 c0 r) u    return w_one*i_one+w_two*i_two+b
    8 _( X; O4 P6 S9 H' D9 j* n6 z0 T#非线性转换. V' l6 Z7 B. ~7 }$ h. c9 G, W
    def none_linear(i):: {, t2 E, y, L, w7 R) V
        return 1.0/(1+math.exp(-i))3 i. |7 U  l4 d! z7 ~$ E
    ) a6 _$ q9 p# b5 G; A- k
    print("训练开始")8 P# O4 U9 |; l  f* A
    #学习周期结束前一直学习1 ~7 S- C. j7 k2 H$ n" }
    while lt<max_lt:
    3 X1 [) J) d/ l$ t* {# d2 ~) x+ i; J3 I    lt+=1
    : F2 K" J8 B, t) [    #求h1和h2输入值
    8 E3 Y% H  P+ A" C    hi1=linear(w1,w2,i1,i2,b1)
    9 _, }! H: {( [    hi2=linear(w3,w4,i1,i2,b1)
    ; |& E+ J$ C0 S9 a& u% o    #求h1和h2输出值
    ; U) b0 Q% u5 \! [% l/ d    ho1=none_linear(hi1)
    2 y& E: r+ g& e6 Z    ho2=none_linear(hi2)
    8 [& u' l; @2 p/ }    #求o1和o2输入值
    ; K  H* |% H' }    oi1=linear(w5,w6,ho1,ho2,b2)
    6 f4 @8 I! O0 a  R  u2 U, p    oi2=linear(w7,w8,ho1,ho2,b2)
    & Y$ U  t$ f( s" `5 n0 }) Y. B2 c  ?) h    #求o1和o2输出值
    , T  `' r1 \3 E    oo1=none_linear(oi1)/ i" }7 a( `- _9 q- a
        oo2=none_linear(oi2)
    1 c$ _3 I2 |% t6 a  y$ y. k' w
    ; l8 O( d/ _  A2 w0 A! d    #求当前计算总误差
    6 ?7 Q0 T0 x, {! q    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    9 W5 Z+ j3 j" H& `9 ?$ b    print(f"第{lt}次训练,当前计算总误差={eo}")) ~$ l3 [2 q+ P  R0 }5 O3 i7 [
        #误差已经在允许范围,退出训练
    . y/ s4 k/ U# q! M, A; ]    if eo<eo_allow:
    + l" f9 R$ b: b7 }  V& ~        print("误差已经在允许范围,训练结束\n")  R% O: g) c0 D5 \  Y' F
            break
    ; C) `* q' f! x" ]    #偏导
    * W3 N1 Q7 u/ P: `    d_eo_oo1=oo1-o17 Q. L. l) ^. J" V$ `
        d_eo_oo2=oo2-o2# `' o1 T2 ^9 x( W3 z$ |
        d_oo1_oi1=oo1*(1-oo1)  R9 r( H0 @. X# Z# w4 Y
        d_oo2_oi2=oo2*(1-oo2)* Q  L( S2 }% n+ e2 C8 e! n; [6 c
        d_eo_oi1=d_eo_oo1*d_oo1_oi1: i8 D' G& F6 n
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    2 c. s9 e2 W; Q7 }    #求w5_new2 u+ e& x& n  T2 j6 x
        d_oi1_w5=ho18 s8 ~9 {, w% l0 e) ^( e
        d_eo_w5=d_eo_oi1*d_oi1_w5
    ; H& l5 U. P9 F% O+ n$ u- y    w5_new=w5-lr*d_eo_w5
    ( C2 c& e5 l" E4 O. f    #求w6_new
    3 f; q9 M! J. O    d_oi1_w6=ho24 G0 k" ^6 T  i. ?! w( z/ E$ J, s
        d_eo_w6=d_eo_oi1*d_oi1_w6
    2 V" A* U5 E8 z+ U- ^    w6_new=w6-lr*d_eo_w6$ L& x( h7 K+ S: L% w  i7 }! G
        #求w7_new. H& g) z4 j" q. c
        d_oi2_w7=ho1
    4 L0 f# G& w5 I: O2 v8 O    d_eo_w7=d_eo_oi2*d_oi2_w7
    / R7 @4 H0 P* \+ v& v    w7_new=w7-lr*d_eo_w7
      v3 C" m* n, {+ }. W    #求w8_new
    , h" ^! V# m4 X  C    d_oi2_w8=ho2! c' O* y* ^6 d7 P$ H( ^
        d_eo_w8=d_eo_oi2*d_oi2_w8: ?5 R2 T/ S/ A1 R
        w8_new=w8-lr*d_eo_w8
    5 F* ?' c! e, Q- R  ^% r  V* j: E    #求b2_new' F/ c3 _2 N6 S( F$ Y6 V$ n
        d_oi1_b2=1
    9 U, \6 D' h8 s( D2 I. {5 s    d_oi2_b2=1
    . N: ]) \2 V! _/ g! v    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    : w: y5 b% r" U6 P% S8 [    b2_new=b2-lr*d_eo_b2+ a. c- s: W) s% i/ N
        d_oi1_ho1=w5
    ) p6 j+ X. \$ \) ~    d_oi1_ho2=w6
    $ _, Y$ G( ^. L$ |    d_oi2_ho1=w79 `: N- T6 b# q6 w) u$ w/ u/ H
        d_oi2_ho2=w84 H% O* Q$ {+ P) q& p, w! k
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    0 U& I5 [  ]8 ?$ g3 R* W    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. K6 w, e/ ~" }
        d_ho1_hi1=ho1*(1-ho1)
    ; @8 _8 p! z. L# h" D4 k$ Y: A    d_ho2_hi2=ho2*(1-ho2)2 s! I6 }9 n2 k- d- _) U
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    8 }: [  j/ f( m/ O    d_eo_hi2=d_eo_ho2*d_ho2_hi20 A5 F& L8 |, C( i
        #求w1_new
    / k& P, ]( y2 P$ H. t7 p7 g% l. |    d_hi1_w1=i1
    0 [" T# A( l& I. Z    d_eo_w1=d_eo_hi1*d_hi1_w1. C' `5 K- P+ s9 G4 j. n% E0 I
        w1_new=w1-lr*d_eo_w1$ g; k8 _. O: v; F- \
        #求w2_new: n# _: Q  W! L6 J5 j* X
        d_hi1_w2=i2* |1 g5 ]( x- x) C  N; H2 P% P0 k
        d_eo_w2=d_eo_hi1*d_hi1_w2
    : A4 R) D- Y* w) ]    w2_new=w2-lr*d_eo_w2: `* `* s' x9 Y9 H$ b0 X
        #求w3_new4 z$ a. T" A/ O- H( E) F3 `
        d_hi2_w3=i1
    " h* c% [0 \) J! C9 i0 c: T; n    d_eo_w3=d_eo_hi2*d_hi2_w3
    # o2 P) T$ [( d! _) x. l" T    w3_new=w3-lr*d_eo_w3
    4 H( X( ^/ D2 Y( P    #求w4_new% }/ g8 Q; H4 X8 U$ \3 O* I9 F  Z
        d_hi2_w4=i29 ^7 d- m. t; m8 `! s% b4 T( p
        d_eo_w4=d_eo_hi2*d_hi2_w49 w4 O- z9 I6 b* T* _
        w4_new=w4-lr*d_eo_w4# f6 B# R- X! i4 u/ N0 s. Z8 G
        #求b1_new( m+ u: H, O" J5 I' s! ?1 o" K
        d_hi1_b1=11 `2 m8 r, I* t& Q4 s+ N, b; C  V
        d_hi2_b1=1
    & [, {! M* Z: W    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    1 q" A; G; V/ p- F/ u; {! g, r    b1_new=b1-lr*d_eo_b1. T9 b" V. |. G/ K- y
        #更新反向传播2 X( B+ U# {1 x% I1 y4 ^& W! f
        w1=w1_new6 [3 Y# F1 G4 T: \
        w2=w2_new' \! a* ?  ^* }. k
        w3=w3_new4 c8 P8 S9 _" a; D8 x. h+ L8 v
        w4=w4_new# N% X! W, C* k: G: U5 l9 k  P
        b1=b1_new
    6 Q$ n, r0 V+ \8 Y5 w$ a    w5=w5_new5 g: i- b7 H0 H1 Z
        w6=w6_new
    $ R& o4 f2 `8 a    w7=w7_new
    + I0 O$ P$ l) g  j3 o( E  v    w8=w8_new
    3 K8 @0 S8 M. w8 r, o+ B    b2=b2_new
    8 \/ U# m9 n8 P& Wprint(f"当前计算总误差={eo}")) {. L, I$ _( @+ z9 {
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    $ u* s9 m) ~! U9 |, u9 q) qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    * H% [5 A( m4 @; f3 n: }- t0 T' Pprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    & u5 c; p% u8 T1 X4 o! Y4 L, ]1 x. M: B, \% j  f. T' p9 _: r# x( a0 Y
    结果' T; I0 j- f4 ?( J6 L3 r# P
    8 s4 Z- [3 y; J- j

    # m3 W6 @+ ]* P  r' i7 o9 c结语- o- z5 ]" S: c. s8 N( ~# v
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    3 ?3 @0 I; l; ]1 N/ M; N* Z
    2 s/ p% M3 F+ r& h& T补充1 F% c" z# Z3 j/ V. ^4 ]; T2 s# r
    程序中d_{a}_{b}格式的变量表示a对b偏导4 _& N. Y- y, u# G: K3 S3 V  o
    ————————————————  q9 a0 v3 e! l9 V
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      |8 a: J6 Y4 ^原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    . j" d+ I0 U: r+ [5 T$ g0 ^
    7 k" `' L- H, o- i. P# l1 }8 Q+ m2 ]% _7 B7 h" T4 J
    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-6-14 16:59 , Processed in 0.409586 second(s), 51 queries .

    回顶部