QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3106|回复: 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实现)
    8 G! s' Q- N$ j& d1 r% t7 R8 J& K5 z
    ( }: W& W0 }0 F! |  b2 C- X3 U背景
      H; ~& W- C( T+ `4 k4 w0 G初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下$ Y/ U: a: \& r) B5 l1 E5 t
    7 @7 H9 a& p: p$ p+ Y
    【神经网络分类算法原理详解】/ j( A/ ^& f+ I! I: Z) }4 H2 X" C# i- S
    ; [; f( _& f% r! }5 a% F( L
    注意* k, W; M" i: p
    站长提供的图片有点小问题,我们更正如下
    7 x$ y0 a) ?5 o) d- j9 J
    3 U- y- Q% C2 T3 M7 n, l% [0 r0 D

    6 K2 i2 O1 `2 m+ O6 m! _% F问题* S6 R, }, f) G3 W7 A+ D' g3 l
    根据上图所示,我们有已知' U4 j% ~$ C: t( F. E

    0 Q5 f( k: a4 M" O1 E0 f#输入层# w5 B0 M2 U% [0 q& y  b
    i1=0.05% U: i: U) V4 @5 [- i! X
    i2=0.1( k2 ^! p+ |! x, b( h

    : t" x0 {. d! J, A#输出层
    0 p/ @# a8 i) d, _# G; t" Go1=0.01
    + g) I" n  X4 ]o2=0.99
    2 H( ~* }+ F# z6 P3 N) V这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    6 r  |2 W; o5 J) T1 A
    ( e+ Q5 I7 d, e- u" E$ F神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1: a* r6 O/ r  ~' n+ T, V: L

    5 S0 q1 d; J7 J$ R4 I神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    + l# ]* F" e: U0 E( E4 H: b, n: W
    ' ~4 n% S5 W, U( k4 w+ Q神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    . w2 i2 `& B# k1 w3 ^& ?% `1 S, L5 t; G' d6 \
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    & @' [; g( Q; O0 }* {7 W( p/ c& ^
    同理4 K/ u6 G- v7 c; E

    4 W5 X+ x# d1 G神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))3 H5 [6 F; d9 g) q+ D* j9 ^

    # v9 ~& U2 m7 y/ ^接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式# W1 O1 B" j! X, v  g# t
    ; z  c$ \7 n5 w+ d4 i
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    ' E& L* k$ C7 r7 P5 H& }- X/ {; k( }  L  ?* L" G0 r: S
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    1 Z; |, k$ U7 I9 g& w0 d$ H
    0 a8 {: R2 w$ c再经过非线性变换Sigmoid函数得到
    # A9 S$ ]9 m% O* q/ P& N
    0 E, G& p$ n* H5 V. E1 c7 R1 L% G" i. Y! m神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    & k+ K- {3 n  [8 _. _; t2 w2 E6 I$ k4 d
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    ' e9 u% K8 a5 I# H
    * W; J7 D( o+ k5 r; Q) U, C我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为( P7 t  b+ V% F& S3 _' d9 P
    6 y3 ?$ a/ u" S# I* D; }
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/23 \4 K: O; A4 E$ T$ Y
    7 L6 _, M& t/ P
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    : b+ R7 i0 A+ U/ @% h9 M" i% e6 }4 `: _6 Q7 }1 x
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次5 H' |$ j/ u# y- e, h+ `
    ) o, i. u: t/ T
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    , V2 g* O2 c0 N0 |1 ~: D: |6 p8 z  j4 q0 ^* F: U
    依次求解代求参数4 E' b7 H1 c" J" ?3 |

    / l% `# B- U* O8 Cw1~w8,以及b1,b2& ]- r- c$ c5 o' @* ]

    4 [; y4 I( u* F/ H  M6 R跟4 f/ u& W2 S7 E0 R. X1 B& w
    . W  }0 t1 M+ n# p4 H* F7 N* y
    损失值 (eo) 的偏导数( c% W7 _4 c) l) G, X' H

    0 X" B  f% K2 g# m8 }& _" k再更新该参数,更新公式为2 r: l$ p5 b1 c$ G) A/ a' Z- ~9 h

    ' l! L* p9 K- u% I' `2 [参数_new=参数-学习率*偏导(eo,参数)
    9 g) U0 M$ ^0 i1 U1 \. v- H' B随后进入下一轮学习* L1 ]; }5 W. o
    - I+ @: x0 @- w: I3 [
    终止条件(满足其中一个即可停止训练)
    9 W3 p; ?& Q7 s4 y0 y
    % J$ t; b! X8 R( ?1.学习次数达到上限
    3 D. h9 x8 r0 e) a, k
    3 X* O2 v) d6 c8 n6 z2.损失值达到可容忍的范围
    & Z) |; ^' {( j! U/ z" }; r  \: j& W: A7 d+ B
    导数
    4 o) Z+ |8 O# c% h5 Z% |8 e5 g6 f0 {! Vf(x)=1/(1+e^(-x))的导数是
    - U6 S7 Z$ n, e: g  }5 S1 Yf'(x)=f(x)*(1-f(x))5 |, E" H8 v5 W( y9 T7 [* J9 |" B
    源码1 f( R. K3 ?6 P# K4 d3 s& B3 e
    import math
    3 T1 V& v, P. |$ z, f
    / [% I) G7 ]0 [- s#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    # {" O( S0 w& ?- l#网址中图片有误,请看我博文上的图片
    8 F- M- N; }, T
    8 D1 y! r& J+ \! c3 Y# {* u#输入层. Q" O6 c- Q# n1 K7 t- \
    i1=0.05- k$ s2 W6 j& t% I# M  \" m3 K
    i2=0.1
    $ q! B( Q3 n' w  U0 L' x#权值参数9 P; e3 C- {- i" b- m+ j# ]
    w1=0.15
    ' ^3 J- J/ b5 A5 ]) rw2=0.23 S4 j# a) R6 _+ o
    w3=0.25
    - g# U/ g4 T$ M! ]+ k3 ]w4=0.3
    / [9 F$ n+ W4 Q4 f0 O6 E) tw5=0.49 x' ^5 K6 R0 H2 g& @  z7 G% e6 C
    w6=0.45
    . Z) U6 I" [& R: v. V. iw7=0.5
    ; ]7 r) w1 u* {9 F; Uw8=0.55& |/ Y! g0 B% _
    #输出层标记(即期望值)7 Y& l' V1 r% }. V: m
    o1=0.01
    3 T# U( q, T& ?7 h. ko2=0.99- o: b# Y- M; i& {8 J0 F+ h- u
    #偏置项参数9 F3 D; [5 Z0 \5 j$ v" {* M6 Z
    b1=0.35' T$ [) a# a* h5 e" ^5 n% W
    b2=0.6
    0 s$ Y! h( @) f+ m6 W' _* c5 o, r+ B2 t& t' R7 Q
    #学习率
    6 l: [. y/ q  W+ ]; e5 Zlr=0.5
    , H" w5 [' L1 @0 n, `, D#学习周期" O# @& Z# W( e+ O
    lt=0
    : Y. x2 F& ?; V; v. }8 ?) Hmax_lt=10000
    ; e8 ~- I. z1 n- [" b3 ?4 d# _#允许误差3 u6 M# M# i" w# `6 w9 z5 L0 k8 U. d
    eo_allow=1e-5
    4 k' c/ @# Y" ]$ f6 |- ^/ U( h+ Y- Z( z9 U2 I
    #线性转换, ]8 y4 V. ~, G/ `& F0 `
    def linear(w_one,w_two,i_one,i_two,b):) j6 v! v; Z4 U3 S. w
        return w_one*i_one+w_two*i_two+b+ F6 g8 h- ^: Z3 T
    #非线性转换
    : u# L6 e: o: \5 a/ C! ^def none_linear(i):) G1 N1 e6 [6 H+ D
        return 1.0/(1+math.exp(-i))
    0 J" i8 ^, X2 `
    & T6 W1 Z" \" J: J6 y  B; iprint("训练开始")
    2 v% X% b5 @$ o#学习周期结束前一直学习
    ' w' a3 P3 i1 ewhile lt<max_lt:
    ( w/ c0 M; ^/ j+ h6 p    lt+=11 _1 I3 O, D9 H' [
        #求h1和h2输入值
    ! O7 K1 Y# C& r* Y0 w) `    hi1=linear(w1,w2,i1,i2,b1)
      E# ?" g. n$ d2 x+ R    hi2=linear(w3,w4,i1,i2,b1)
    7 m, k% v: I% _    #求h1和h2输出值
    , Z* b" ?% I" Z$ i    ho1=none_linear(hi1): e9 j  ~4 d6 q6 y4 D
        ho2=none_linear(hi2)9 M9 U8 A' F* l7 |: K+ C3 e6 o2 r8 c% y7 j
        #求o1和o2输入值
    7 _/ F7 r7 Q" R& ~7 b    oi1=linear(w5,w6,ho1,ho2,b2)
    4 u8 T, k( e& _% b% t) ]! D  O" t    oi2=linear(w7,w8,ho1,ho2,b2)5 e$ S& t$ G+ \# N; s9 K
        #求o1和o2输出值" F! Y* V: {. |+ l0 {' U
        oo1=none_linear(oi1)* E. ?3 A5 k# c9 t2 f, r' w
        oo2=none_linear(oi2)/ p, m  E$ B. `

      L2 m; P% c. N    #求当前计算总误差% p- Y$ B$ T) b, ]3 ]
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 F$ ?: k/ I) q! H8 h* E
        print(f"第{lt}次训练,当前计算总误差={eo}")! x. r7 ~* o1 i6 ]# j" C, F
        #误差已经在允许范围,退出训练( G- Y1 a4 ~; q2 [/ y* L
        if eo<eo_allow:& n1 P0 ]$ Z3 ]! ^4 @
            print("误差已经在允许范围,训练结束\n")8 h) }" s) ^) T
            break5 Y6 A0 M, O4 E' d4 L$ c# \
        #偏导0 z3 ~4 I. y( B7 q
        d_eo_oo1=oo1-o1$ q7 o; z( t1 L( |$ }/ M
        d_eo_oo2=oo2-o2
    $ j, c: s6 H3 y, E5 |4 h/ S    d_oo1_oi1=oo1*(1-oo1)* w6 ?; Z7 T! H6 V& w/ p
        d_oo2_oi2=oo2*(1-oo2)
    - Z2 \3 [* J. U" E0 b+ }    d_eo_oi1=d_eo_oo1*d_oo1_oi1
      d) s3 w) ]3 p0 [) _    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    9 R# D: @) \# J. w8 L    #求w5_new  h: h1 f  Z% W+ e( @9 k
        d_oi1_w5=ho16 i7 _2 V8 i- j
        d_eo_w5=d_eo_oi1*d_oi1_w5% Y2 v# P6 a! p+ g
        w5_new=w5-lr*d_eo_w5
    1 c) F! R; l: S  o% Y$ R7 a' G0 Y2 j    #求w6_new4 L- @: w! s0 u" \
        d_oi1_w6=ho2
    : Z8 R- m1 R; w9 N- \    d_eo_w6=d_eo_oi1*d_oi1_w6
    8 E0 X3 J0 x2 g( {; q    w6_new=w6-lr*d_eo_w63 X8 P/ A2 O0 s* M
        #求w7_new
    2 o5 H* @! U  [. C1 n! U8 S    d_oi2_w7=ho1
    4 g- z1 V( M4 r  s! l: ^; Y+ Q# e    d_eo_w7=d_eo_oi2*d_oi2_w7
    ( k2 f# z: c- F6 ?& [    w7_new=w7-lr*d_eo_w7
    & e3 Z+ X! P7 m9 w6 S( ]- ]2 u) P& g    #求w8_new! }  f, R) ]2 y+ B+ q
        d_oi2_w8=ho2
    ; m' V- _# A8 H+ S, e' }- O$ s, o    d_eo_w8=d_eo_oi2*d_oi2_w8. P# v" i. G3 [
        w8_new=w8-lr*d_eo_w8- u" B3 X7 X' A# H' e9 x9 I/ _4 w
        #求b2_new7 }$ Y, ?  Z0 S' I, `
        d_oi1_b2=1
    / W: ^- A' U+ u' B    d_oi2_b2=1/ R0 |/ s5 t0 p+ Y
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    , d$ I3 J- Y. r4 F    b2_new=b2-lr*d_eo_b2
    " D( r! v- ^. s9 U. M: \    d_oi1_ho1=w5
    5 t- k4 a! W, ^$ h; l    d_oi1_ho2=w6
    - j/ H! a  P2 {* V8 ?% ]    d_oi2_ho1=w7
    : W4 `4 }0 E# {1 V+ ^    d_oi2_ho2=w8! k, [. Y+ r' q: D
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    : j+ m3 j7 [% e! }; P    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    # d! a8 Z/ X+ y2 @+ ^/ S    d_ho1_hi1=ho1*(1-ho1)
    2 d3 X* b' }; {6 C& U5 e    d_ho2_hi2=ho2*(1-ho2)( R+ s' M% h4 A
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    " V( r( q8 Z+ |) Q: m    d_eo_hi2=d_eo_ho2*d_ho2_hi2
      D# C3 g* ]. x6 R    #求w1_new
    ( M% X) Q, l6 d$ K0 c0 s0 W    d_hi1_w1=i1
    0 h- _3 X/ q2 D1 s9 _' w% w  _    d_eo_w1=d_eo_hi1*d_hi1_w15 m2 a4 \1 k0 s6 N, n
        w1_new=w1-lr*d_eo_w1
      o9 s( m% c* [9 S6 f* A7 [* d8 j    #求w2_new: l# k0 k# o3 g
        d_hi1_w2=i2
    3 y( a6 |) ^! X0 E# F3 v    d_eo_w2=d_eo_hi1*d_hi1_w28 J& t; w% {  F0 E
        w2_new=w2-lr*d_eo_w2# N7 B- M& x( e
        #求w3_new
    & c) z" c8 _! Q; s% ^, e0 |* H    d_hi2_w3=i1
    - H3 N1 ]) y8 \. \+ _! T8 q    d_eo_w3=d_eo_hi2*d_hi2_w3/ D, [5 D' ?5 ~. {/ J$ E* h: J
        w3_new=w3-lr*d_eo_w3
    ) F8 u/ L& U, Y& F4 T8 R3 U    #求w4_new
    4 [; ?+ C' O: b- D0 [* _2 T6 H    d_hi2_w4=i2
    + B' m% a- b, V8 a0 `3 v  ~0 e    d_eo_w4=d_eo_hi2*d_hi2_w4
    / u+ i  x* H+ D/ S    w4_new=w4-lr*d_eo_w4& A! ?  }1 G9 e3 ?5 g
        #求b1_new
    1 z; F" V# c; ?, j( q  o$ ?    d_hi1_b1=1& |6 S! L6 `  \0 \" D$ A# g
        d_hi2_b1=1, m* q4 z' q1 @% L9 D- t7 J
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b11 d7 Q: @7 y, @+ J' x' X
        b1_new=b1-lr*d_eo_b1
      z$ S' Y, o" o6 P7 j, {  y) ?4 ]    #更新反向传播1 b3 j) [; J4 M; u* N
        w1=w1_new
    0 R, R- v+ @* c: J# R. u. B    w2=w2_new8 m; d0 d* y9 x. x5 n
        w3=w3_new
    3 Y; W$ C7 c, d! f; S) {+ Y5 A; k    w4=w4_new2 |- ^. x- e" r, o" c3 D( q4 Q
        b1=b1_new
    # Y# P% i9 T$ `# _: P    w5=w5_new5 E* S. b& L: G# t
        w6=w6_new
    5 c; g- _$ i; i- G    w7=w7_new
    7 G+ [3 l/ h, V    w8=w8_new- l3 A1 r$ N, \% l. E
        b2=b2_new9 c/ o/ A: k: V% d, T8 [
    print(f"当前计算总误差={eo}")5 i, d) f: {# Z0 j4 Y
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    ( a+ s( ?8 f9 v  K4 \print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")3 k2 d/ v# c% k/ d" A: a
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")7 R! T# E$ B9 j4 c

    4 [: E6 Q9 g5 F& I结果$ ?2 t, e  \% V
    - O6 i6 ?1 q( a

    $ G# M: S  r! u, F结语0 u! }& t) ?, Z  O) }, m
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 {! M0 b1 y7 m, w  X1 u

    ( u/ k0 U; o; F/ g0 Z+ b$ @9 u1 ]补充
    - Y3 q4 m4 K) m3 b6 ^4 ^程序中d_{a}_{b}格式的变量表示a对b偏导
    1 Q; B' N+ d+ Z* U6 t————————————————
    1 m9 a" `2 V. l- p$ e) o9 A版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & U% M# o, p  v9 E% S/ [原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    & c5 X3 l$ V/ P& C, b; K' |( h" z% @3 M2 R0 i; {" b6 s' h) M! y

    - A$ k; f4 N* B! `6 I: H7 h* [' k! Z
    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-9 06:59 , Processed in 0.359022 second(s), 50 queries .

    回顶部