QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3109|回复: 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实现)
    , @" @) \+ d7 S( k7 d. U% D; k: K, V
    背景7 j& I3 c  o$ A
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下" B  d/ h  f# C, k2 c' W

    8 R; y2 E1 z! `( f6 ?4 M【神经网络分类算法原理详解】
    2 u2 z/ r" P7 w% d1 u" W( J1 d7 ?! _( G
    注意
    4 t4 R) N9 Y3 X) D+ Q9 j% I; h站长提供的图片有点小问题,我们更正如下0 v* b4 P3 Q+ F; i  B2 g

    - W5 g+ Z. O- d8 Q; h% ]( y1 W' t$ N# l5 A
    " K  u8 u, Q# Q3 X: D: p
    问题
    . I7 M% h% ~' C根据上图所示,我们有已知
    3 S- X. B4 I, R3 I* F# r6 k# P. U0 a
    #输入层1 A% M7 P' a! P
    i1=0.05$ w7 [1 @1 D' h9 V& U0 e' M, ~
    i2=0.1
    - i6 r8 h5 K1 _5 |6 p" s/ H% x  r/ `
    #输出层1 [! n: c! k8 }: T4 @0 p
    o1=0.01
    9 T' ?. ^, [' ^) Mo2=0.99" v& c& C$ P9 Z. ^5 f3 k, k
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    % E6 }0 A9 p. q  L! ?6 @* C) h: g) t1 F8 S  H
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1- l0 N: I# U  b
      @5 S+ R$ X( w6 R' }" s( `0 y
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1, F3 Z1 e. ?+ |( F) s' N5 R  w) b

    8 t& d* b. r- \' }) S% n; a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出) B" v  C* O7 J" |. A/ f% N0 J2 R

    9 h. B9 d1 N6 u神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    3 ^# w% w# u5 ]0 T) V; A
    4 O% C6 K5 e1 g1 s9 \$ Z) M5 `同理
    ; [- e$ {9 ?( O/ n( u7 @
    0 J+ n) A/ D; F+ _8 l神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))" W$ A  a/ Z8 R, z  O2 P; \

    / L3 b) A2 p% s  j5 G& J接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    " i; i5 E- H6 [2 f) ?" f  [
    " A+ X- \, O3 Y  M神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2. Y  L& d# D! D/ t9 k& ?

    . B9 s3 P) q+ P' g* t3 [. v8 B2 h神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2: t) R6 v0 A; N
    5 j0 M' Q6 L/ k9 E1 @; e
    再经过非线性变换Sigmoid函数得到0 y; {) `6 }, G  Z8 a/ I2 M& ^1 \
    * B7 ~. z7 v3 w2 c# i" r
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    2 g' B" ^, E  [) K/ V
    1 y. Q0 F/ G  u# M7 P2 y$ ]  w神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    7 u( y/ T  O$ W0 E+ p$ Q6 h, P6 c! f0 b
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    & ~* z7 D+ ]# F* }
    / p& J* P: o2 J" V9 C+ E损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2" @0 c: e9 Q1 `( H! O. d1 e& W# n
    2 m( ]9 y* ?' D0 H. z: s+ H
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    ) z* d5 h: F/ T( {* Z
      t* A  N- s( c. K/ E学习次数 (learning_time 简写为 lt)我们限定最大为10000次( g8 h, A1 S" Q& C  ]
    1 }: A! j6 _6 \, `. x) D6 N2 S
    学习率 (learning_rate 简写为 lr)我们设定为0.54 e% D! t  d: T- @7 M

    6 J: H' x" w+ j1 d& d2 x3 o依次求解代求参数
    ) t/ W1 [" f$ m7 R" a! o/ F0 T
    6 u4 X" u$ z$ \. cw1~w8,以及b1,b2
    + U3 ?2 z7 h  j9 `4 n* v) O" \  i1 _1 m- \. G3 Q, x4 F
    跟* N& e. v& R# D& K; Y+ v
    9 k  d4 M; c7 ]+ t+ a
    损失值 (eo) 的偏导数% }( F* L. O; @" T% u/ `* C

    : x5 v; y+ o3 \4 t: b4 _  H" y再更新该参数,更新公式为+ \4 \" }) m; [

    7 s+ X& P" j; o4 z/ {6 {4 b参数_new=参数-学习率*偏导(eo,参数)# O- v( _9 X% Q' Y# U
    随后进入下一轮学习( c8 J: M, R- r$ j  B" q
    6 d$ ^0 g4 h+ z7 N& |# `
    终止条件(满足其中一个即可停止训练)$ c" C3 Z. P# t+ _
    : U: A- e! x2 Q( w! i" x
    1.学习次数达到上限
    2 m) Z7 y+ a6 B5 R" K- V
    , R, R( ?8 F) t: m9 y2.损失值达到可容忍的范围
    : P- b4 q" X  \- e
    ! k: n$ X2 ]5 i! l3 t& z1 ~导数& w' p1 @/ T: @( N+ m2 x
    f(x)=1/(1+e^(-x))的导数是! R, |" B4 _5 q4 [/ |
    f'(x)=f(x)*(1-f(x))
    6 `" Z4 Y( X" [% @6 R8 h/ z源码" ~2 ^' S' R% t4 y
    import math
    # H8 U# o& K8 Q) i5 G% P8 i" S5 U: N. b4 M2 r/ u4 b( e4 {
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    ; z+ K6 M# h, D" h#网址中图片有误,请看我博文上的图片8 K& J# R. @, @: u+ `
    3 J9 D; V( r5 ]0 Z+ ~. C' L
    #输入层+ W) g2 }% f' a" g, M
    i1=0.056 q0 ^* I% n- d' K% a
    i2=0.1
    8 R4 O8 |  i+ r! M6 k% c8 Q. m#权值参数2 @8 l9 H$ m) q% L5 j' A( I% X/ y
    w1=0.15% V) h) R- @  u/ |
    w2=0.2
    ' \- n# |9 Y" p+ S) Gw3=0.25
    - R5 W) _" }( mw4=0.31 m. r, X* p3 w2 u; u  D
    w5=0.4' P) {% W8 T0 N( n
    w6=0.45
    8 P7 J. c5 _6 F8 z% D5 ow7=0.5
    $ h( x* @& g% z) E4 R% Q# nw8=0.55: Q  I; V" n" C* w
    #输出层标记(即期望值)
    ! ~7 o- W0 P. K. N  ^o1=0.01
    * Q% W+ l& ^; v0 x, uo2=0.99+ m/ g# ^  K7 Q5 T5 P3 ~7 ^
    #偏置项参数
    . v0 Y. p. o/ Q6 j- ?$ \8 T! Nb1=0.35
    4 n6 q% c9 C& Xb2=0.6$ }* c; i; X- f; f- z* L" j; R8 m/ N

    0 w% Y/ X$ ^# t, j- d5 h) e#学习率
    ( k; q7 ]9 ]9 B: O, w! s) elr=0.5
    * d% P: Q) m7 n+ ]8 h/ {+ P, I#学习周期$ a7 m9 |+ ~3 Q1 W9 v
    lt=05 N( a, y) K- @; r
    max_lt=10000
    / B1 j' V7 U# t1 @/ j; `3 S#允许误差8 U3 X& j1 f$ ^+ [
    eo_allow=1e-5; S7 X6 t- A, u+ W0 X
    / r6 ]- v8 N5 h8 s" Q. g9 E# m; b
    #线性转换
    / E! E7 l3 J; w' T5 Z; U6 Gdef linear(w_one,w_two,i_one,i_two,b):
    7 u3 h+ P' M. e    return w_one*i_one+w_two*i_two+b
    7 K9 K8 f6 C7 u. I, S& }#非线性转换* s& _, c$ `: i' Q5 j  q
    def none_linear(i):, g; ~; _7 L6 J
        return 1.0/(1+math.exp(-i))4 L' a* K3 z% D' \

    ; t0 N1 ]7 }3 j  v1 C, e! e* C2 Vprint("训练开始")
    9 U6 Y& Q7 d  R' M#学习周期结束前一直学习
    3 z- ~& E- C, P" U4 P" Ewhile lt<max_lt:3 j* |$ }: C% {5 q; Q
        lt+=11 [( i6 z; R; J4 h
        #求h1和h2输入值
    - m8 [6 Q( j$ }8 f8 t    hi1=linear(w1,w2,i1,i2,b1)
    / {$ c- N2 Q1 `$ ]. e3 c' Y2 N    hi2=linear(w3,w4,i1,i2,b1)
    2 H3 d& A: D8 L8 [# k    #求h1和h2输出值
    9 q* ?& |' _+ E' G1 j, P6 b    ho1=none_linear(hi1)" ?7 q6 Q# h) O  f; n/ I  s
        ho2=none_linear(hi2); g' \: k( Y  v  f( ?2 P6 J% X( i
        #求o1和o2输入值6 {- i, |! J. r0 s& L7 d5 k
        oi1=linear(w5,w6,ho1,ho2,b2)/ n- a1 h5 I7 V6 d* p, Z$ \
        oi2=linear(w7,w8,ho1,ho2,b2). b' N# J( o$ D  h  R' N6 [7 j
        #求o1和o2输出值
    ' G9 T$ [2 k: K    oo1=none_linear(oi1)
    , C8 ~/ U/ H! f  C; X! c0 A, x    oo2=none_linear(oi2)
    . _" c! q% `1 }9 t0 X2 L3 z# y. l( |
    : h) T( p6 [) q0 _    #求当前计算总误差" ]0 Z/ `) H8 |9 V3 ^9 e' Q7 p
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2! U* K8 n5 x% E0 e. M
        print(f"第{lt}次训练,当前计算总误差={eo}")0 y/ L: e- B# \8 f# d& s: u
        #误差已经在允许范围,退出训练$ h5 o5 X, U* D) \
        if eo<eo_allow:; c. J( d2 v6 J* x/ k& T5 {+ X1 e
            print("误差已经在允许范围,训练结束\n")- J1 j/ {& V1 G
            break4 y' B% X0 ]& U& X
        #偏导- s2 I3 O; S: y5 b
        d_eo_oo1=oo1-o1
    : U3 V& H  M2 u3 |  _    d_eo_oo2=oo2-o2
    2 A: {6 ]; S3 I  B8 q3 R    d_oo1_oi1=oo1*(1-oo1)
    0 X# q/ S6 S8 D0 I  _    d_oo2_oi2=oo2*(1-oo2)
    " J0 L% v; u% Z5 G* p, U    d_eo_oi1=d_eo_oo1*d_oo1_oi1
    & r- i, S% U/ P, N    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    9 k( O$ N9 E9 l5 F/ |9 P; c9 ^    #求w5_new8 w  B+ y( O' N# d2 V- G; j3 a, o
        d_oi1_w5=ho1# B9 h0 E/ H! q1 Z
        d_eo_w5=d_eo_oi1*d_oi1_w5$ `4 T5 ?) C6 Z$ _1 J) `8 X! {
        w5_new=w5-lr*d_eo_w5  P; i2 C& N5 D$ `
        #求w6_new
    ; D: |' H3 O2 ]* ]    d_oi1_w6=ho21 t8 v. W" ~. j8 V2 f
        d_eo_w6=d_eo_oi1*d_oi1_w6
    " A5 J: A$ r. a3 X5 L- \4 o5 g    w6_new=w6-lr*d_eo_w65 c; k8 t8 ^  N0 ]# n$ E3 m
        #求w7_new$ l9 N& y0 s9 I
        d_oi2_w7=ho1
    + t* B' H6 f3 }/ b5 a+ h    d_eo_w7=d_eo_oi2*d_oi2_w7
    * a: @3 G/ A' E    w7_new=w7-lr*d_eo_w7  @# e' o1 q* U+ D+ }
        #求w8_new2 Q% ^, G0 X$ v' M0 L- ]
        d_oi2_w8=ho2. F2 k5 e; P9 B7 o3 B
        d_eo_w8=d_eo_oi2*d_oi2_w85 e% I8 c( ?7 J
        w8_new=w8-lr*d_eo_w82 l8 @1 I# L: |6 W
        #求b2_new- L5 G! l3 H4 v  r3 H& a
        d_oi1_b2=1+ B5 p. N2 U+ Y) n" S; N
        d_oi2_b2=1) X! b0 b/ T2 z7 J
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ( y& V2 E3 e; l    b2_new=b2-lr*d_eo_b28 n9 B0 r- m8 w% ]# g
        d_oi1_ho1=w5
    ; H+ a$ t0 ]  H7 x% X    d_oi1_ho2=w6. r+ C& p+ z  i0 B, i. |! C" e9 M
        d_oi2_ho1=w7! D5 f' a) z7 {3 I$ }# h7 u: E* }
        d_oi2_ho2=w83 ~8 E& [! I' Y- W
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    8 H: w$ O) }2 m" C# f    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2  x" L+ A% ]1 i* P
        d_ho1_hi1=ho1*(1-ho1)
    1 R$ |% N- s9 i7 r& \6 y    d_ho2_hi2=ho2*(1-ho2)
    * V1 p' T1 K  J5 v6 h) x, I+ S    d_eo_hi1=d_eo_ho1*d_ho1_hi1: c/ J+ d6 p+ v6 [1 }5 L3 @
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    4 z. k0 G( a1 k% [2 `" T    #求w1_new( Q9 q' N& `: O
        d_hi1_w1=i1
    & F% \) m* A% r0 J    d_eo_w1=d_eo_hi1*d_hi1_w15 l/ l  ?! u0 j: F% p$ B1 y$ x
        w1_new=w1-lr*d_eo_w1  I$ G0 f6 Z) [$ {
        #求w2_new
    1 j  e3 m* A0 ]* s0 H# E; F    d_hi1_w2=i2( E, r1 }$ ^! r0 N( {, ?9 ~+ u) O
        d_eo_w2=d_eo_hi1*d_hi1_w2
    $ [9 _' Z; p: N* x    w2_new=w2-lr*d_eo_w2+ b  Y% z6 e5 Q. F8 V4 }' F. ]
        #求w3_new
    $ Q# M6 Y- A  m% |    d_hi2_w3=i1' ^: k2 @6 x" v0 ^% g7 ]
        d_eo_w3=d_eo_hi2*d_hi2_w3( Y" D# ^( a7 o& Y1 y' C' ?
        w3_new=w3-lr*d_eo_w3& E' o5 B& i' r9 L& e  V
        #求w4_new
    + q; {3 |$ y9 \0 }    d_hi2_w4=i2$ {, M0 G: r! W+ O: @( r
        d_eo_w4=d_eo_hi2*d_hi2_w4) o6 g# ^8 ]# m
        w4_new=w4-lr*d_eo_w4
    ; E, w5 _  f* `0 o9 w    #求b1_new
    " C% L3 \: J2 [4 A  i# h    d_hi1_b1=1* P" F  H* S, W) F4 q0 l  m
        d_hi2_b1=1* q! K$ f& E( S* Y# x0 ]- x3 }" Y
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% j( p/ ~, Q  l  _& z
        b1_new=b1-lr*d_eo_b1% t7 a7 \, x' X; u: X* ^
        #更新反向传播; D- v. h% k8 U7 {8 [% I9 m
        w1=w1_new+ s& _3 R0 B& N2 b, s9 E- f
        w2=w2_new5 y- P' ]% @4 f9 r. a4 p
        w3=w3_new" K( I' ]5 j+ c7 B
        w4=w4_new5 h' c9 x* P5 D: x0 B, N
        b1=b1_new
    ) f. R5 g* B+ q* A7 r" m    w5=w5_new1 y( j5 G4 l1 @* X5 \6 C% s0 I
        w6=w6_new
    * B2 E* U. X9 m9 ~: N* ~) S    w7=w7_new, N9 [2 |' S( h/ J4 t
        w8=w8_new
    # z: R% m/ ^1 u4 j0 G* Q4 a    b2=b2_new. N" I( }. c. `7 U. ~$ u9 d
    print(f"当前计算总误差={eo}")1 d, o% \  |" p1 s; M
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    2 S6 t: z. F, i7 R% V+ qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    % z8 D0 }; k& V$ L' S/ Oprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")9 X: a& k. y3 ?0 t6 l+ N
    9 v3 R# a  D- Q
    结果
    ( p4 n* f" t& Q
    % p, h- o1 q9 H5 ]
    : X, ^# m# ^% }' E+ [$ {+ V% d结语/ \. j7 @2 \8 `  w
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。* t: S& z/ {' s* ~8 d& ?* A
    ! v% o. h( O! l7 i
    补充
      @( I0 m6 z+ z7 D/ c8 `6 T! |' V程序中d_{a}_{b}格式的变量表示a对b偏导
    4 R6 w) M6 r. ^5 o  ~2 X————————————————, ^5 U, @. S" o) y$ e7 r6 ?
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 s' z, F4 I2 ~, r$ p( y
    原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679546 e- w1 r$ L: `2 @& b) l
    & z* J* p' {# t3 X2 x# [5 o0 L

      t7 |: L$ `% W0 J/ a. ^
    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-10 03:22 , Processed in 0.796224 second(s), 50 queries .

    回顶部