QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2999|回复: 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实现). O, i3 `8 ]$ S% t5 s+ F( c5 b1 H

    . i% h9 ?8 E4 U背景1 [0 s* P+ q( P; S( Y
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    + ~+ Z6 B4 v, \: t
    ! b' L- v' V8 y0 E4 u+ }* A( o' E【神经网络分类算法原理详解】5 D- f& r6 ^* J
    7 N. i6 G! W& M8 L, t, n1 `4 }
    注意" U8 _3 V$ y! U* K2 s4 }
    站长提供的图片有点小问题,我们更正如下3 [9 o. M2 o% k1 g% U" \( o" |- q

    6 x. ^' @; A: \/ J; I7 w) W
    3 \7 V& L, t9 v) O# ^" \6 o# b1 t& H( a: N1 g3 p* f% x
    问题
    . }2 J' u  N8 b. b, e根据上图所示,我们有已知
    ! h( b# ]: J1 U$ T. v6 w4 l2 U
    6 c+ N3 ^. I' Q4 U0 b#输入层
    1 o% b0 K# k, m7 K5 F# Si1=0.05
    ) j; V5 m8 E6 G7 t& Bi2=0.1
    2 t7 z9 F! z- P$ F6 g4 T
    2 R; M! B- i1 G8 g1 |#输出层
    % o) n. b1 y# _( P8 }/ bo1=0.01- V% X: I6 m+ L# q' @9 D. c
    o2=0.99
    5 o) V4 G5 t  y4 ]' g* [3 [这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ; ~/ T5 O9 K( Q/ J6 p
    ) R# E: c; v6 I1 n4 j神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1! ]  L: ]" @+ S% y/ o3 S. Q0 ~
    7 B4 U6 Q2 w$ P! x+ G2 l# R) N2 Y
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1$ c: V. w1 L. ?! G! `$ k6 i5 X
    4 l. j9 ?# l5 x. t6 }; w
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    ; ?. o' x' U+ f: E* B4 e: t7 i* y
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    & J  z* ~) k* h1 N; W6 R3 b; ]6 e# f. Y
    同理  z6 b0 a, K5 U; H

    / H% ?/ W8 B7 y% s神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    . P# b& T- z4 u: h/ j
    ) x7 |% W* P6 `' i接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    6 u2 F+ k3 F- \0 L  p8 i. M
    8 U( m" I# A8 C% D1 `3 J神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    7 j5 Z/ c/ H" F( @: ^5 K
    & r+ Z7 ^9 y& U) H: V* W神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    & {7 ]: k0 J0 G  z$ q$ ?  b1 _: c* N) d: J, r% ^
    再经过非线性变换Sigmoid函数得到
    / j/ ?& P' S; `2 t& G8 _, y& Y2 A0 `% W& W
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))4 P' Y! ]5 }6 i

    ) Z/ T- Y% W  y7 m* j2 z4 w神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))" I8 N1 \* u) P' M/ C

    + X" W5 b; j! I3 j我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    , e2 ~1 u3 [1 ~; {! g9 J& M! l) L2 g- [/ m5 h  z/ @- b! w8 M0 E
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/25 ~2 g7 B4 i6 G5 p, n" w2 b

    0 R' t) G0 T5 c* S. Q3 ]2 J/ u由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足' _4 \' Q  R8 C8 T0 w
    + \2 g0 |, R4 p4 Q# M+ q
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次5 |/ n+ Y* n9 ^. Z
    ! G4 t* G8 |, {
    学习率 (learning_rate 简写为 lr)我们设定为0.5
      Y$ A- }, {. D! d2 h6 d! d! `' S% ?
    ( o% p8 h% \5 J+ k; G依次求解代求参数( d; m7 H/ h+ g, V" a( L2 D
    % v" d: z: a7 n, M) x; [8 ?9 x
    w1~w8,以及b1,b2
    % q; K  |8 M! w+ M9 @( f4 q. G( o6 c9 _; g
      J& j9 \  o" b* G9 g; H
    ' e; a5 N- ]% u+ d7 }; U/ u
    损失值 (eo) 的偏导数9 ?' i6 v/ f4 j1 ], e, ^7 }5 @% A
    9 ?: K4 D+ g" Y  ^' d( ?
    再更新该参数,更新公式为
    5 r2 j- i+ t7 D* N% ?* O# f: `
    ' U" g, X' A3 Q5 d参数_new=参数-学习率*偏导(eo,参数)3 {- v- A* U# d$ d' S  K* q7 I6 ?
    随后进入下一轮学习
    3 e+ c5 Y. O7 o. v% y& i" {' b6 C9 |0 S' I. D# ^4 Y) F1 g
    终止条件(满足其中一个即可停止训练)% ?: a" E/ N% e0 p  u

    6 C2 k. F: \) W  z( `" J+ q% l# V1.学习次数达到上限
    6 F$ r- e  ^) O2 H' [0 @( _, `: H. [( w2 @; `# r
    2.损失值达到可容忍的范围' s6 @. g% Z! j
    ! V* g( `. `! ~/ p* j& t
    导数
    0 i3 Y, A2 v7 k, j( `f(x)=1/(1+e^(-x))的导数是
    2 Y9 c/ p# x! F; E. M) \0 Df'(x)=f(x)*(1-f(x))' u7 m2 n: ?# K: w7 r- a8 n
    源码
    & }& r6 n0 g6 k% c# B& o  |" f% Jimport math
    4 h4 {0 h5 i0 V6 n
      E" u/ r. M, m8 w#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    8 O. P/ J/ b$ ^! g7 l0 Y2 a#网址中图片有误,请看我博文上的图片
    ' Z3 q5 p, I8 w8 o" G& L8 a3 ]2 c2 i% C
    #输入层- l2 j. K5 y! D7 S0 J3 w
    i1=0.059 @! t& C3 X2 P2 e9 U" U
    i2=0.1
    ! w* c6 B# ~6 b' d. ~( h) p! H* }#权值参数
      }4 R8 g$ G0 tw1=0.15
    & W/ E# C7 r9 B5 p( [w2=0.2
    # Y. W" F" @8 Hw3=0.25
    * `$ k8 j. A, Q' z: I( g- mw4=0.3
    / P9 Q6 H* y; S, x! ww5=0.4
    1 B- R4 H; E5 `5 Y- U' Z. o5 m( Nw6=0.45' p: \  d! \' d! p: R( H4 u
    w7=0.5
    - L5 C+ g- j$ V* p* F, a: jw8=0.55% m6 N6 ?# t' x; U. D8 c( {
    #输出层标记(即期望值)
    % x- i- e2 b; k# U# D$ b6 {, F0 |o1=0.01; }, Z5 w& B& K' ?' u" O2 Y
    o2=0.99
    # ~# N( c. `: Z2 j* G#偏置项参数/ i! }3 M9 y" n  o, f( k
    b1=0.35
    3 A+ V8 o! w5 r* }- jb2=0.6* V4 C/ C1 ?- D& q0 M- y! e

    ! J5 A. N0 a' n- Q, i#学习率
    . ~5 `) v  |/ @, p  ylr=0.5
    ; C1 G4 i& ]. \2 g7 k' d. u#学习周期
    4 [4 G7 d* g* h% R7 m) v& {) klt=0; y4 D8 H8 U% C2 f: r% K) K
    max_lt=10000& n( f( B, `: X" n
    #允许误差+ h. d' G- M! N
    eo_allow=1e-5
    3 x* H9 \! |1 a, V
    5 C" h1 x  y7 ]$ w. g#线性转换  w- T$ V1 ~( o% h* D1 _
    def linear(w_one,w_two,i_one,i_two,b):
    0 o6 c: D7 F7 G    return w_one*i_one+w_two*i_two+b' Z: x- f2 X9 q3 B1 ^
    #非线性转换
    5 ?$ D- [( D' ]( udef none_linear(i):  @% H0 I1 f$ n) Q  Q8 W1 ]
        return 1.0/(1+math.exp(-i))* v: }' M$ U+ v( @0 X! y& J

    7 c, Q5 S) S+ d2 Kprint("训练开始")
    # B) ]/ O* q5 j5 v2 y8 z$ Z#学习周期结束前一直学习
    : E$ T5 w4 s& c5 V* R5 E( iwhile lt<max_lt:
    - r% _) }2 O2 L- `    lt+=18 z% T% ]/ ]7 i  x) p. u6 K1 }) R. }4 R
        #求h1和h2输入值" N0 V8 M. ^$ x5 B
        hi1=linear(w1,w2,i1,i2,b1)( J) l" p' s0 p( W- O9 y3 o- |$ ?2 w  N
        hi2=linear(w3,w4,i1,i2,b1)3 g1 ]5 t) ]4 D7 b% G) p
        #求h1和h2输出值
    1 u' \" y3 G8 y% ~" N3 f    ho1=none_linear(hi1)+ v1 ]  J1 m% ~2 K/ C. X
        ho2=none_linear(hi2)( T% |9 R1 g$ x' j# A2 n& Y5 Y6 U
        #求o1和o2输入值
    & \) e7 z9 ]+ `' Z) K5 U  D    oi1=linear(w5,w6,ho1,ho2,b2)
    $ N) i6 p) B$ m, ^; {; O4 T    oi2=linear(w7,w8,ho1,ho2,b2)
    . l- G5 J3 Y# T( x$ M    #求o1和o2输出值& l) N# q- ~4 J0 I1 ~
        oo1=none_linear(oi1)
    $ o3 t& i. B7 B- C) m" d    oo2=none_linear(oi2)* G7 R+ M1 U: {' C9 y  f2 h

    3 ]) \6 V9 I" l9 H    #求当前计算总误差) v, P9 G) i4 f6 o
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    6 R: `9 |3 |5 M. n4 p! v% r7 E    print(f"第{lt}次训练,当前计算总误差={eo}")9 E( ]7 W: N, }# q3 o
        #误差已经在允许范围,退出训练
    / k+ ]  a, S; f$ N- l0 J    if eo<eo_allow:, ]5 F8 O# V0 ?3 U% E( ]% }* @" q
            print("误差已经在允许范围,训练结束\n")
    3 _5 ~. Y) P6 r! w% q; [        break- u* n* H" ~3 _5 y& }, R5 v
        #偏导
    $ ]6 ^1 j& y5 S    d_eo_oo1=oo1-o19 x" N9 ]. u7 g7 y
        d_eo_oo2=oo2-o2/ z4 [7 M# ~7 [; Q& v. b3 r  S. N
        d_oo1_oi1=oo1*(1-oo1)6 b. B' O- o- o# N
        d_oo2_oi2=oo2*(1-oo2): U! t( F5 U) L! D  \* D$ J
        d_eo_oi1=d_eo_oo1*d_oo1_oi12 v( Y& y$ C  e( {  r
        d_eo_oi2=d_eo_oo2*d_oo2_oi2! Y( N7 i3 C  x8 Q1 u  z( E
        #求w5_new+ o4 y9 A; a) J" w
        d_oi1_w5=ho1
    8 k% U+ R% G2 e    d_eo_w5=d_eo_oi1*d_oi1_w5
    5 [( W( D5 h' n( S2 n    w5_new=w5-lr*d_eo_w5
    : W5 g+ S8 u7 q" h. E" K: ~- u    #求w6_new
    % _$ j2 u. k' r) o$ S1 s: ~    d_oi1_w6=ho2
    & v2 |* ~% @5 Q8 f% y    d_eo_w6=d_eo_oi1*d_oi1_w6
    1 \5 x' O/ J  D& ~    w6_new=w6-lr*d_eo_w6
    ; W7 s/ t* ]/ S3 Q+ A' z9 X    #求w7_new
    " A: F; \" X: J0 b    d_oi2_w7=ho1
    & z- j8 F8 W! O+ k    d_eo_w7=d_eo_oi2*d_oi2_w7
    . ?) p& {( M& f; p. ]    w7_new=w7-lr*d_eo_w7- h, x) p0 |% }: n3 P9 s
        #求w8_new5 b. l$ E  V" {* [2 P( |. G- b
        d_oi2_w8=ho2
    ( E- W  o1 d) |# D# a* O& i4 ~    d_eo_w8=d_eo_oi2*d_oi2_w8- E1 A1 g% }% T2 Q3 L) t; R
        w8_new=w8-lr*d_eo_w8
    & g  ?+ `% q! o7 ^1 W  `    #求b2_new3 ^  ]$ E  L5 J) l2 J" f
        d_oi1_b2=1
    + M! j; ^/ d  E: i3 \    d_oi2_b2=1
    / C/ [4 g% @( p7 L' C) L    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ; E$ w0 r& w- _. ~9 `    b2_new=b2-lr*d_eo_b2
    # n% Q) H2 h2 Y5 o) U; i    d_oi1_ho1=w5
    ; X9 s" G4 ~  Q- |  Q" J    d_oi1_ho2=w6
    3 p! f8 I9 ?6 s: }$ n1 |    d_oi2_ho1=w7
      H3 m% S1 j% U    d_oi2_ho2=w8
    % r) {, k3 T/ F# M& [    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    + Q9 S/ p/ Z; v2 u3 v: ^- v    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    4 L' c. V% t2 h    d_ho1_hi1=ho1*(1-ho1)5 }! L: J+ @/ ^1 v
        d_ho2_hi2=ho2*(1-ho2)
    + L" A, K' p  ]% Y4 `    d_eo_hi1=d_eo_ho1*d_ho1_hi1  F0 V6 N8 @' D: ~8 \4 c
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    / `$ G' e4 v. X% j0 |' K9 L    #求w1_new
    4 P$ N( J8 _/ K" }$ Z8 P- X. ^    d_hi1_w1=i11 X5 e3 E* j3 n0 O4 {* K  G
        d_eo_w1=d_eo_hi1*d_hi1_w1, d6 D. b4 M" d. m7 M
        w1_new=w1-lr*d_eo_w1
    , L$ O% e5 ?1 ^  N8 V6 s    #求w2_new
    " z) `  O' e7 t  Z1 o    d_hi1_w2=i2# \& H9 _" s0 {% P
        d_eo_w2=d_eo_hi1*d_hi1_w2
    $ ^7 ~3 f* @0 I/ Z    w2_new=w2-lr*d_eo_w2, Y$ J/ k' Z& O; j2 v" M
        #求w3_new* b3 e% Y2 j8 f1 N  W
        d_hi2_w3=i13 ?7 ^- B* x9 x& s4 m
        d_eo_w3=d_eo_hi2*d_hi2_w3
    0 c( n+ A5 r/ ~; `; n    w3_new=w3-lr*d_eo_w3
    & A0 C1 H8 e6 p2 K' ]  R/ q    #求w4_new+ }/ a. H% ~' C
        d_hi2_w4=i2" r5 u" e  C  S  O4 r4 Q8 z/ C
        d_eo_w4=d_eo_hi2*d_hi2_w47 F/ r5 d# V# ?+ t- T1 m- n- j
        w4_new=w4-lr*d_eo_w4
    , b6 M8 d: s5 V( `! \. e    #求b1_new/ ?9 N/ r7 ~4 k5 v. h' x9 T! D; k
        d_hi1_b1=1
    # i6 a& C( N" j    d_hi2_b1=1# G4 ^7 C! c4 o2 x7 `8 b+ }. R
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1/ _( N) n) D* N% F
        b1_new=b1-lr*d_eo_b12 z6 Q% l: g* J- P3 s% \
        #更新反向传播% a( C2 B0 [6 ~8 T) K. |
        w1=w1_new3 F3 ?9 s9 ?) ]8 j; c/ r; L
        w2=w2_new. Y; I% m4 A9 z; z
        w3=w3_new; B5 x5 _3 P4 J3 S5 L5 H
        w4=w4_new2 s+ {- u; N! j: k) s& P8 _/ m' V
        b1=b1_new* V1 O# c0 \. J; `
        w5=w5_new
    ) j" d! Y% x* `7 o    w6=w6_new
    ' K* Q/ E5 [+ E8 |8 F    w7=w7_new
    . ]; ?, L4 J/ O4 T8 Y, J! U$ ]    w8=w8_new1 ^9 `- d) C2 ]% L% j9 F! S
        b2=b2_new
    # F9 {/ V) Z* H5 `! k3 U! _0 T  ^& gprint(f"当前计算总误差={eo}")9 f, B9 \! z% S
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    * T3 C& C* K1 k7 y& |+ @print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")2 P8 @( S' c' t$ K, A8 f
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    # h( C2 q0 w, r8 }. q* _( o
    5 I, b0 ~4 _1 g6 V0 }+ s结果4 ]) D4 \. K. r- \( z* h

    : ^" c/ A% D0 _) V6 c) k8 H$ p
    % E. A$ g( B% Y. f结语
    0 V# u$ v: }  C% g! x9 t可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。/ l: _# B" P8 O2 Q/ K

    6 [% U# z, Z, Z0 J" L8 C补充0 e/ m0 ]. ?# M- S3 @) W) u1 N
    程序中d_{a}_{b}格式的变量表示a对b偏导
    / U: S( \1 J- `& H3 |————————————————
    8 j* c. I$ r3 _0 w, S  ?4 {' k1 y版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( ?: y) r6 V; ~$ U; c% Y4 \原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954, }: A) f5 p; F$ u
    & W6 ~. J3 |5 ^( A( A

    6 {3 x/ n3 A0 v
    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-12 21:33 , Processed in 0.412157 second(s), 53 queries .

    回顶部