QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3000|回复: 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实现)
    + {6 z2 d, r. C( {  n& F
      m1 {* c8 v& B! H4 J, x7 [( E背景
    9 X' l) B% ]' f1 l初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    4 W! l9 d/ U. |" b' y& q
    ! I- E+ G# H: H. H7 G【神经网络分类算法原理详解】6 Z, I# @4 n! \2 |/ k. `' T
    5 v2 m# P# r8 d4 ~' C+ |
    注意
    % _: K# {, @5 z& f4 M站长提供的图片有点小问题,我们更正如下3 U# C% |( O- c; L& l

    * X# @7 D( ]) t% |) n8 L- c! o+ P' b1 |9 F$ f

    4 F  o4 H, Q- T: C  @9 S问题
    8 ?1 N8 j: O5 O# a根据上图所示,我们有已知
    ; O9 A$ {6 R+ m' u" _; ^' D0 K- Y- y, ?' m; M& l, ^4 E
    #输入层
    6 ~4 ~: D4 c# r. h9 N7 N/ si1=0.059 Y. m4 c; Q6 c& d
    i2=0.1
    2 T9 H: a% k( W7 ~: T9 U3 f, k$ y4 q+ x! d. L
    #输出层' x+ h  `7 \) u) _* e1 w# G
    o1=0.013 M; y# m. W, V8 O! A+ f
    o2=0.99; j, C) Q) l2 M
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的/ Z/ _/ z. f' x# u8 |
    0 ], Q. |6 U$ ^4 q( T
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    3 |( k' F7 V& U3 ?; ]1 `* v- I1 V
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    : i4 q# V: P+ W5 W* ]- k: X8 [: D$ ]
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出: S% E) g6 k: W6 e, r9 `

    . W3 ]* F! B( [, g) B- x5 n神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))3 X) o8 N# f/ s" L6 K$ [% y9 Z

    ; L$ W$ g# C9 |0 r" ^  P同理
    : O- t  j% E! u6 f6 a4 G/ m. a3 P: k
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))! r$ f, T6 ~& C& Z7 k

    * D$ `3 r5 v0 |3 }& t0 B4 p3 ?2 B接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式  Z9 h* p4 @. ?$ O9 p, X
    " t! m% Q5 ]3 P/ s) @$ B
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    0 C# R4 \9 N4 k9 L. C2 m% D2 G! J9 O, x  Y# @
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2  ~7 b. c. E! o+ P$ [
    ) w- d9 n$ x" ^# b& f
    再经过非线性变换Sigmoid函数得到
    ) `/ s1 V" F& e5 U) |- |/ K( z+ E% b5 I
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    # m6 }$ H* u$ P2 s) S8 e  h; P: L0 U; l+ R( J
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))) [1 ^+ Z, J8 `3 }9 [
    0 Z$ Q' @! w  \+ t6 o
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    3 J% V$ l: ?/ @* F1 R! |& h9 C
    0 b5 _! o8 l2 Q损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2- n( @1 [) [# ~7 m/ ^

    : Q& C1 c3 v$ ]% E( U由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足0 I: \8 P4 |3 e

    7 W0 G  w. c. u3 m$ C学习次数 (learning_time 简写为 lt)我们限定最大为10000次+ I8 u, c7 O% X9 X6 j# v

    " m+ L8 G5 [( M学习率 (learning_rate 简写为 lr)我们设定为0.5
    & G+ {5 Y8 b# O2 T2 k) k& b3 @
    0 b5 Z  v* `8 z1 @6 `7 p9 x# u( O依次求解代求参数
    5 Y% `# `* u2 s; ]9 e- b! F: x7 i7 `- R9 H# w3 ^8 N4 ^
    w1~w8,以及b1,b2
    ( c6 w. ?6 P6 E' o: E- z
    5 t7 e# t4 _" E! _2 k: J$ v* p5 ]2 U6 `* N5 C) Q  @- C+ u
    1 h+ \5 \. I& u4 p% w% ?0 ~/ B
    损失值 (eo) 的偏导数
    & G8 |; O9 ~  G- Q6 l" H! y* i# {, K9 o* s% m) E7 o
    再更新该参数,更新公式为8 m$ i" L1 M% M9 ^
    * z' a& ?' L. @( v; g
    参数_new=参数-学习率*偏导(eo,参数)  F- R1 Q' Z( c$ A% }; U# U8 O8 g9 W; @
    随后进入下一轮学习) B3 U2 W* X" a0 O+ T

    % C9 f/ D% w, |3 G终止条件(满足其中一个即可停止训练)
    2 m' F1 n# Z% R/ [
    3 h$ c& {/ Q+ b4 Q7 r1.学习次数达到上限
    & a3 M2 B3 f9 @3 G$ U! t, C1 C2 ]( m% [* q4 m: c
    2.损失值达到可容忍的范围, a8 B% v; d/ L) r  m9 v

    7 z: M, G9 j6 s% K5 \' f导数9 r4 ?$ M( X3 u
    f(x)=1/(1+e^(-x))的导数是' O* p7 P( {/ R. Y5 W
    f'(x)=f(x)*(1-f(x))
    1 P4 ]9 H: y) n7 K" H4 C" o源码, P1 I6 v( r4 c% a
    import math
    & T. Z; N5 P$ i4 b: K+ }. ?3 D8 V8 m
    * m1 K% K4 E2 N1 a#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    $ H! ?4 y6 ~7 m+ U$ b#网址中图片有误,请看我博文上的图片) A$ z, C5 i% g2 M+ z
    , b5 ~' ~4 B6 U; m" A
    #输入层
    + T! c1 {8 T; {, ]1 ji1=0.05: I$ h+ w5 H+ }: V' y% a  }
    i2=0.1
    $ Q7 E2 O" \% x4 j; ?0 X#权值参数
    ) D1 E) c# f9 q7 k+ Q% \- i0 p. H; Yw1=0.15) Q" f- G1 |7 O+ N! r, \3 r3 W
    w2=0.2: P" x: V2 K. r1 v8 k
    w3=0.25/ y7 o- j+ g5 B3 u
    w4=0.3
    $ x3 w7 {& g: u2 C: bw5=0.4  O9 U7 X, n% i5 n5 o' u
    w6=0.45
    0 ?9 o6 q  \$ \" {8 X5 sw7=0.5
    $ v5 S4 ]& P! u6 q' qw8=0.55
    $ d7 y, y$ E) G. B/ t% Q. d#输出层标记(即期望值). l+ R/ H6 C$ y8 L1 P
    o1=0.01
    # d: L$ E5 c) W, u: [& {o2=0.99
    2 L5 }2 D5 X) {, S& b% R#偏置项参数
    ! r" ?% D. I( d/ m; n; z% N9 M& p1 Db1=0.35
    7 u/ M- b& a4 n9 |# db2=0.6( l0 k6 c) U9 b, p, N5 L$ c; ?/ u

    4 w& W2 f; s8 j#学习率
    . u) i  {% A: ^) Y+ J0 l" G& Tlr=0.50 _& V# T( w7 K4 }. _, J
    #学习周期
    " z- F# D4 M( f! }+ z7 klt=0! w) O2 L6 O' F5 H9 X
    max_lt=100002 A: ]2 p! {9 C1 M% o" X$ M/ t
    #允许误差" G' f, e# y, u8 P# ^0 N
    eo_allow=1e-5
    , D/ ]# A/ A" \
    8 v8 R: J- g6 d! }- _#线性转换4 g$ Z% z9 e) Y8 X8 H
    def linear(w_one,w_two,i_one,i_two,b):  Z3 B+ Z6 D8 b
        return w_one*i_one+w_two*i_two+b
    9 I) h: _) N8 B( m9 G#非线性转换
    & D4 j3 B% V. _def none_linear(i):6 M7 P; \  A2 S# ~6 P2 l, i; g
        return 1.0/(1+math.exp(-i))
    0 \. j8 H% Y/ k0 R( W8 C: b; o
    7 k' P/ _/ t( u, Z: P, ?" yprint("训练开始")& ~0 a( K6 b# O+ v
    #学习周期结束前一直学习
    ( O4 f) X' l5 [1 Rwhile lt<max_lt:# c9 ~" q5 A" @' m5 {4 e
        lt+=1
    - N0 h' g% w$ F    #求h1和h2输入值
    6 \% h. ^, G: z2 z    hi1=linear(w1,w2,i1,i2,b1)6 U% ?6 q6 x$ e) b: c
        hi2=linear(w3,w4,i1,i2,b1)6 C$ g9 h$ v1 |& ~. c
        #求h1和h2输出值8 w) M1 W7 e6 I, N4 z; u  ]& p8 \/ S
        ho1=none_linear(hi1)
    4 r% H% n( _% h; g3 `- D) n    ho2=none_linear(hi2)! m, N5 x& Q+ Q* i: E
        #求o1和o2输入值7 H" T8 ]+ \) e! r- M
        oi1=linear(w5,w6,ho1,ho2,b2)# T' L9 w1 f" J( _
        oi2=linear(w7,w8,ho1,ho2,b2)
    1 a: t* W$ `0 p' v/ ]    #求o1和o2输出值5 J$ A9 B3 N9 Y& @* E9 K& n
        oo1=none_linear(oi1)- f8 I1 U' r1 Y* V' ]# G/ z$ f0 K
        oo2=none_linear(oi2)# s0 X; @+ f2 f  i6 q' O- s

    5 i: T( ?" M: e: Z+ L4 Q    #求当前计算总误差3 f6 q7 u6 o% M" @! @: y
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2; x# Q% h% k+ g9 x
        print(f"第{lt}次训练,当前计算总误差={eo}")3 [/ U/ z/ G: j! M& ^" O
        #误差已经在允许范围,退出训练" @+ u- K. J# l% Y
        if eo<eo_allow:
    9 K9 p: y, Y4 |+ f$ V- o        print("误差已经在允许范围,训练结束\n")
    / ^  a% u6 B9 l4 |4 G        break6 k& v: L; d  W8 I8 ?
        #偏导# h) [0 r& x& X8 _( a
        d_eo_oo1=oo1-o1: j3 Z/ D/ o# @) N" m5 M6 y! m
        d_eo_oo2=oo2-o2
    ( \) B: `% ~9 C5 s' d    d_oo1_oi1=oo1*(1-oo1)2 \! n# O2 ]. F/ L' Q) s
        d_oo2_oi2=oo2*(1-oo2)5 \8 W) F$ L' }: [2 n; N
        d_eo_oi1=d_eo_oo1*d_oo1_oi1& x, P+ t2 G* x3 i5 M
        d_eo_oi2=d_eo_oo2*d_oo2_oi21 |' e' L: v  A( s
        #求w5_new
    3 }9 U- E2 X9 x9 B    d_oi1_w5=ho1
    - e+ M( a$ K7 B* z    d_eo_w5=d_eo_oi1*d_oi1_w5
    2 Z; W9 J! Q0 e    w5_new=w5-lr*d_eo_w57 {; s" Y5 G, ]2 D. |% j
        #求w6_new2 D+ T8 S* ?! D
        d_oi1_w6=ho2
    # A( O' F, u. K' Z7 F5 a5 F+ s: j& P    d_eo_w6=d_eo_oi1*d_oi1_w6
    - r; b5 s0 M- T9 i    w6_new=w6-lr*d_eo_w6! I0 D. \9 L& J) n: U, z. s
        #求w7_new" c$ I& ]! t/ O4 M9 P" K! e  W9 W
        d_oi2_w7=ho1, D+ C: S9 r$ A0 S6 {
        d_eo_w7=d_eo_oi2*d_oi2_w7
    ; k. K( a3 Z: o+ @" @% [5 T! f    w7_new=w7-lr*d_eo_w7# |7 `' [& Z# W8 w
        #求w8_new6 w: s6 Q. S( B" M9 W$ m2 ^: d
        d_oi2_w8=ho2
    , I  @, D% R/ {! R    d_eo_w8=d_eo_oi2*d_oi2_w8
    " x: W6 B" F( p' Z7 Z9 l    w8_new=w8-lr*d_eo_w8' Q5 |! \/ y. j2 L: [# a
        #求b2_new- j1 S8 s8 z/ u% t3 [; I4 p1 h7 o
        d_oi1_b2=1/ _4 ?& u# i4 b; k$ t# h" r
        d_oi2_b2=1
    ) o- z. j% L, k$ w& M1 B    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    : C3 D. t# ^. F- x  v4 _+ X    b2_new=b2-lr*d_eo_b2
    0 X5 n: \8 e: y2 O9 P/ p9 G( R$ U    d_oi1_ho1=w5
    2 @1 F) T  [1 R& v0 R! l- l5 [0 y    d_oi1_ho2=w6# C) n2 f. x* Q
        d_oi2_ho1=w7
    : g2 e6 g% x4 Z    d_oi2_ho2=w8
    ! l/ T# ]" k; I! O    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1" u8 o- ?) a! ^# g/ R) w0 H
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    6 }& a: I( n; E+ ?/ r3 G3 W5 }# g) w    d_ho1_hi1=ho1*(1-ho1)+ X. f' t' x" x/ U9 z
        d_ho2_hi2=ho2*(1-ho2)& u2 u$ P1 B7 i7 q! y% T, n/ F
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
      W4 ?1 M. i, R: i5 T    d_eo_hi2=d_eo_ho2*d_ho2_hi24 E0 y6 ]3 b& `2 J
        #求w1_new. G9 Y9 r; |* l! N. e# _3 l* p
        d_hi1_w1=i15 f8 @  G1 ^8 j& d+ ^5 c0 n& [. Y
        d_eo_w1=d_eo_hi1*d_hi1_w1
    ( g& h# p# R9 s    w1_new=w1-lr*d_eo_w11 ^7 F: A$ T0 {0 ?4 s8 i
        #求w2_new  t- @. C$ i; U3 S& o( Q& c9 _
        d_hi1_w2=i25 A# d/ U. P& b6 E/ v  g
        d_eo_w2=d_eo_hi1*d_hi1_w2, T# H' [' c' z3 Z0 ?
        w2_new=w2-lr*d_eo_w2, T4 K) F# h+ D9 m( {5 h& N) Q0 n" m
        #求w3_new1 R: w) d- F2 J9 q' e
        d_hi2_w3=i1
    6 B- z2 j! U/ d8 o    d_eo_w3=d_eo_hi2*d_hi2_w3
    2 V: X- K5 @! X2 M3 s; T    w3_new=w3-lr*d_eo_w31 d1 b" k- |/ S, b' }8 w; N
        #求w4_new4 S* d- h1 u" i5 q) p- E* O) Z# }
        d_hi2_w4=i2
    & h) i2 P! n' b9 J4 Q    d_eo_w4=d_eo_hi2*d_hi2_w4. `! W; t0 K  S# ^1 Q
        w4_new=w4-lr*d_eo_w4
    . A5 ]: L7 `1 z# c    #求b1_new
    $ V$ G( x: ^8 P    d_hi1_b1=1* E# j* H# a8 W) q% x( v
        d_hi2_b1=14 I6 ~1 \' n  Y$ n% B7 i5 M
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    # L; F; q" O; q7 B/ o  s    b1_new=b1-lr*d_eo_b1
    ) {0 O& T" Y% G! D, A8 |    #更新反向传播
      M' O, {2 l0 U! w    w1=w1_new
    # i+ s+ ^: J3 N) h5 I& M& T- f    w2=w2_new* ]- }# W. t, N' a0 @" v
        w3=w3_new
      f4 y$ |$ L( p& _6 B) B    w4=w4_new
    8 [' V' m/ a' S0 O! x1 E  p# b    b1=b1_new7 d/ s1 o4 O, A4 s# s: A# e0 b( e
        w5=w5_new0 W# u& X( \: B- f9 D* F9 x
        w6=w6_new6 b4 w5 {, o4 ]
        w7=w7_new
    # q" c- M/ Z4 C( d    w8=w8_new
    7 ?/ Y4 h# p, K- f    b2=b2_new
    7 u/ A: {3 G8 U" {print(f"当前计算总误差={eo}")
    ( D5 h# k6 Q9 _3 Vprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    2 [- M( i0 Q$ |/ y; ?print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    / \& j$ A/ n4 t* q# kprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    - i; [% I+ q" u( S
    ; y+ x0 g: l  b% R结果
      k6 i) c8 s& c4 I! {+ H  t$ \5 k7 n5 w9 K# @1 h

    + z' g/ e* Z2 [# a! L结语9 X! Z- R1 P6 B4 ?8 k
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 c- S! \  c9 {1 J
    8 Z' j( m6 N/ y! X  Z8 i' U
    补充
    4 _1 N$ G4 y  B! _, D. k4 M2 X程序中d_{a}_{b}格式的变量表示a对b偏导
    9 O2 k. \2 o& ]" S, r3 X————————————————
    / S2 Q9 R( e7 S- q. C" V版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 U5 ], }0 o: r- i原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    , w( q! r) m# T) m6 U* i$ g6 K) W0 s+ B5 o
    1 s7 g) r  _/ `" K- k( R: x
    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 23:36 , Processed in 0.476978 second(s), 51 queries .

    回顶部