QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3111|回复: 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实现)
    2 P3 h2 Z1 m( e3 J. G2 v9 Q- f( x7 S! A1 ]1 F% ]
    背景
    ' s  j' c- R: g* P7 \" a初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    3 T3 T5 n) z* w/ V) O
    * w% d/ x, B& H【神经网络分类算法原理详解】
    3 k1 F! s1 S  m
    % q+ V# M& |. X  j3 \% S注意) u6 g, v# K# ?7 y! H
    站长提供的图片有点小问题,我们更正如下
    5 h$ L! B1 R' l. z3 }2 @4 [7 c' ^; h3 _# X8 A
    - G1 \9 u, J0 _; h  ]2 |

    % N9 B2 p- ?+ B4 E# O: M4 _3 i问题2 N; x$ |# Z8 f6 T4 A
    根据上图所示,我们有已知2 ]; O; H. G+ j6 K& O
    4 ]2 y; J( J) |* g6 w4 W
    #输入层
    4 S; i# |1 O/ v$ l) z5 k0 x2 Xi1=0.05; e  r' [4 }0 J6 x
    i2=0.1
    ( w1 c8 d" f( s/ F
    ' S7 j+ w# @" W9 E' ]#输出层6 N0 ^0 g( K! S" f' `& |8 C# I4 \2 N$ N
    o1=0.01
    4 e2 W; ^+ M. x; S% [o2=0.99
    & Q0 a. b, U3 @4 }! W这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    . h' j$ q2 M0 I% {, I1 X, U+ ~1 `; h7 J+ _9 ?
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1* q! b4 |8 S; g: k9 W
    . L  }. z0 ^2 r  S; v
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    , d0 N; l' Y( J  A6 A) q# s* p+ m+ Z* Z
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出6 ^6 Y; M( {/ k( i) @$ e
    " [) J6 K! U0 s9 L5 W6 h* S
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)): U3 P+ U1 O0 z
    5 [  W# Y) k  Q8 H; A
    同理
    ( a. L: j1 m) q
    3 @  R" @7 R* ?4 g: ]神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))9 v; S8 Z9 P0 p' X

    $ u- G3 K# k" H  n9 a! p接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    : g0 w4 b' D; O/ L" m! {
    4 m7 T1 a# t. _, {神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b23 _$ J8 ^( K& [( U0 _# }

    * a+ Z$ Y2 w6 T% p; z神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2$ U+ J: V7 A% Y$ ]7 k8 h

    - v: d" i5 h* P. V再经过非线性变换Sigmoid函数得到! ?4 V( r0 k0 H0 {( m* T# m
      J) F( Q+ \8 e6 J
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    ) S; o' X$ P- G; X! P7 o& m" A5 l6 b( ~. f& X% M8 ?- t8 J
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    6 ^- a7 F2 N& O
    - D' I" O1 d+ ~4 {+ e: Q/ d我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为3 o. l# y0 m  |9 k0 d/ ?- V

    6 U' z- s( V5 r. |0 b损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2: S  {; h) s0 B( h3 F$ ~
    2 e9 T$ P4 Q% q  U
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    , B, a* T/ o6 a3 ?, |' I' C3 Y6 G* g9 c) t
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    ! p. s/ |9 _% U) r) B
    ; J5 l) d" W( D4 {) O学习率 (learning_rate 简写为 lr)我们设定为0.5. v7 P& e0 [$ Y
    2 x3 s' d2 U1 D. M. F0 e
    依次求解代求参数4 u/ ~! W4 n# Y4 d% F0 N8 R

    9 n9 z& I# C4 v# {! q- cw1~w8,以及b1,b2
    ) y8 q' R$ r, g% K+ V; w1 ~) @) G. y0 a- \: A6 Q$ [* {" m
    跟2 t" C: |0 v# y- P, t
    9 H8 R* z  u( h- O- q
    损失值 (eo) 的偏导数! r# S9 F' M2 ^

    ; h8 M% k0 [& \# J( ?7 `# `再更新该参数,更新公式为4 x! `+ b5 \" Y+ D2 [5 w3 f
    2 I* m' v; N, @9 y7 @6 u2 |( \
    参数_new=参数-学习率*偏导(eo,参数)
    " Q! X& P8 w+ g随后进入下一轮学习
    8 l9 s1 ?2 S5 V( M, D8 N& P
    ) i; f0 c$ l& W8 D  F$ ?# `  O+ V终止条件(满足其中一个即可停止训练)- N8 S, V' f, b. `1 O

      k: u# E5 {/ i5 B  f6 O: d; l1.学习次数达到上限  t' J+ |& \0 `& C* ~

    3 l. x( t" z; [  M2.损失值达到可容忍的范围
    ' x; }& W2 K$ r, n) z1 J# q$ v8 N5 q- d0 @/ S$ i8 W- N) O
    导数
    ( q' n9 Y) a4 P' r# T& V: ef(x)=1/(1+e^(-x))的导数是
    5 e5 e5 p# v- @$ C  y+ Tf'(x)=f(x)*(1-f(x))
    & \8 U' b/ K- J0 Z8 ?源码+ L6 B9 v" ]; D
    import math! }* @$ y- R+ y1 F: z& z  Z

    / k; B4 L# z5 K$ q" a- J#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】# @  Q* j4 j1 S+ P% [3 l) L7 w
    #网址中图片有误,请看我博文上的图片
    ' e  T4 H! m4 G: L7 P, `, y0 N% O- q" D( l! {+ M% w+ `
    #输入层
    6 P! B7 n* ~0 d! B  Ci1=0.055 A; u0 ?9 w" A# z! C" n& G
    i2=0.1
    . ]- S( w  m/ w, e' G0 A#权值参数; |6 S2 R" `$ H
    w1=0.15: }( h1 }! \* o1 t- v
    w2=0.29 V( b! V9 U) N+ W0 O) u  G$ n
    w3=0.25
    / h$ F( D* U3 Q; Ww4=0.3
    : R  ^1 l& X7 [, g- vw5=0.4
    : |1 I- Q: `  Y. hw6=0.45
    $ J9 Z8 ~# s7 i3 r3 d1 Mw7=0.5
    " w: M8 o3 o( [( {w8=0.552 g5 X. g  Y5 h3 J' P
    #输出层标记(即期望值)
    4 [! r/ M7 T# K' o, fo1=0.01+ A- }$ w( e6 `/ m4 b$ p4 e" m% v* W5 N0 Q
    o2=0.99
    5 d3 j$ I" h0 q; k4 M! H8 Y#偏置项参数8 z/ _5 \9 K/ i  P) ~+ h1 E, q
    b1=0.35
    + A% w, h& X0 X  g; d) ib2=0.6: g' o+ L7 K! m; G1 J8 q3 S
    ' B. m( Z9 Z6 z
    #学习率% n: n" B9 H+ i4 H" [
    lr=0.5
    & N3 Q2 X; E& T9 Y/ V' v2 w#学习周期
    ) P5 u8 J# f( U! n- Q" z9 Q! R5 Flt=0
      j6 w# d1 m% P0 L3 S9 cmax_lt=10000
    : T, T" f5 \# A#允许误差* R- L  A  ?$ B% m& ]# G
    eo_allow=1e-5' M# Y/ z* Y7 ]( J
    ! `: d# u' {8 V. K7 D
    #线性转换) d, i4 T0 X+ y9 A! {; ?- F
    def linear(w_one,w_two,i_one,i_two,b):. B% U: t, b5 O2 ?; X2 ]9 R
        return w_one*i_one+w_two*i_two+b, Y6 {, G8 m8 v' [
    #非线性转换
    ! v: P( Q3 ^3 J6 _7 `" R1 {- O4 pdef none_linear(i):
    1 |9 K: @+ X) l1 }    return 1.0/(1+math.exp(-i))' i% p9 b, z% B1 O) |( _
    % ]6 B0 F8 d" m) e
    print("训练开始")0 z& p1 O) x# P1 `6 d; k
    #学习周期结束前一直学习
    . \0 L8 X8 m- @while lt<max_lt:
    ; o) \/ u2 m3 P    lt+=1! s4 I9 i  f0 }) `
        #求h1和h2输入值
    % y7 x9 ~1 ^4 Q: c; Q9 ], a/ m    hi1=linear(w1,w2,i1,i2,b1)
    % }* h+ B) a, v3 B( G    hi2=linear(w3,w4,i1,i2,b1)
    4 Y! @% c& P' `( m: S    #求h1和h2输出值) L4 A5 y. D1 J* H
        ho1=none_linear(hi1)9 S% A. G. _) f# u
        ho2=none_linear(hi2)3 {/ @: w& ~2 h8 G  x" q, D' m
        #求o1和o2输入值
    * O& W: O( e% A0 W2 L    oi1=linear(w5,w6,ho1,ho2,b2)( t- F( _: N% z6 V" n3 U$ t
        oi2=linear(w7,w8,ho1,ho2,b2)0 ]/ A; D) s6 I% D8 s/ n
        #求o1和o2输出值
    ! \0 ?6 `3 @2 y    oo1=none_linear(oi1)! s: q( `" z' O2 w* w5 x% F
        oo2=none_linear(oi2)
    5 h+ D1 P3 O/ Z& q- k$ c
    . _8 O2 U3 L$ R: _$ v0 `    #求当前计算总误差- F9 g5 J$ p4 i% z
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    " n* L) G! D6 ~8 @! e5 `3 k( T    print(f"第{lt}次训练,当前计算总误差={eo}")
    " u; I) t6 z' @/ a    #误差已经在允许范围,退出训练2 o, z. f1 j/ l; R
        if eo<eo_allow:
    3 r5 z+ Q8 @. N3 [( M% m4 N        print("误差已经在允许范围,训练结束\n")8 h2 ?& n4 @% q5 s3 @
            break9 B/ q8 i5 r. K5 O: w6 c* c
        #偏导
    7 i# h  z/ N9 @. t9 @0 n    d_eo_oo1=oo1-o1
    & c) M! H6 q: z; Q) r    d_eo_oo2=oo2-o2$ M+ R0 O; d9 T! `1 I
        d_oo1_oi1=oo1*(1-oo1)
    1 `, V5 `) H' |$ U+ Y    d_oo2_oi2=oo2*(1-oo2)
    ) o3 K) B( D4 |, n! J    d_eo_oi1=d_eo_oo1*d_oo1_oi1& k# V" m1 Y2 f" n$ _- p5 z+ t! s# @
        d_eo_oi2=d_eo_oo2*d_oo2_oi2% w2 c  s) i: l  `/ a
        #求w5_new) b% O, t4 G4 f- _
        d_oi1_w5=ho17 n/ y, J. u/ G/ m& o! _( ]
        d_eo_w5=d_eo_oi1*d_oi1_w5+ E: t# z4 U7 N
        w5_new=w5-lr*d_eo_w5/ j0 k% U& w4 z2 m$ X5 M& E
        #求w6_new
    . E- a4 d) e. F1 O( }    d_oi1_w6=ho29 S! K% Y- @  H, j3 F
        d_eo_w6=d_eo_oi1*d_oi1_w6
    8 I( |& Y, J* G1 N" H) K; z    w6_new=w6-lr*d_eo_w61 x9 ~$ V/ N, v" s. s3 z
        #求w7_new" S- `( z' S8 u2 Y* _# r# B1 y+ n
        d_oi2_w7=ho1
    , b/ v6 C) u: L9 o$ x$ Q    d_eo_w7=d_eo_oi2*d_oi2_w7
    # ~, h& \0 H9 r* T& P! x# V. z    w7_new=w7-lr*d_eo_w7- O& r# }) X& U1 f- T! m# M
        #求w8_new
    1 F1 S7 |2 |% H  l) ]% J$ @+ X  M* u& d    d_oi2_w8=ho2
    . y# O% k1 `- R: p; n$ ], L$ i    d_eo_w8=d_eo_oi2*d_oi2_w8# k' |5 A( z/ k* D7 C2 n; B2 l3 k+ ^
        w8_new=w8-lr*d_eo_w8
    ( n) B$ b6 S" [# S    #求b2_new
    0 l8 ]6 K+ M, s0 J) s8 ?1 d    d_oi1_b2=18 G( k6 u2 {) X  C
        d_oi2_b2=19 ?+ G# G% ~$ r, e
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2. o& D  G6 m, p/ K& A. h
        b2_new=b2-lr*d_eo_b2; C. \- M4 E' r/ P* K: x+ J
        d_oi1_ho1=w5% }2 T" v; h: s# X
        d_oi1_ho2=w67 C1 [% y& }6 X$ W2 j+ w: u" Q
        d_oi2_ho1=w7
    3 f4 @7 u2 G) N; [/ B: }    d_oi2_ho2=w8
    : a' `3 n+ U) g% B1 s    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1& H# H  b% _9 e# o! f9 l6 g" J& c0 w2 V
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    ) W) \. w$ i: C! o    d_ho1_hi1=ho1*(1-ho1)
    $ N! J' x( L/ c8 b    d_ho2_hi2=ho2*(1-ho2): L' B! v: ?. H7 Z
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    * [+ i3 T5 x7 C0 S: w. @    d_eo_hi2=d_eo_ho2*d_ho2_hi27 E2 B+ {% W1 D; H" z
        #求w1_new* `0 q5 a1 L9 d% {# _
        d_hi1_w1=i1
    / H" J) \  I7 [9 |    d_eo_w1=d_eo_hi1*d_hi1_w1
    6 @" u) J* n2 w2 f7 w7 z1 g2 X7 g    w1_new=w1-lr*d_eo_w1
    * F0 K, G6 N" B% y( V2 Q9 D    #求w2_new; [, F! W. G# ^0 X/ k: {2 ?1 ~" t3 E
        d_hi1_w2=i2
    ! k+ d& v2 x1 \6 ], Z    d_eo_w2=d_eo_hi1*d_hi1_w2) {& s4 p. E; J5 i
        w2_new=w2-lr*d_eo_w2
    ( B8 n% Z, Z7 H% R6 e    #求w3_new9 q* i3 w6 |8 O
        d_hi2_w3=i1  b$ L6 g8 \! ]5 ^$ T" R# r) k1 I
        d_eo_w3=d_eo_hi2*d_hi2_w3
    ' \1 n5 H  N: \* r  @: \    w3_new=w3-lr*d_eo_w3
    ( y7 @) h2 A3 `! e! y# G( H4 F" W    #求w4_new/ _' l" W+ B! i) P
        d_hi2_w4=i2
    , d' L+ ]- G1 g    d_eo_w4=d_eo_hi2*d_hi2_w42 \! _% F; W) X2 t+ t
        w4_new=w4-lr*d_eo_w4+ q3 R/ ^# M# `: b1 N  O
        #求b1_new3 E* e# _' _0 ~1 x% A6 g6 F: `
        d_hi1_b1=1
    6 m( F% y& I7 U2 u+ W0 I  a    d_hi2_b1=1
    4 e! y6 K) w, I# b$ U" z' g    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1" x, `' O8 D2 G2 J. m
        b1_new=b1-lr*d_eo_b1
    . [- X  ^  W7 j; g0 w6 [    #更新反向传播1 _$ |+ {: M- L8 y6 @  w
        w1=w1_new. ^9 Q' Q( _: S# ^- Y
        w2=w2_new5 I0 S; Y9 X6 r9 z  T6 M. s
        w3=w3_new
    % h8 Y( J  w. x) D3 _/ \    w4=w4_new
    2 v/ ^- @! \2 e* e5 V+ G  k5 i6 n    b1=b1_new" H& K+ K' V7 f% \" \6 ?3 Z
        w5=w5_new
    ; g; A! Q, ]6 ?% r1 `/ I# m2 H( D    w6=w6_new
    7 x0 S* v+ c, d$ p+ C9 c1 U- n% o    w7=w7_new
    # a% Q& e: l! W" l    w8=w8_new0 S* X* ^' k* F9 S5 O: I- V6 S
        b2=b2_new* C) Y* D9 K9 j0 O) b. d: m
    print(f"当前计算总误差={eo}")4 x2 n% G2 m7 U/ k  i; u: a
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    6 d0 c* W; c( O% _print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    * r3 q9 ?$ `* R9 a. K' Uprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")4 O0 ~$ c6 N  L# d; M

    1 ^. S( c. l8 f. E4 ~8 d6 A3 D- G结果& k! Y& m' g8 t: h0 I9 f4 z: b
    # w' W: s. b" r2 w' Z4 r5 f
    , O) o$ D5 d# Y8 Y8 i
    结语3 E: A7 c! |8 u+ o) i$ V
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 J7 X& z" @- b3 V

    9 _6 p' d1 I3 Y8 p# _( ]4 t: S补充' w% c1 F) C. L4 q9 [' K* s( ]
    程序中d_{a}_{b}格式的变量表示a对b偏导
    $ {$ m' K2 N. H————————————————7 c: U( @7 @. G& m, y2 h6 p5 N( v7 H; ?
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 s  j. ?% e8 ^+ R5 A9 m
    原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679543 A0 k8 ~3 ~1 T7 S$ C5 W

    $ O& ]' Y4 l! j* M# Z! O$ h6 I* ~9 v" J8 _+ Q7 E
    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-10-11 06:54 , Processed in 0.351761 second(s), 51 queries .

    回顶部