QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3030|回复: 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实现)
      c; A+ J3 r# Z; W7 p( N% x' E6 E7 y3 @& P. y) G* h( ?5 B$ \
    背景
    + ~, [8 H. G4 H/ o( D8 O, O9 a' j初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    * P) A& A7 C, ?  d1 S0 r: W& f/ |& Y9 \6 G2 a
    【神经网络分类算法原理详解】* O1 a8 }3 X* Y2 |* _% e
    9 u; n  n/ c3 n
    注意
    . P. C. O) ?' `4 W站长提供的图片有点小问题,我们更正如下2 p! L) S2 s" B) Y1 J+ ]

    " L& r: |7 E7 F% @( w  j4 y( m

    / W/ ~+ z& ?) e问题8 |( d0 i. `8 ~! b6 l  Y: @. K3 W
    根据上图所示,我们有已知
    / D2 W5 J9 o( K' O& a, K
    3 l; E% n4 r4 e' m/ Q#输入层
      e' S, _* O3 \! z. ^9 i+ gi1=0.05
    . J' \/ k. b8 q4 ^' p) I" y3 |i2=0.1" V# s1 _$ [- i0 T# Q" `( L

    4 g1 \$ v- @& ^( C6 h7 U1 A- _#输出层
    7 @7 j2 R7 D) N0 O$ J. `* `5 Xo1=0.01
    ! _( D8 {$ o0 B: G1 [! zo2=0.99" z+ M- i; C% C- c( V8 y
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ' U4 M; n5 d" I6 t8 B% h
    * G7 D4 I' y3 v神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1* F! `" q; i' _

    1 j6 o4 w0 Y, Q6 c- ?神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    , m- O2 b* I8 y; G) p( [2 V% Z- V: j
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出, ^5 X; I& q' W& D: f8 i: ?; j: ^

    : }) h5 f3 B; N! d; V神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))2 u" f1 T& l$ q8 l+ A6 O

    ) J5 U" A& o* u1 `8 ]同理
    4 Y  x2 \& m5 ~" ~1 }0 K" U: t$ @9 A8 H" U% e2 m' u( r
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    6 Y6 U8 u2 x; B% c$ W7 A2 _7 S
    5 H' _8 }, [8 R( X接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式; W( d9 R2 d0 g: m) J) v1 Y

    4 ^6 J- A( m  F( T1 _神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    9 A" ]! M' B, `( q& T( w, G
    / i6 j/ \' h: v神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    5 N* z2 c5 i. ~2 C: w' ]
    . u' v+ q3 x# z% ~; n0 X2 ~再经过非线性变换Sigmoid函数得到
    3 S7 ^7 l( y" h* }* l4 }! V3 O* F, e7 [3 E( M
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))8 _/ [) k$ b- G0 D! m) e
    * \9 N! ~; i& U& V4 ]* m+ F3 ]
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    9 U  q- Y- o6 Z7 F) O! F
    % Z7 b) [8 M7 H# _  j我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为. U% T0 m. U8 Y2 T8 `6 K" Z4 x
    9 U  Q& x; b6 L" a/ p$ M3 t
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/27 b, U- ]" L( |7 k% L& h6 q

    % _3 R8 l  U: l3 o) Q由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足; g% b( F4 S- F# W9 L. x
    * Y0 u5 e. |2 H
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次! b9 M7 x  b- q- t  D

    & K2 e7 }6 K# V6 ?4 ?学习率 (learning_rate 简写为 lr)我们设定为0.5& i7 c1 D' Z2 y4 \8 s* O
    0 k9 U( P: u' q5 e" ~: q
    依次求解代求参数
    + j* @% C  x  F$ K6 _0 u% |, \/ h2 X8 x/ U# _8 U0 y7 z2 \5 c
    w1~w8,以及b1,b2
    $ ~. J- u0 {# p8 K0 B' N* p0 N2 t# S; C1 G* o8 B' }( ~  r

    + {* O# X6 N/ Q& m4 g# `2 z% W4 O4 ^9 c5 i6 G
    损失值 (eo) 的偏导数
    7 _$ g5 x4 o; O. m3 g
    , {1 V$ r9 {4 d; Y4 Y- X再更新该参数,更新公式为! Y! _- G% ?! N: n
    5 j% k1 x* h7 J9 t( w) |! X5 g! G7 t
    参数_new=参数-学习率*偏导(eo,参数); P/ i7 }; V$ p
    随后进入下一轮学习; S& T# K/ [0 ?9 O. g
    & k6 w" o/ D7 a6 Q0 a8 M. d
    终止条件(满足其中一个即可停止训练)
    % s& {, g2 t) L* d7 d7 ?& O0 q2 x
    1.学习次数达到上限
      N0 \# I6 ^2 d# {5 e3 I0 V- [  Y0 X, c0 V* m7 w: ?
    2.损失值达到可容忍的范围
    + c; D( u# `# i' D! K1 V* D( |' n: }& W
    导数
    9 A1 O- F( B% I# [9 X! q- Of(x)=1/(1+e^(-x))的导数是2 T+ r8 T- h9 X" j
    f'(x)=f(x)*(1-f(x))
      g7 B! c2 ~  C! g源码2 i9 \8 G+ x/ z
    import math
    9 N' X8 s3 E& a6 Y5 _- P
    3 G' ?! q* `2 s; s, \  C* K#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    0 F) {- p3 ?0 Q  ^0 P3 K) `#网址中图片有误,请看我博文上的图片5 t  P$ T; g8 d; ?/ @: y4 \

    , U" d0 c1 x/ V5 r; q' _: X4 D1 E( Y#输入层
    % }: L; J8 Z6 Si1=0.05
    3 T) A) @# g) n& A3 M7 Ti2=0.1
    0 \7 K; _5 n, E% n#权值参数( l6 _3 ]/ c: v# i
    w1=0.15
    % Z, [) Q( e- T6 B- cw2=0.27 h! h& B+ k# _( S& o9 Q
    w3=0.25
    2 T* A" B6 v3 S5 A/ d" ?: qw4=0.3
    . ~0 b2 l) ~! f; E2 A& Bw5=0.4
    $ v* u: G2 o! F$ R$ jw6=0.451 G9 O: u$ Q6 Q! Y9 }  q5 s3 R
    w7=0.5/ g( F6 o" N4 _# c5 |
    w8=0.552 g# {6 B, D! v8 l$ x/ ]0 M
    #输出层标记(即期望值)! L+ s8 G8 m$ C' i- l) }- W3 S# U4 m
    o1=0.017 p: U* P/ p1 n8 ]/ e
    o2=0.99
    7 H  l7 E0 N/ ]4 l) p# N#偏置项参数7 v- a8 s3 S) |5 G; T- ~: x5 ?
    b1=0.350 X: B. d0 O* h
    b2=0.6
    1 [1 x8 F* S8 c) v8 j! Z- Q
    - l' I9 X, p3 V' q) j7 ^#学习率: h7 u5 O. t. T& |7 {' W
    lr=0.5
    - g8 j1 h& ~. K- n: z#学习周期8 E  T' m. K# s
    lt=0' U0 x4 H+ c7 a% H$ J2 D) t( I0 ]
    max_lt=100003 a2 n. ^  P5 o  _7 v
    #允许误差, n# ]( N- b$ e% ]$ C9 ~
    eo_allow=1e-57 W( Q2 P1 B5 G$ A" Q, s9 w8 H

    ; B) h( o7 @. j6 }9 R0 z( ~& X- H#线性转换
    4 h" p3 h4 g9 ndef linear(w_one,w_two,i_one,i_two,b):3 [: A, A) `0 S& W4 y" J
        return w_one*i_one+w_two*i_two+b- ]! I. ~- u& P9 F0 x0 r
    #非线性转换: e- T  @# z# D( O7 I# b) h  |' h9 ], V
    def none_linear(i):& o3 @- \. c: @# R
        return 1.0/(1+math.exp(-i))
    9 I5 l5 n6 N/ X# K# a! x. ]0 g% i5 ^% l
    print("训练开始")) p0 }' b/ ?; v2 s; Q, U; x% f
    #学习周期结束前一直学习
    / J$ w5 v* y; ^6 G6 ywhile lt<max_lt:# L/ z/ U) A+ g; t
        lt+=1
    / i* d2 J6 v0 v& Y9 A4 g- M    #求h1和h2输入值+ b0 K4 \+ K$ V
        hi1=linear(w1,w2,i1,i2,b1)
    & C+ h; |5 ]& u; p: S: r- F    hi2=linear(w3,w4,i1,i2,b1)! ^7 l1 g' \7 M2 S
        #求h1和h2输出值; p5 W" l6 b: Z3 l* X1 W
        ho1=none_linear(hi1)2 X2 h, q# t2 Z/ H
        ho2=none_linear(hi2)
    ; L% F* ]9 v2 D! }0 W    #求o1和o2输入值
    8 s  L9 b) b' [; Y1 P8 l% i    oi1=linear(w5,w6,ho1,ho2,b2)
    9 a" S. ?- r* I0 _3 Q    oi2=linear(w7,w8,ho1,ho2,b2)( ]$ h0 P' J0 k- f* N& I
        #求o1和o2输出值
    2 X! P) N9 W3 F  e    oo1=none_linear(oi1)
    4 o# O% B6 \8 n; D$ [    oo2=none_linear(oi2), c9 R( W: P8 m) F7 V3 B; u
      i  h' C7 h2 F/ {. U, P9 c
        #求当前计算总误差! K, S4 |4 S% ?4 M) C" V
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2- e! i; U4 P3 z+ n
        print(f"第{lt}次训练,当前计算总误差={eo}")
    & @: d7 V2 L4 n% t- Y9 ~    #误差已经在允许范围,退出训练
    6 u. A; r' K! v, ?: @    if eo<eo_allow:
    - e/ P1 s& a* K5 u        print("误差已经在允许范围,训练结束\n")* S' R+ h8 z; V( g: f
            break
    6 Z6 g, ?* C, a0 }- E    #偏导- j% c3 G! D8 m; S
        d_eo_oo1=oo1-o1
    $ r1 ?6 j" s  [% C    d_eo_oo2=oo2-o2
    1 U; [1 [0 b; }- l2 a0 W    d_oo1_oi1=oo1*(1-oo1)$ l3 w. P0 O# a' D% r4 i  \, w
        d_oo2_oi2=oo2*(1-oo2)+ g% E( G2 e1 q. o( q
        d_eo_oi1=d_eo_oo1*d_oo1_oi16 v: G  `; X3 V1 y4 @0 D
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    9 z% W) B% S, G4 }0 m2 v  [    #求w5_new4 N3 d; H# R) \! z& V% D, m+ `
        d_oi1_w5=ho1" h% k; ?8 P& `3 |
        d_eo_w5=d_eo_oi1*d_oi1_w5
    ; i% k) n# r/ O    w5_new=w5-lr*d_eo_w57 k- u, n( G6 }
        #求w6_new
    ; f; [* s9 d/ |- I5 P* q3 Y    d_oi1_w6=ho2
    + c) z$ n- ?$ d3 h7 M) V    d_eo_w6=d_eo_oi1*d_oi1_w6
    # D' m; w+ P% f. j    w6_new=w6-lr*d_eo_w6; {+ C2 T6 e. E& ]7 G5 z
        #求w7_new
    3 T3 J6 R* y6 d% h* T& Z    d_oi2_w7=ho1( O( S! F8 T) r) f) z1 e
        d_eo_w7=d_eo_oi2*d_oi2_w7
    6 J' d/ y  h5 _; C  P    w7_new=w7-lr*d_eo_w7) Y# }2 H. W% W& l# S( f2 Y9 @
        #求w8_new& C& b& u6 X* J* c
        d_oi2_w8=ho2
    & i2 V/ L: r% @% p- l, `# U1 y    d_eo_w8=d_eo_oi2*d_oi2_w82 i, ]5 x5 f+ X; Q. f
        w8_new=w8-lr*d_eo_w8# A' ^  W9 K9 V- t* `$ ?
        #求b2_new
    * \' D" `/ d9 X3 W  ]# T6 n    d_oi1_b2=1; C  J# q( Z2 N0 Q: [) ^/ Y# O
        d_oi2_b2=16 s9 @: s- }7 \, V0 g: Y7 p7 C
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    3 {& v7 e* v+ o9 B( V' R    b2_new=b2-lr*d_eo_b2. Q7 V4 F9 @+ {8 |2 l& J
        d_oi1_ho1=w59 [' g  U( v0 ^% D
        d_oi1_ho2=w6$ T- B8 k+ }* p8 u, N& ?
        d_oi2_ho1=w70 s, S; d% S) W
        d_oi2_ho2=w8! x8 {, T+ x, x3 k% H5 V$ z! h% T
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1& e6 B( p1 X) P- q( ]: `
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    ( I* ~$ t  M( M7 J    d_ho1_hi1=ho1*(1-ho1)
    * \) k2 Y6 U- U& o: ]# e* N    d_ho2_hi2=ho2*(1-ho2): ~3 C2 B+ I$ Y+ `5 ~
        d_eo_hi1=d_eo_ho1*d_ho1_hi1+ r2 v' f) W6 ?: K. ^/ S
        d_eo_hi2=d_eo_ho2*d_ho2_hi2: [# o  e+ h" F- [7 t" N( s) s7 L: ~: x# v
        #求w1_new6 U/ z# V' Q3 ~
        d_hi1_w1=i1
      ]$ |5 T( m5 t$ r    d_eo_w1=d_eo_hi1*d_hi1_w1
    6 f% b1 M, A6 k: c    w1_new=w1-lr*d_eo_w1# @8 k9 N, o( r) U
        #求w2_new
    ; v9 j7 {; B4 {" }2 S    d_hi1_w2=i2/ N$ N; L/ F. y; b- ~+ g3 f
        d_eo_w2=d_eo_hi1*d_hi1_w2
    1 L, B" \4 b: ~: K8 s    w2_new=w2-lr*d_eo_w2
    6 h6 p* N7 q3 a) n, ?( E- s7 X    #求w3_new
    2 |- D0 o0 O1 V7 z/ w; {    d_hi2_w3=i1, Z  J  V* c+ f7 C
        d_eo_w3=d_eo_hi2*d_hi2_w3' s5 `+ s* N* ]# v7 P
        w3_new=w3-lr*d_eo_w3
    - ?+ \0 T9 @4 F0 [& q# i    #求w4_new
    0 m! R" g5 H. P6 f5 A8 o    d_hi2_w4=i26 E7 }6 _! Y: M4 g* W
        d_eo_w4=d_eo_hi2*d_hi2_w4! @: k! d9 d* X" j8 B" h. Z( ?6 [+ W
        w4_new=w4-lr*d_eo_w4
    + r7 M# \* z1 V$ V) W" u/ z    #求b1_new% m4 @+ K0 l- U( Y) S! i3 s
        d_hi1_b1=1* B# u+ c" W/ O( V
        d_hi2_b1=1( |, {, y/ _1 p/ X
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1+ R; h* O4 s" \% O; U- C
        b1_new=b1-lr*d_eo_b13 [& e4 H7 ]' c1 ?3 N6 [+ G. l  c
        #更新反向传播2 q1 e8 C8 B" F6 |; {
        w1=w1_new) l8 o$ r* ^0 q1 G7 ~! Z
        w2=w2_new
    ! Y- I& o2 l. C9 g6 N' u( H    w3=w3_new
    0 i- \% f& k9 n' U9 [9 h    w4=w4_new- M' G$ O* s) y; S5 X+ n0 u& k7 s
        b1=b1_new
    : \: \4 p5 A) N4 i    w5=w5_new/ d! {9 F/ R# v$ O/ ~
        w6=w6_new
    " }1 T7 p1 \4 {9 N+ G' U    w7=w7_new
    7 n! |- k8 }9 L  _% R    w8=w8_new
    ! `" Y1 G2 m+ E    b2=b2_new
      z8 g2 R1 c7 e2 }+ e! c1 c0 Xprint(f"当前计算总误差={eo}")
    ) h5 q# k  W' @7 n* Lprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")3 x- O1 a  W" [3 E) F1 c4 h0 [
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    & x8 B/ o; u' @3 \- b; Nprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) q  r/ M( |3 Z% h4 H+ G# N
    ) N! x1 r' ]( K  s8 d
    结果7 D1 |- S4 @$ z: {1 C  C, [
    : f! X- W& t$ ], r2 W
    6 H: C5 b  E5 m+ S; r/ j) Q
    结语
    # {0 A: I! w4 |7 F3 Y) p可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    ) V2 R! A" M9 ]: |1 @- \# o. c+ o1 h1 ~( R3 s
    补充; N0 l' p; l( N. b: O2 a2 k8 k
    程序中d_{a}_{b}格式的变量表示a对b偏导& T/ Y* T! E" u
    ————————————————, m# a! E! {; O  A* z1 j1 M
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % V7 v3 U& j9 q; q& g: E' k原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954/ b% r1 |- j' K1 G+ j7 y& \

    8 m, z3 R' m6 \; [7 W+ \+ {3 {- M  D
    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-12 07:40 , Processed in 0.406611 second(s), 55 queries .

    回顶部