QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3101|回复: 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实现)
    , i. z! D7 i' f. B7 m% `7 J% k4 k; X2 L' B
    背景% Y% p$ {; T: O0 ~: V
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下8 e) m' c  b: `( S" D

    6 ~+ n- Z# n, I- v, \【神经网络分类算法原理详解】9 h5 E2 f7 U5 L/ l4 ^! H+ l, k/ e
    ' E$ T5 e4 q  D4 V+ L. s! Y
    注意
    2 D; x2 F; I1 \0 F$ {# a, s5 w0 P站长提供的图片有点小问题,我们更正如下
    , `% P* S4 r8 b/ {7 V
    8 V) m: B# F' I+ l% G, S/ J
    0 v+ P2 d% q6 i) `- h" `# A# R5 _* Y6 ^8 I# }5 ^( F: w# \
    问题7 l& e9 p8 A9 r3 a# ^9 f; m
    根据上图所示,我们有已知
    / n7 m7 \4 V- X2 V3 J" B+ m. B( P
    $ i7 L# c1 q0 a: @/ E" k, K2 ?#输入层  Y; |" s6 L+ {4 P4 Z6 J6 u% f
    i1=0.05
    4 Y2 l/ `- L/ ~) Si2=0.1* l! N) E6 S  H7 a$ |! c
    ! d$ i! u4 U: {$ P  u/ j/ C
    #输出层$ E5 ^0 q. X2 u9 U. _
    o1=0.013 `9 I, `1 k' ]# ~+ I
    o2=0.99
    7 d: n  Z1 Z6 h+ r; v) z3 k6 ]这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的4 \9 X7 j8 Y* s! }+ q

    2 z& F- v# I5 S- H8 @/ r4 G: c# c神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1/ [2 q( l& u8 F. }9 `

    1 y+ U. R0 u* v! c神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    5 @1 g5 V4 X8 U# \
    # p/ G# O& I( n神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出9 l4 |" Y* N, O, }) E) o

    : Y  r4 a. ]$ P4 ~3 f! @神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))& V0 B& g3 X2 y4 ~) ]9 z

    3 S, o0 F( P8 h同理- R" {# }7 B8 L0 }4 t

    ' S: j* V6 q! H  }% m( G" [神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    ' m; Z% _, u6 |$ ]3 P( B. m5 H+ v5 H" _; p- T: W
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    * m4 a8 U* x- \6 ^" ~" v
    ! e& s0 b% ?& y神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b24 Z" O& T7 X' j4 ?
    , s) e( v" a  Y$ @& i
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2& J( s; I/ q, R

    ; F6 c& M' Y& _2 @/ p; F& E  e再经过非线性变换Sigmoid函数得到
    * H+ P; Z! n9 ]" ]
    ' P0 O" g, b" A; m6 a神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
      ^" K5 [. L+ \2 K' x+ f+ H; \+ g( S" z1 o
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))9 O  J( E3 o" K/ }( N7 S+ P3 e
    . {! p7 l3 I1 p& o
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    4 r4 E8 d6 I: J2 E2 s# x. `9 s
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/20 K, v, G: d# H
    # B: \  j) E, @) h" |% u
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    # W8 s7 c+ N( y! V0 L+ o; |/ b' Q) B- q0 ~+ R1 E: b2 i7 j
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    ) O) P5 o7 m) P5 {2 ?$ ]8 y- j
    0 H$ `- W! y4 f3 u6 E7 n2 n: w学习率 (learning_rate 简写为 lr)我们设定为0.5  x8 v; Q# j+ ~. x, V$ N6 z% _* h2 t
    3 A( x& p. N) {9 z% j. d$ i. ^! u
    依次求解代求参数
    ; A3 S" N) Y2 c4 e( E9 O/ U, H2 W& A6 y2 a6 i) u& G
    w1~w8,以及b1,b2- c) B# R! @5 o  I' c* E3 A
    7 h4 j/ m5 o3 m# y
    跟
    / Y/ k( Y' ?; ~( B) u: B8 s: J: J% H( @$ t) Q
    损失值 (eo) 的偏导数4 X- M$ B) q4 y. t- b: h8 ?

    ) z9 `0 F% S6 R" s再更新该参数,更新公式为7 q5 t# |5 d8 I, j. B1 v* Y- K
    $ h5 H4 v8 m3 }6 h+ ^
    参数_new=参数-学习率*偏导(eo,参数)+ K+ N$ J8 y$ a9 z
    随后进入下一轮学习
    $ J! K$ e$ R( Q
    $ A* S  I4 {! u* y. C7 c; }终止条件(满足其中一个即可停止训练)
    % p! a" \- B1 j  _
    ! G# V7 y4 b7 o0 {' z1.学习次数达到上限/ b% N5 w; [6 m2 |+ M7 S  L/ ]
    3 L- ?. L- ^; C* x' r/ g
    2.损失值达到可容忍的范围( I0 B: P3 R6 B/ R3 M) p1 V

    : {5 l/ }! G4 m导数$ E9 q. h) P* O9 E# P1 \0 {' b  f+ P5 a
    f(x)=1/(1+e^(-x))的导数是
    ) T) f* p; I7 W4 Z# l, P7 ?f'(x)=f(x)*(1-f(x))
    ' S/ X" Q6 _! |5 g源码  O' t9 g9 k' S1 M! A8 V* v3 ]2 B
    import math. H* m8 H. C* S* Z9 H4 t

    * ^* U0 o& D9 B5 n) I#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    9 w( G' |4 x2 H! u$ |: {% R/ q#网址中图片有误,请看我博文上的图片
    , [2 M0 U  f. A2 ^3 J  v0 B- j1 N! T) c; ?! s# e- ]$ ]
    #输入层
    . i/ y+ H( ]+ ^) i* S6 Zi1=0.058 C; b1 R2 N/ W& I) n
    i2=0.16 ^6 f) i/ m7 h5 i0 z
    #权值参数
    8 X1 U1 y" I9 l' g8 jw1=0.15) U, \3 l+ y( [/ S9 H3 m9 I  `: F
    w2=0.2  V0 h- o9 ~+ v( \) {. I
    w3=0.25# i' y2 D7 t; \  N* }+ _5 i* _
    w4=0.3' p' K0 y" k# x% c" D1 ^8 h( x
    w5=0.4; o6 X( k0 x  a2 c
    w6=0.45
    / A% F$ R& T! p: B9 X" L0 E  ?w7=0.5
    & J9 m5 L+ j% ?, z4 Rw8=0.55
    % U5 q0 g( D- F#输出层标记(即期望值)
    & e: H8 l2 [0 Eo1=0.01
    ' h8 @; Z$ }8 h. s  v6 ~o2=0.995 `: R; d0 Q0 ?0 Z6 L; K
    #偏置项参数
    " t0 `! t6 f% Y* c  t. d/ q, Vb1=0.353 f+ \, G8 V* f$ z; L4 D
    b2=0.6  b+ x1 {: ~. h6 K, d

    8 A. n! P8 {: }3 }#学习率
    & C8 m& _2 E) Mlr=0.5
    , t8 d: P- L- z#学习周期
      G8 r. E, s7 f: Q& ylt=0
    + O. p5 R$ ~! [max_lt=10000
    ; t9 y" ]( x1 e: p8 c# S! h#允许误差9 S4 ?6 c3 H: _; I0 ~* X
    eo_allow=1e-5  C! W9 i* W  i8 e2 f8 o
    ( V' i. {2 i6 t0 T9 v
    #线性转换, Q, D8 |: V& s" ?( x( X
    def linear(w_one,w_two,i_one,i_two,b):
    ! J& I$ m) {% J; x: I) [/ b6 y' c4 x    return w_one*i_one+w_two*i_two+b
    # @! J7 T1 k/ m/ v! y% k#非线性转换
    ( g- Z9 L7 I1 E3 S! Ndef none_linear(i):
    5 `. }0 Y* R& L    return 1.0/(1+math.exp(-i))7 y0 `  K: y$ p) n& b( x* E$ b

    ; o) T4 h; X5 D6 Eprint("训练开始")
    ! }" N0 Y; D# N, h" E" d#学习周期结束前一直学习
    & k' `& i. k, S& m% U9 wwhile lt<max_lt:& x) _/ h& g7 g1 n/ y4 s4 s4 X
        lt+=1  c( W1 ?( D3 p& z  p  h
        #求h1和h2输入值2 C9 I" \2 r5 ]
        hi1=linear(w1,w2,i1,i2,b1)
    - h3 I( w1 ]( {9 t8 J    hi2=linear(w3,w4,i1,i2,b1)! ~( F2 w9 J8 Q8 _  F- P1 t/ y
        #求h1和h2输出值
    7 |5 e$ N3 Q; t8 C" a    ho1=none_linear(hi1); d- C, _' D0 c
        ho2=none_linear(hi2)$ z6 m" d* a' L# U3 p) U
        #求o1和o2输入值) `# Y5 a! |& ^4 x# ^( u
        oi1=linear(w5,w6,ho1,ho2,b2)
    2 q- Q- I$ {) }2 y  s' {. n3 u    oi2=linear(w7,w8,ho1,ho2,b2)
    " |) i3 p8 w6 j' t! p6 [# \  U6 g    #求o1和o2输出值8 ?  N! I" N+ r1 y
        oo1=none_linear(oi1)
    ) L3 _% s/ o9 R" `* L- y    oo2=none_linear(oi2)
    1 l) M5 A( c5 g2 {9 {* O5 N  b
    % q' u4 j( j' |" i    #求当前计算总误差
    8 \, n; D2 U- S- o/ f6 ]( |: O  g    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2) P- i- c6 j/ w" t$ m- M
        print(f"第{lt}次训练,当前计算总误差={eo}")- ]& `/ K5 H+ _: B- X3 Z
        #误差已经在允许范围,退出训练6 D3 C2 P8 r, e/ Z/ V3 q7 u: Q
        if eo<eo_allow:  D2 P( ?# V# W2 v. Y
            print("误差已经在允许范围,训练结束\n")1 N7 V* a2 l3 l2 m
            break
    , c( A( [" f4 {+ n! G    #偏导9 h0 u/ I& V5 U! N# _' {. k
        d_eo_oo1=oo1-o1* f, G% F$ {/ a
        d_eo_oo2=oo2-o2; ]. P3 c' _1 N
        d_oo1_oi1=oo1*(1-oo1)
    0 _, I  ^2 F" N3 Q5 }    d_oo2_oi2=oo2*(1-oo2)
    # K! U9 x9 f2 M1 w9 k* [  y8 }3 m    d_eo_oi1=d_eo_oo1*d_oo1_oi11 v8 \6 h1 X7 Z7 y
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    8 \# o/ f0 I0 k+ K; R/ [2 i, B9 [    #求w5_new
    % J. R% T/ u5 D    d_oi1_w5=ho1
    7 R5 S# a* p. J# L: E# K    d_eo_w5=d_eo_oi1*d_oi1_w56 v, B9 Q* s1 L# V, `" _. ~; G
        w5_new=w5-lr*d_eo_w5, G5 w6 B( \( k
        #求w6_new6 y" z+ Y* u; |" O) i  F. a
        d_oi1_w6=ho2
    4 G- T8 ~1 f3 d    d_eo_w6=d_eo_oi1*d_oi1_w6
    / X! e, G  h; u' O0 o8 Z) n    w6_new=w6-lr*d_eo_w66 y) r1 b) w. W1 ^! Z2 t6 `
        #求w7_new( W5 W  Z# r/ G2 ]/ J$ ?
        d_oi2_w7=ho1
    7 N' z3 l; \% A    d_eo_w7=d_eo_oi2*d_oi2_w7
    ! F6 C. t4 p! R# b    w7_new=w7-lr*d_eo_w7
    2 C7 @1 w$ G4 _) _. S: ?    #求w8_new
    + D# q7 H1 _+ ]' y1 p% X0 g3 `    d_oi2_w8=ho24 k! c; e' D7 T/ @* ^
        d_eo_w8=d_eo_oi2*d_oi2_w8
    $ h" c. S/ c/ F8 q3 }% ~* Z    w8_new=w8-lr*d_eo_w8
    ; g9 `! D, H3 T3 t3 y    #求b2_new  r, |; k* N1 d
        d_oi1_b2=1) z5 x' T; d1 [& I5 H: }
        d_oi2_b2=1& |! s2 R/ N( F
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2, x, l4 w* D% h
        b2_new=b2-lr*d_eo_b26 V$ J" c( B" l2 `: l9 O8 O" F
        d_oi1_ho1=w55 B* _- z+ X- M7 U: l  ?
        d_oi1_ho2=w6
    3 ?3 ~* d% t$ v8 W% U0 n    d_oi2_ho1=w7
    - ?8 C! ~, Y, o+ C8 t    d_oi2_ho2=w8/ D2 L3 d! B/ [) v& p
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    7 a5 g4 w1 `, O$ @    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    / z; D; l# r3 C2 W* D' S1 c    d_ho1_hi1=ho1*(1-ho1)3 R% J2 I, e- L' \9 P
        d_ho2_hi2=ho2*(1-ho2)
    : E( Y& L) m! p1 `  a' X    d_eo_hi1=d_eo_ho1*d_ho1_hi1
    & n/ i2 c; O, @4 @/ g    d_eo_hi2=d_eo_ho2*d_ho2_hi2* R% N* j* r0 |/ f* b3 ?
        #求w1_new
    % Z. ?- Y5 {4 l4 }; H    d_hi1_w1=i1
    6 h; G% ?! q! x    d_eo_w1=d_eo_hi1*d_hi1_w1
    ' \$ J( m8 M3 Y    w1_new=w1-lr*d_eo_w1
    8 v! S6 G1 [% H% n, j/ ?( r    #求w2_new3 ~7 x: n3 A! K. C7 x
        d_hi1_w2=i2
    ; I) f2 _0 Q2 @9 n    d_eo_w2=d_eo_hi1*d_hi1_w2  B. i+ l- U$ K) |) B/ g/ s, K
        w2_new=w2-lr*d_eo_w2
    : W9 m5 ]" r9 b8 V! x    #求w3_new
    ! Y0 J& Y+ I) q& o- S; L    d_hi2_w3=i1
    * z# X0 k1 f# q# Y1 C    d_eo_w3=d_eo_hi2*d_hi2_w3
    2 V9 H1 _- ], w, j    w3_new=w3-lr*d_eo_w3+ R% J1 Q/ S/ g/ M; M) @
        #求w4_new
      o, S2 X; y: b  x4 h$ n5 v% H3 {    d_hi2_w4=i2
    , X/ i* ~! o9 z% B% o    d_eo_w4=d_eo_hi2*d_hi2_w4
    ; x; o; y, ~* t* _    w4_new=w4-lr*d_eo_w4
    8 D% Z# u3 q( K' w0 @% |9 W0 L8 C& Y    #求b1_new
    0 p( n$ E+ u3 U    d_hi1_b1=15 d! [; |* y5 a! x( p
        d_hi2_b1=1
    5 h7 h- J, T' N% f    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    / e3 c2 B# c7 V/ Q  Y7 E( a* u    b1_new=b1-lr*d_eo_b1- M: N3 ^8 e" g" l
        #更新反向传播
    3 @4 @' p# A, `$ T" X8 m- m( \    w1=w1_new, F& F) U- B' N
        w2=w2_new
      \! O0 Y5 c* T- [    w3=w3_new
    6 l: X/ J- l: A0 T    w4=w4_new
    1 a/ H$ I7 A5 o/ C& m    b1=b1_new& Q9 @* Q" {/ h  A! a5 _( M' N" O
        w5=w5_new
    ( H4 ~, ^6 w+ _. I1 Y    w6=w6_new6 Q$ R9 ~' I: l, F
        w7=w7_new& R$ A9 n+ Q/ l% K/ ?
        w8=w8_new- f+ O: d6 R. |) `' `5 X3 |' B
        b2=b2_new! }( \  u, I, q# b/ D' z
    print(f"当前计算总误差={eo}")- q1 z! @) X; x( f& N
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")6 X/ o- G3 I( @- C! F! X. e$ j! @
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")8 K+ X2 ?$ b0 I7 H% Q# k% Z
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    . l: P  x* C# u
    ! M6 v; ^" P; |) i: V4 }$ C结果
    ' ~+ Q4 H. T# ~3 ], _. i' Z2 g
    ' q: f0 V( I  z' s( ]( Z& J# j) Y& F  v+ b( }
    结语0 z4 t: d' M; s; m( m4 O% i
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。0 u3 K2 v- k( B" Y4 w8 V
    4 k- r/ k. \2 r) p8 Y& \
    补充
      i$ v9 y+ Z* _+ r: z% V0 C& o程序中d_{a}_{b}格式的变量表示a对b偏导
    : h$ x$ @# w; I) `0 j) K————————————————
    5 ]/ D3 f5 w* y" N% L) U版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # N8 ~) q$ W- W原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679547 i" e( \: }& @- p1 b+ Y, Y
    ' `3 R& h6 u! i

    4 j/ g4 {, H' l& k* X% N' l. l( V0 S  M
    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-8 08:18 , Processed in 0.387462 second(s), 50 queries .

    回顶部