QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3032|回复: 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实现)
    7 f; F) B; T) m5 y
    - u) H7 X7 |9 r0 w( r  D5 N! U2 N) Y背景+ C2 A, c! }9 S6 k% B% @
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    % ~  O& h! y+ `  _5 U" \- z# h/ T6 F. `/ z
    【神经网络分类算法原理详解】0 X+ U. Q7 N0 n- p' }7 }. @1 {. x
      t* ?  @) t+ U7 ]" \3 U/ |$ G; R- m
    注意
    + w; P9 R. ~, b+ G" i' ^站长提供的图片有点小问题,我们更正如下
    # a- t1 d3 B5 T2 n) f$ l  R, e' ?" e7 Q
    : F- O# l8 @! ~# @
    4 Z$ K& \$ Q; o! g
    问题
    6 U9 A1 D- [  ^1 b; r' X. N根据上图所示,我们有已知
    ! T5 b* Y7 n) u* t0 E! x/ |# u# ]3 X% j+ H: y6 E" |* ^# ]
    #输入层
    9 d1 x) n3 B8 k: g+ @i1=0.05
    # T+ X" n' }# c' k1 ?7 F* Y9 l; _i2=0.1$ o: Y, t) s2 s" X
    # V3 @/ T* k7 X3 }* E: n1 d6 L9 B
    #输出层
    " m) V5 _* b4 y" g6 X0 h6 p' {o1=0.01
    ! g8 r( ]2 e' t) v$ yo2=0.99  m0 f) i" V/ H
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    8 c5 Z: g  v; E5 |6 x: P8 {$ T- ~' U- M
    9 y0 Z# i6 H# j0 t" w3 K8 i神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1' p0 L3 d( v2 U

    9 @8 H. U, a: e神经元h2的输入  (hi2)=w3*i1+w4*i2+b13 n( s+ W3 ^3 `3 z" K

    * ^# t, q5 v5 f" z+ D$ r& O" b0 q神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出9 U& G. c1 |9 t  r

    $ Y6 o! c+ b' b7 d' m; m神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))8 r! R/ R9 u; m, ~' U, H( T

    0 {: W8 y. H8 y2 G4 L同理7 _5 h. ~9 n" H7 M2 V  {

    9 R  T! \4 q5 Q1 E神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))6 I5 Q9 T) o& W' ?$ P' P) N, i

    . b! e, @( I% O# u* R1 Z" I& b接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    $ \$ p8 R1 F# c5 @& r9 c
    9 r" M* X: c9 z, P' v神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    & X2 C8 _. E4 ^% z+ U1 Y( V) @6 U% i$ ?" C) ~" C" T% }1 n
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    3 E! Y: W3 B% ]6 O6 L1 t9 K; j' `! G8 v
    再经过非线性变换Sigmoid函数得到
    % ]5 \" w6 s3 P: S0 ~) z8 I! b7 G+ }6 _7 D2 H* o$ }
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))2 J0 m/ d7 l# h$ h

    : F6 ~  p5 L' ~; M0 |6 j+ k神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    % u& ?+ e$ {' u% W5 F( E6 L+ ^" p3 ]# ]9 ], |' d( G8 z
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为' ~3 Y+ E0 a; b( j) [. t. l% E
    - N6 Q6 o6 m5 E. T
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/25 g. p" K! f) Z/ d+ i- G4 v

    , s! v' @4 [+ }4 }由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足: P7 z0 H" W1 }# e( H& j9 I
    ) r- a3 g% ~; u2 B
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    ( t- U  S: c7 ]2 `4 X) `7 }/ P* [9 _& j1 M, J8 f( r6 S8 H
    学习率 (learning_rate 简写为 lr)我们设定为0.5: j. i) n* @4 n4 i: x+ O+ |
    : I0 t. k  i0 P$ D) ]: M, D( t4 o9 o. \
    依次求解代求参数7 X5 W1 y3 f( ~' |* D! ^

    ; ], k7 [% r' T8 C& i: t/ `w1~w8,以及b1,b21 n/ i7 U- q/ j4 A; Q% {. U0 r

    & l# j$ O8 [. ~9 j5 g* U: S* C9 D( j* \. n! i
    1 \2 o$ l; k! K9 s% N
    损失值 (eo) 的偏导数
    ; f. {8 d7 n  c& ^+ [0 D) F
      G( U6 A7 t3 B4 G( z, d再更新该参数,更新公式为
    # j2 M( a: |, W$ o. E& H+ u& u+ [" t( {
    参数_new=参数-学习率*偏导(eo,参数)
    & j% D( [; K4 p  f/ f随后进入下一轮学习
    8 A4 L6 q& E: I  c$ c$ @
    4 ~/ S8 {% C7 t* z. L终止条件(满足其中一个即可停止训练)
    % g3 q: q5 [1 _. Q+ L+ r
    1 F/ W0 r0 J6 `$ @) @1 U# v1.学习次数达到上限# z' p5 t5 D( j1 j
    + f+ d! j5 p0 u# ~7 C
    2.损失值达到可容忍的范围2 ?. ?( R1 H0 B& s2 W

    / _/ ?. L: ?' B; V0 m" c3 r/ T* t导数8 q: H* U+ {' Q! B1 ~4 ?3 Y7 `
    f(x)=1/(1+e^(-x))的导数是
    ) C4 W% X/ G/ j8 `* _f'(x)=f(x)*(1-f(x))* T- A4 Q  E9 i
    源码; l5 G* y1 p1 Z; H
    import math
    7 V- t6 T7 n4 S1 S1 t4 N$ X3 o' U" b) _2 U6 S% g
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】. q# G) ~; F, K" i/ ]
    #网址中图片有误,请看我博文上的图片
    0 j! l$ c9 P, w, H: n) B  G, p2 p: @6 L; o5 n# D; \* w8 b
    #输入层: @8 T3 q0 K) M8 ?( i" l6 X: ?
    i1=0.05
    8 J/ z; {' {/ _9 _! r! l9 w$ Zi2=0.1
    5 l' A! d7 r0 m#权值参数( p. z5 B# W  s: ^: D) V5 m# k1 A! ?
    w1=0.155 Y$ \. U( r5 _0 r. l: G8 Z
    w2=0.24 X' U& y3 j% b9 o" x& \5 C
    w3=0.25
    / W$ A% F* Z5 e6 C' lw4=0.30 B% \- j7 c, n9 U5 G! O
    w5=0.4
    ; L$ r1 v8 P! S; |- W* Aw6=0.450 ^% j) G, d5 L0 P
    w7=0.5
    , ^- H6 C8 T/ ~5 K( Vw8=0.55
    4 ^4 K" u3 y- b" I& z- `#输出层标记(即期望值)
    - Z( O6 B0 _$ Q5 E. ^/ eo1=0.01  i7 d- r. ?1 e) F& `6 a
    o2=0.99
    2 w/ X8 f7 {, S* Q$ \#偏置项参数1 F9 Z) O( Y4 \4 s. v
    b1=0.35' q& {$ P- q) m+ q4 t7 V
    b2=0.66 V/ e2 k' a/ ?( X

    ! n$ y6 A8 q' I/ N#学习率/ s! g# |# p- @
    lr=0.5* W0 t+ l& p2 f  \& H
    #学习周期8 }% Y  A( {# ~  p& R1 @1 T
    lt=0
      F% Z" @% T2 e7 ?% M1 y( Cmax_lt=10000
    4 L5 W+ R! p; V" R% y9 ?#允许误差5 Z& d3 b7 \5 Z& c2 b& h
    eo_allow=1e-5. s/ c: J1 O, m- l) X3 n
    # F. h' {; Y: M
    #线性转换
    ( U/ Y# e0 [$ S6 _def linear(w_one,w_two,i_one,i_two,b):
    ! X7 ~* d5 ?, {9 g  g3 g    return w_one*i_one+w_two*i_two+b+ Q9 t) M9 M9 r
    #非线性转换0 F* G* }% W/ I% a9 N/ I! I7 j
    def none_linear(i):
    8 N  w5 F1 t* C5 |8 t    return 1.0/(1+math.exp(-i))1 m# l2 K$ g* m6 o9 j

    # B( C6 t. @2 kprint("训练开始")
    . h" [4 Y# h+ t. {#学习周期结束前一直学习
    , H+ g4 y& Y! N( ]* h4 T3 ?3 ^while lt<max_lt:7 X1 \- [3 Z$ X: F5 G
        lt+=1& p& u" J: m; Y! N# ?! m
        #求h1和h2输入值& l+ @8 H. ]' E: o9 R1 s& r1 N/ R2 J
        hi1=linear(w1,w2,i1,i2,b1)
    0 [* ~7 N! n  k: u! W( U" V    hi2=linear(w3,w4,i1,i2,b1)
    . @7 q$ I# w/ k8 d; c    #求h1和h2输出值" ~3 X  f/ ]. N* ]$ Q! j
        ho1=none_linear(hi1)
    - M6 b  y2 H: O, V0 G    ho2=none_linear(hi2)
    , q" v; P/ n& S9 l% H8 m    #求o1和o2输入值
    & p) ^! f7 [& |) ?    oi1=linear(w5,w6,ho1,ho2,b2)9 Y! d, |$ d2 n7 |4 l/ q
        oi2=linear(w7,w8,ho1,ho2,b2)
    ; o* r1 W# b1 b    #求o1和o2输出值* u9 l0 k  _/ h8 T  p" k" S2 @
        oo1=none_linear(oi1)
    & E6 U. [8 R9 }7 P! ]7 V& Q" V    oo2=none_linear(oi2)' l! g& }- [% p; w- x4 ~

    : z, p$ O( S$ J1 Y    #求当前计算总误差# Z2 ~, f, w3 P5 k
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2" r) o2 p7 }* h3 p! E1 b7 ^6 o1 X
        print(f"第{lt}次训练,当前计算总误差={eo}")0 A$ g% y3 p8 _- n2 G
        #误差已经在允许范围,退出训练
    $ b; P% {; R7 p* F, ~3 L& j3 D    if eo<eo_allow:
      Z! t; v3 e; [$ X        print("误差已经在允许范围,训练结束\n")
    . _3 o& b% Y/ h% {- Z+ j1 t) M        break6 o  R) w  \* |' r0 y8 _
        #偏导
    ( z3 A0 ?1 \# d    d_eo_oo1=oo1-o1
    & g6 I% @* ~" q    d_eo_oo2=oo2-o2  z' }5 [. n1 v7 i
        d_oo1_oi1=oo1*(1-oo1)0 r: T, G, v/ e" W! F- \6 J" h
        d_oo2_oi2=oo2*(1-oo2)
    $ A6 w; _/ }# ~3 w, h1 x" M    d_eo_oi1=d_eo_oo1*d_oo1_oi12 t8 B$ h9 l: |3 l4 X
        d_eo_oi2=d_eo_oo2*d_oo2_oi2& _2 y4 B; C4 d  d& q" ^$ \" b) C7 H
        #求w5_new1 O) H: e, S: b3 {: |4 S( |
        d_oi1_w5=ho1
    , s$ p7 E( e9 D% d9 S3 E    d_eo_w5=d_eo_oi1*d_oi1_w5
    $ ~. |! L- o3 F5 K    w5_new=w5-lr*d_eo_w5
    5 g2 h" u: H5 d  b  w6 r3 t    #求w6_new
    0 A3 a' x* g, T3 ~; i) {8 `    d_oi1_w6=ho2
    * v& u' B" C5 z    d_eo_w6=d_eo_oi1*d_oi1_w6
    & B. o! e7 s3 A* l( B9 K    w6_new=w6-lr*d_eo_w6
    ( x' |3 B0 ^! R8 W    #求w7_new! M3 Y; R! V1 P2 L
        d_oi2_w7=ho1
    . @5 D  x& M% N# y. x& V" c% x( R' B    d_eo_w7=d_eo_oi2*d_oi2_w7/ Y! q# b. X0 s2 e) I  C
        w7_new=w7-lr*d_eo_w7
      l7 g/ Z9 V0 _  L3 N( _    #求w8_new
    7 j$ F, d+ k! u. X/ \: S/ d+ i& {    d_oi2_w8=ho21 T" A: t$ J7 \$ P4 V! t- D2 B/ u  X
        d_eo_w8=d_eo_oi2*d_oi2_w8
    9 Y& }& I0 h+ Q- H1 i0 b: F    w8_new=w8-lr*d_eo_w8( _% `; S1 G) n7 J
        #求b2_new
    1 j8 @! M# U& w; t  g    d_oi1_b2=1
    0 t9 d8 l* ?7 e& ]9 ~    d_oi2_b2=1. B1 F9 b) k* y$ e0 U
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2% f5 Y! E$ v; W* X$ j; H3 t/ T
        b2_new=b2-lr*d_eo_b2- P' t1 S0 t3 k: ^* [5 m# b4 ~0 D
        d_oi1_ho1=w5/ h3 L, u- ]; k1 ~. Q4 a1 \3 j
        d_oi1_ho2=w6: Q; |& g! d9 J& q( ]7 N; f' m
        d_oi2_ho1=w7
    * d5 }9 |4 x( B( j% h    d_oi2_ho2=w8
    - |  P, j. Z0 A/ _' J    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho11 D/ S* ]& c) k) V, @! t
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. V3 F) {& W/ ?3 z' q
        d_ho1_hi1=ho1*(1-ho1)
    ! N* `6 n- U' L    d_ho2_hi2=ho2*(1-ho2)0 _" O6 u% T1 ?0 B& {( `) q# O
        d_eo_hi1=d_eo_ho1*d_ho1_hi1, w7 g, v/ f# T; f2 u
        d_eo_hi2=d_eo_ho2*d_ho2_hi2+ z5 V& d8 u$ x% t7 S5 T1 l! i: b
        #求w1_new* b, v, [; ]7 e+ |& u  V1 ~' E
        d_hi1_w1=i1
    / J( y6 @  x! p7 }    d_eo_w1=d_eo_hi1*d_hi1_w1( U* V: d% g& l; v
        w1_new=w1-lr*d_eo_w1: o' i: _- f) g, b1 y) I
        #求w2_new2 H) u! e; z# R2 D$ S, b
        d_hi1_w2=i2
    & a! ~" v- s/ E    d_eo_w2=d_eo_hi1*d_hi1_w26 d" K2 y- n. b, ~
        w2_new=w2-lr*d_eo_w2
    ! Y0 A3 q- g& w) [5 x! R    #求w3_new
    1 h0 h2 D  l, }$ |7 @3 C. G    d_hi2_w3=i1; D9 K# j. t+ i4 g8 I& g* X, N
        d_eo_w3=d_eo_hi2*d_hi2_w3! S! ~+ `5 G2 K$ B8 x
        w3_new=w3-lr*d_eo_w3
    + }; F0 @$ P0 S5 f0 @    #求w4_new" g9 R5 c7 Z5 z8 {! {' ]
        d_hi2_w4=i2
    / u: z: Z# O$ k" B    d_eo_w4=d_eo_hi2*d_hi2_w45 j- _3 G1 h0 V6 p' B! k
        w4_new=w4-lr*d_eo_w4- E( u  E5 z- ^4 e% `8 |
        #求b1_new6 q7 w# h3 e* K7 f0 o+ Z3 ]$ ?& L
        d_hi1_b1=1
    2 [: d" `- |' a    d_hi2_b1=1
    / l' M, c5 N  F9 _. Z, }: h' z    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    7 y( \1 ]6 p- k* ^# y' d% p    b1_new=b1-lr*d_eo_b13 f. M  a' W" K* y& J1 X# {
        #更新反向传播5 W+ ?! t/ E# R/ B
        w1=w1_new
    8 e2 W2 W  C8 O3 `    w2=w2_new
    , [' X9 H5 @- X+ V/ d2 W$ ]2 X# ?    w3=w3_new9 J* N. E5 e# |
        w4=w4_new/ U& ~4 Y! r# F8 J3 g; m% K, b  Y; [' h! s
        b1=b1_new
    ! V$ r) e# v  y' S" b    w5=w5_new7 m% {- s- x3 {+ u
        w6=w6_new# N& }$ k) P! Q
        w7=w7_new
    ' j$ O" O( d; `! E+ s3 _! D% k    w8=w8_new4 Y  ^* U  E0 w4 q6 W6 y" y
        b2=b2_new
    $ ^* @! K$ q- s* }) F% Y4 n4 H4 T6 Lprint(f"当前计算总误差={eo}")
    - A  C7 x" @% A: x0 Y6 gprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")% {0 Y9 [$ C* L6 b3 N5 w) I
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")3 H' Z% O* n; F; J* v
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")' E6 a9 w* z% Q2 d5 z

    , ^) N/ f2 {4 c8 B. e: o  D结果
    ! w! N. H' s" {' A& U" q& F$ Q1 B, a- K6 _! X( z; T7 X( ?
    , P  n. _2 K5 W1 \% G7 `5 W
    结语% v6 J% J5 s- ?; ~7 f, w; S
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    , }: ?3 `" z- h
    : |& H6 Y9 K+ N( @1 |" J补充
    1 U: y3 T8 {9 ?  \5 B. i' O% s程序中d_{a}_{b}格式的变量表示a对b偏导/ V! C( ~( n0 y! B  b7 k
    ————————————————8 i0 ]; p. A5 E& o: |" w$ N4 t
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ F  \. e9 V* E! C
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954# }! c! s8 b4 t- J
    0 \5 F( m, ?7 R8 c2 N

    ) t( Y& z! C& |+ a  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-6-12 11:14 , Processed in 0.595392 second(s), 50 queries .

    回顶部