QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3108|回复: 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实现)$ \1 }; ~: A, ^9 u1 G% y" }1 N
    , A) c+ l3 |8 T. Z7 X
    背景
    8 c. V- m  S, ^1 F$ I初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下$ o4 ~# m" [* m. }2 S

    3 r  s# J" p+ s0 {( P6 i1 [8 d【神经网络分类算法原理详解】
    . [8 G# k/ O8 ]8 Z! W8 J1 ?* H5 s( z% a0 b3 e
    注意6 ^2 Q% N  V. j
    站长提供的图片有点小问题,我们更正如下: h% a  ?- z7 U. [$ Y

    + p" U' z& l& |; K" r4 b- y% S$ U8 n/ K" M- I

    5 U1 G6 R( Q9 Q6 B+ r7 Q问题" q# A2 o- ~" H, z
    根据上图所示,我们有已知
    : H% T$ u- A0 M% R* y6 Z- q, {, l: m* Z0 z0 W" H' ?1 f
    #输入层
    $ B' W# C  r: V( zi1=0.05
    . X6 X1 V  i1 ?4 Y5 S* k; a" ti2=0.1
    , L% K/ U  W( u
      Y( H% R$ @3 j% S) ]! x1 z#输出层
    # h, `. m" D5 x5 I4 Ao1=0.01
    ' ]2 l$ E6 F3 jo2=0.991 G2 ?; Q$ }2 g# y; a) N
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    8 W& E1 }, I2 e: a* z' ?! Z/ G6 w7 Q* T- r" d1 y  ]
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    / R) H& |: H+ v$ P; p+ Y; o0 y; f/ b* H* |' n( p
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ! A* t- J% i* u& z) B! V# U' B; d& b
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出6 k% J/ K, e; I9 L1 m
    ! J% C6 L! q+ n9 r7 J& x
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    3 F) Q6 u  e3 f$ M* |. s6 \' d& q8 \3 Y: H3 A
    同理# }' B4 [1 X+ K* z# e4 F

      {% W! C* W% X神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))1 s0 L5 D' A- y1 s# }2 Z# j  t# K8 T6 g

    - B4 T/ X) ~$ _' L$ q  |4 u' V3 `接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    ! U. C6 k, E! x2 c6 p" M+ r- B2 n
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    ! b4 P( z( P, K; S: f- v( \9 d5 c  _1 w# u* z
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2* Q3 u- L* A/ j9 X+ ]

    & S, O  F+ `' B2 O7 ]再经过非线性变换Sigmoid函数得到
    + M- y' A$ |( e; [/ h1 R0 i& e0 _; F. s1 b$ p8 Y1 @2 _; S
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)): @* X  V6 y8 m# }: ?1 ~

    / A, R1 J/ }1 F9 f# n  l神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))# o6 i5 ], j+ Y  j
    ) ?, I1 c5 S8 g( K& F" A
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    2 R9 X* G% d6 X" V; i8 h* T  e, K$ t( {! C- A- u$ P0 b9 E* v
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    4 M9 u) J) p9 X$ o# D0 B; j+ Y8 b+ M
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足9 ], T: P6 v' R: f: Y8 g

    ) R" l0 h* x9 j; V& _学习次数 (learning_time 简写为 lt)我们限定最大为10000次. P; S9 G& n( U5 S7 ^9 V" K  `3 i

    ! P/ C2 k% R# G学习率 (learning_rate 简写为 lr)我们设定为0.5
    " _1 C2 B- {$ Y* o$ _7 L# L1 _$ D4 z3 X& t% K
    依次求解代求参数) k9 E6 l# L6 Q! V; O5 {/ e) [6 u
    & q( F  n" x2 B. A$ z6 O
    w1~w8,以及b1,b2
    * K7 V/ F4 }$ \2 \8 J) S! k* i% T* I7 C/ U$ q+ o: e3 ^
    跟
    . D0 K$ U$ j0 s3 s/ N. l$ k5 J6 f# j: {# s" y: X# I2 v) g. }
    损失值 (eo) 的偏导数5 P8 O/ ~0 z: E+ S% G1 Q
    6 W7 F$ H, h: J, U$ |9 t1 \
    再更新该参数,更新公式为
    7 L: q/ Z1 N# }5 ^' \, _$ R
    - q1 `) |/ Y$ w  C参数_new=参数-学习率*偏导(eo,参数)1 v. @: b; Q/ `$ a
    随后进入下一轮学习
    ( _: @3 e' ~) e7 X' G" o% ]8 ?0 d' m9 a1 D
    终止条件(满足其中一个即可停止训练)' Z  b* b- [( i5 L5 Z
    ( R5 ?% P9 `- {) }3 t1 R# G
    1.学习次数达到上限
    2 D* w$ @1 v; c# e) k' f5 ^& x" b* X) \) a9 K! W0 w
    2.损失值达到可容忍的范围- A& [. m4 G7 _. z( f  A9 g  i2 p
      s, R; b. w4 g
    导数
    3 I: g6 H4 a  q/ ^$ {( xf(x)=1/(1+e^(-x))的导数是
    ) y5 P+ y8 I8 l; P; ]4 L* c: {9 F- _% If'(x)=f(x)*(1-f(x))
    ' m; v, {! W: h) \# H源码
    2 R$ e: x  }, T  z+ |import math
    ' n( z7 n. H( j' C. K; i6 J( t8 z: D, z4 O
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    : ^8 A- N5 @! J7 A9 F+ ]3 Y& Y: G# T#网址中图片有误,请看我博文上的图片
    4 p3 T3 a8 i& n3 Y! u
    ' [% x9 }4 r" \/ C+ w1 }#输入层  K" f, w9 q! [6 f/ _% x5 P
    i1=0.05
    / _/ `* ~7 h/ n( f6 y$ gi2=0.1  h9 M9 p  n' |5 k1 _9 L( `7 m
    #权值参数! M+ e3 N) R" w- o9 n
    w1=0.15
    " r  @: ?1 B: ?7 F: j) S6 @w2=0.2
    1 _0 `( {4 Q6 k# C6 Iw3=0.25) ?0 f6 a' n1 ^1 f2 k; k7 @
    w4=0.38 X, v6 _8 Z( w% f; O
    w5=0.4
    + V6 V8 ?# u3 M4 d" S+ iw6=0.45
    . h- K: [4 Q. ?0 _. F  m; k  Aw7=0.5" L- p' z1 w( I8 g
    w8=0.55
    ! ?9 I$ R% D* H  {% c/ K+ U9 J#输出层标记(即期望值)
    ( i0 ]1 G% h) t2 i7 w7 u7 `, eo1=0.01
    + ^$ J# ]9 k1 j4 o7 o; @o2=0.999 A- \/ Y4 H! k: w
    #偏置项参数
    ' w( Q( ~1 t# ]/ S9 c& b$ tb1=0.355 P7 U# I% c8 e: |
    b2=0.6
    + O! m: o$ U" a' o& a9 M
    , ], q; |! ~* f9 I! Z0 Z4 {! m#学习率
    5 b* f* o9 t" y, c7 L6 o+ @! Alr=0.5! J6 ?* P! }0 ~3 w3 u
    #学习周期
    4 m- M1 K, L) I3 h9 elt=0
      J' S& Z0 l  m% v2 |7 Omax_lt=10000
    / H6 h: S3 V4 {" q- s( @1 ~$ n: E#允许误差
    ! r7 j& |9 }2 |4 g5 k- {eo_allow=1e-52 Q& h1 \" ^* G
    0 x0 f  m' g7 c3 r% A& Y9 c9 E
    #线性转换1 r! g2 e0 \, E1 f4 Y& E% p
    def linear(w_one,w_two,i_one,i_two,b):( V3 g3 H5 T* N0 l% I. U
        return w_one*i_one+w_two*i_two+b7 z; {, Y3 ^3 O' c( [; `: {
    #非线性转换& d8 N/ ~+ j5 G9 V* k
    def none_linear(i):
    ! ^* u) w4 y, b/ y    return 1.0/(1+math.exp(-i))( F/ R7 f% n0 y: e

    7 E+ }- E* D2 u4 J9 ~6 Y- [0 fprint("训练开始"): X: Q: [. [& K  D
    #学习周期结束前一直学习3 W- w) X6 W& C) s  m' R( o
    while lt<max_lt:% o% @! ^4 E$ \# M1 e( I
        lt+=1
    8 o4 P* I! r% y3 I    #求h1和h2输入值4 H+ E4 A' g; F8 i
        hi1=linear(w1,w2,i1,i2,b1)
    ; N4 g& x; d" j; N- J    hi2=linear(w3,w4,i1,i2,b1)+ W, M( v1 p1 g$ k- q
        #求h1和h2输出值7 n' L/ X) [0 A% j3 M& J1 \7 R
        ho1=none_linear(hi1)
    * w: {4 I+ Q) ]3 k8 d$ t0 G, N    ho2=none_linear(hi2)
    8 h; Y' ~+ W  Y1 p3 c    #求o1和o2输入值* ?4 u6 L* w8 [- t
        oi1=linear(w5,w6,ho1,ho2,b2)/ W% `" g, S' C; F( E
        oi2=linear(w7,w8,ho1,ho2,b2)7 f3 w3 R( g2 B% C9 [
        #求o1和o2输出值
    5 l1 e  r4 D  n. u2 Y    oo1=none_linear(oi1), N9 j4 Z0 m* W
        oo2=none_linear(oi2)$ w8 e1 g  A# F. {+ O/ `
    8 ]% k5 d$ q! ]2 o! D: B& N
        #求当前计算总误差
    * ^1 L  s! V3 P    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2. |3 H* H8 x8 S, Z* |2 n
        print(f"第{lt}次训练,当前计算总误差={eo}")
    & M4 Z1 r- q* R    #误差已经在允许范围,退出训练
    9 u" \# s4 A+ N( h    if eo<eo_allow:
    2 h% D' D$ B8 k. X, f$ U: v        print("误差已经在允许范围,训练结束\n"). r6 ^3 L. c: y! S2 b
            break
    ) I8 Q5 y3 l* Q" Q! {" V    #偏导' i, P: ~- m" O
        d_eo_oo1=oo1-o1! o( [8 _& N/ s: y) Y: c  ^( I5 a
        d_eo_oo2=oo2-o29 z0 E( Q$ p' |" P; w4 }* M
        d_oo1_oi1=oo1*(1-oo1); c/ w# p7 Q. ~/ G" z: x: ~8 O
        d_oo2_oi2=oo2*(1-oo2)
    - k. k, E. [' N3 B    d_eo_oi1=d_eo_oo1*d_oo1_oi15 U- V0 z# ^- E; M
        d_eo_oi2=d_eo_oo2*d_oo2_oi2$ }( a: r( {8 Y! l
        #求w5_new
    . B. Y& l& h: w8 f7 ?    d_oi1_w5=ho15 z; T. K6 L/ k5 k8 x# m& A
        d_eo_w5=d_eo_oi1*d_oi1_w55 S; v" s' e6 O8 C4 ?/ P0 E
        w5_new=w5-lr*d_eo_w5
    6 z8 h9 \7 U3 t4 J* Q( b% v5 Q    #求w6_new
    ' U) \6 ]2 m! ~7 `    d_oi1_w6=ho21 J# R: _# N5 A
        d_eo_w6=d_eo_oi1*d_oi1_w6
    , c' n# s- S' e6 T    w6_new=w6-lr*d_eo_w6
    & P( V+ h5 K. T& v% ]    #求w7_new
    8 K# l2 L4 f! |1 |  |    d_oi2_w7=ho1
    + I3 N/ h. e6 h    d_eo_w7=d_eo_oi2*d_oi2_w7
    * `+ r( Y* W! L  J    w7_new=w7-lr*d_eo_w7( e4 H9 c) l2 T* o8 Z4 i" F* |
        #求w8_new
    + i( k! l  z" @  c- Z    d_oi2_w8=ho22 \# d2 B9 Y' ?, B) y: }
        d_eo_w8=d_eo_oi2*d_oi2_w8/ B. p, l, z4 R7 d% g3 G! f' U
        w8_new=w8-lr*d_eo_w8
    , u& `( ~% B1 I    #求b2_new7 D) [( X  g) \7 a5 `; o1 E* E
        d_oi1_b2=1; N0 H8 f* l) R# m# Z$ N( m
        d_oi2_b2=1$ M% K. J- g, V1 f
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2& o/ @8 `/ s' D
        b2_new=b2-lr*d_eo_b2
    5 e3 n/ S4 r5 p& F: X$ V    d_oi1_ho1=w50 |$ P: C0 J4 {
        d_oi1_ho2=w68 b0 P% J3 [* t+ M" ^
        d_oi2_ho1=w7
    ; ?4 P$ _: @7 S6 [5 l, t    d_oi2_ho2=w8: K1 E2 ~1 E( h
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1  L/ r$ M7 n' Y# t
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho20 Q$ t% x. G" R$ C& H5 g7 ~* K  u
        d_ho1_hi1=ho1*(1-ho1)7 P' ^8 b* _  ]/ B
        d_ho2_hi2=ho2*(1-ho2)- Q, N9 G% j9 g/ Q' Q
        d_eo_hi1=d_eo_ho1*d_ho1_hi1# G* I; X1 c4 Q8 \
        d_eo_hi2=d_eo_ho2*d_ho2_hi2, C( I( D9 |- h: @; y
        #求w1_new
    ) [  `, P  q/ N' m2 D1 U  h    d_hi1_w1=i1+ F: ~( s  c- ~, k& I. d! u. n& d1 }
        d_eo_w1=d_eo_hi1*d_hi1_w1
    6 z- B$ ]4 S* V- {2 I, B/ k/ Z    w1_new=w1-lr*d_eo_w19 p9 Y0 j: ?; h, ]; s, T2 U* u: ?
        #求w2_new: |8 \, }  q+ t7 ]6 k6 |4 C3 F" n
        d_hi1_w2=i2% D1 F) b9 j+ r1 T- f3 ?6 F
        d_eo_w2=d_eo_hi1*d_hi1_w2  {; o" U7 X# v
        w2_new=w2-lr*d_eo_w21 H3 h8 I2 m% ]6 T9 w8 u5 V3 T# R
        #求w3_new0 b4 \) {; `7 h2 p" ^; C% u4 ^7 T' x
        d_hi2_w3=i1
    * l. V: F* X, ^# ]( ]! E    d_eo_w3=d_eo_hi2*d_hi2_w3, d6 @8 k9 H9 ]0 D: Z/ u
        w3_new=w3-lr*d_eo_w39 ]& S5 X0 i3 H$ i
        #求w4_new+ Y; }0 g) u7 f5 j! B- p' g
        d_hi2_w4=i2/ s) f' N+ Y7 X# q5 T; X
        d_eo_w4=d_eo_hi2*d_hi2_w4
    . i9 h6 ~! a% M9 t5 W, t    w4_new=w4-lr*d_eo_w4: k4 b( @2 E$ Q+ y
        #求b1_new
    + T1 @1 Y  U+ \% n    d_hi1_b1=1
    & x$ Z9 g( L3 _    d_hi2_b1=1
    . q  L- A- t/ T$ k    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% _7 Z5 @9 w$ y, Y
        b1_new=b1-lr*d_eo_b1
    3 x! a0 u6 U4 F/ O2 B    #更新反向传播
    : N4 j; z  |/ V' z    w1=w1_new
    1 ]2 i: E0 j/ }  [5 B    w2=w2_new
    ' T% u+ l- N  w, X# R    w3=w3_new
    ' @, h) S, U1 R    w4=w4_new
    # c. ~' ~: J3 o    b1=b1_new7 f* `' m9 H' F  v/ E
        w5=w5_new% }1 x. t, O/ g) p; K2 p
        w6=w6_new2 W% I0 S8 G& \' u0 T! h
        w7=w7_new
    : \( q4 E2 s. w( h, h  ?    w8=w8_new; e) G: e" ]9 E& {% b
        b2=b2_new
    6 x5 S% B  Y  d8 F$ Qprint(f"当前计算总误差={eo}")5 I. I" u$ P( c- U
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")) L; P0 [/ t( ]" m7 x( v
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    - ~6 }  a. Q& ~6 r% I( s  o' A7 uprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")6 S$ e* }" P2 ^2 I1 ~( `- h
    , w2 I! z% e" A( F) y6 K
    结果
    * {1 i) j! U+ k0 R0 I" H/ Y) F6 k1 n8 _( q5 j) o, @

    : }, U7 v4 R: Q% p' w  K5 `结语6 M( M( K8 E6 `4 T: G( N
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    : f8 ]3 \6 c" m3 h2 `
    9 l; o% ^! @: p: M: v: `补充; {$ |4 Q$ L& S  s
    程序中d_{a}_{b}格式的变量表示a对b偏导
    1 m7 {. u& a+ t9 z————————————————# e! B: |+ L% w
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( n7 Y* F/ D, Y* Z" V原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    , b# c# M$ h2 R1 l* u$ r7 o2 e1 e2 T. r3 l4 O* J! u* }4 J& g' c! _( I

    1 W/ B6 t4 ?+ b, ^0 U" q* l
    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 10:44 , Processed in 0.307530 second(s), 51 queries .

    回顶部