QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2445|回复: 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 G/ N: c, n* \0 {8 v; j
    4 {5 ?& m% {/ u; U- W背景
    ( Q& F  ^; K$ C2 k$ q  @初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    + O) O  P! Z: e7 T
    2 i6 P2 r9 L) F/ [! v( _( J【神经网络分类算法原理详解】1 S- m6 S2 W; v: |

      ~0 h+ F, S2 [. A2 t9 j" u注意( x) g; T; X5 j0 D+ w
    站长提供的图片有点小问题,我们更正如下
    3 L/ S4 E  P/ x5 i" L; D  @8 j! u# ^& a7 E$ S7 U" Q, |, `

    * C1 H8 ?) V9 F! O/ C( X0 e$ K2 b+ _6 W% v6 Z. L- z
    问题
    7 {$ m+ O- P9 I) `4 y4 @( p根据上图所示,我们有已知& ^# A$ D$ x- R
    : E. S" b8 U3 o3 }- P0 h1 S6 S
    #输入层
    $ O* B  b! d6 }. r  X% J! }i1=0.05$ s" U4 b5 [3 j  w' V1 C! B
    i2=0.12 x' k$ l( Q# H

    % A. z$ Y! n7 K. F# q#输出层4 f! R% b# `. A2 C+ @
    o1=0.013 C' v% m- `0 q
    o2=0.995 L- k" s" z, a# [+ Y0 V- c5 a' k- S
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的5 A8 e4 c2 w' f0 |* n9 J4 y/ L( A
    " W5 d6 `8 L: a2 d
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1) D& t" h) V' ^8 ~1 C' y0 d

    " @* C( P5 g/ L6 o- F神经元h2的输入  (hi2)=w3*i1+w4*i2+b1* O( ~  I  g' H- ]# n/ M  e
    2 [9 z" s0 n0 _# R& h8 k9 D
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    / b4 e8 q4 d& S1 C- {: X- b3 p
    2 Y" d  f) a2 G7 M: `4 f& ^神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))$ n; ]1 i% u. M: \
    & Q7 d0 ^, n7 f  t  X% C7 M
    同理
    2 I+ _* P& Q" Y! Z8 X* K1 J2 R8 V% S
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))) k8 l/ r6 h4 Z! d& Q$ i

    6 A5 s1 R) X# _6 e& P接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式* T- Z8 u& B9 k8 m7 S
      [2 l0 |+ f; e7 ~1 y
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    ; a- d' U( n& r! ]$ E$ r5 ?
    / }2 ]7 ?3 A/ Y, r# N- A. t( ]神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2. H- g7 D4 M* P9 E$ _3 C
    . E/ u2 d6 w) f% v
    再经过非线性变换Sigmoid函数得到
    9 g0 j+ s: }- m, v+ V! T) Q" s: u/ `$ Z5 q8 G* C
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))5 ], ?2 h/ L  @! @6 F) f7 L0 z
    4 }+ J! r/ z. K( I" [  f
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    . z" h, ~2 j/ o! E+ b
    + x. ^' \( n8 ]$ S+ x' b我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    9 h/ }% F, f' C$ a" m% c8 p
    $ [. S/ n) F% E% Q; d损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2: d4 g0 ~  `# ?9 s( O/ b# C

    . I. P. o6 K' z( p! O由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足& H& _7 K# V) ]; P: W6 [8 g

    , D% @( p: a7 }) D' N学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    5 L* R. a+ A8 i! R. x% _' {" W# D, Z4 o4 `9 [1 d
    学习率 (learning_rate 简写为 lr)我们设定为0.5- c9 B6 z2 h2 R, o; s& \1 [4 h

    # [! Y( K+ }) `) h% |! z: p依次求解代求参数
    ) h2 W4 t% q. R7 J/ [. f7 |
    0 S& _; _- V; I" ~  h' \( Vw1~w8,以及b1,b2
    3 M  g* E0 U5 k( F
    % ~6 v" Q2 D0 Q% Y/ Y1 E! W, ~. k5 S7 A% S, h9 ^! O
    & o) u- b+ ~$ V4 V
    损失值 (eo) 的偏导数- Z  |% t& |: ], H" |* Q1 M2 y
    + ]4 `- c! S! F5 u8 E, C+ x' q( g
    再更新该参数,更新公式为
    & U  S0 j2 ~1 y: K
    ! r# A- M+ L" V参数_new=参数-学习率*偏导(eo,参数)/ L- P+ `3 u6 h! B& m8 v: [
    随后进入下一轮学习
    6 p* ~% `2 m3 l8 u5 [) ?5 I. w! F
    8 [! n% z, n' F- S0 E3 x; Y- [终止条件(满足其中一个即可停止训练)' |! v) J+ k3 r7 D1 Q, r
    . u( U6 C4 b+ K& `+ U% s
    1.学习次数达到上限8 [- ^# X- i! k# s$ ?  Z

    ) A& e! B( \! Q5 P2.损失值达到可容忍的范围! c; t; l% B  z0 a4 q& @, e
    7 h) E9 N2 U# j  @: f
    导数
    4 b' Q% y" V7 j  B, n% v  Rf(x)=1/(1+e^(-x))的导数是
    ( W/ }2 @' Z1 c- }f'(x)=f(x)*(1-f(x)): h* W& h  l; Y! v; s; p
    源码+ {) L( m. \/ O0 ^; ]# o+ P
    import math4 P& u; C- ?% u& M: q$ l% h

    - ^& ?3 @! q/ F- S6 h! ]( D2 W#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    , D7 J; A- b: f( ^( g#网址中图片有误,请看我博文上的图片! L8 a" \1 \/ l: W" F: B+ u4 a# l

    - r9 u& A$ ~5 e6 m  K, w% }#输入层
    9 K* F- r6 W4 j) A  _; }, Fi1=0.05
    ; Y) n) {5 s, v1 }2 j! f' mi2=0.1
      f* U5 d3 _2 a4 _/ @' D#权值参数5 e9 T) u/ @$ F; e* d
    w1=0.15! C7 F7 s3 n. h! p
    w2=0.2! L2 b/ x  G9 n0 W0 I* E- C
    w3=0.25
      v' c5 B4 L0 \" m- _9 J% t3 Bw4=0.3
    ' H( D, U4 [- H8 N, Ew5=0.4% p& W2 D1 @- Y
    w6=0.45
    9 s! J1 G$ P0 k' N# j) z- [; uw7=0.5
    ; E0 X# |1 Q2 ^) v3 Y: h5 m$ Cw8=0.55
    4 j1 {) F  J! t! i#输出层标记(即期望值)3 f/ y$ w5 a+ B/ a- X/ M. w
    o1=0.01
    & m! e7 ?8 T* {. x, ro2=0.99; n- M! F9 ^! H
    #偏置项参数
    / z' q! y0 g" @4 j# gb1=0.35
      `1 w/ ?, J1 ?4 }1 Vb2=0.6/ Y5 N4 E; R/ G" j! L+ h7 v6 Z
    5 U' Z# C  f3 [5 b
    #学习率+ S4 g/ e# l4 h# \3 ^4 O* M0 D
    lr=0.5' S* v( j" W- ~# \
    #学习周期
      o  M8 I) J. A+ b1 U+ ^! Llt=0
    8 H4 Y! \; c% Y1 w1 E, P- f* ymax_lt=10000& L9 O5 E& c; P. \
    #允许误差
    3 i* p! l  p  b3 M% z& f! Peo_allow=1e-56 d1 E: ?2 C9 `& U

    , j9 q; n; K! C6 |3 B$ B4 B  g#线性转换
    ; Q, S* Y( G9 d* ^def linear(w_one,w_two,i_one,i_two,b):3 O$ R: n) Q4 m1 R( ~8 M
        return w_one*i_one+w_two*i_two+b7 q$ W4 x7 q% U2 G8 t2 a
    #非线性转换1 E7 e8 a9 n" x( R7 `! y/ d4 G
    def none_linear(i):& F) ^; P7 {( k6 J0 ]4 V1 E" z
        return 1.0/(1+math.exp(-i))! |( `+ B7 Y3 \: B0 `9 }3 n

    9 [3 r# T) P' G+ v9 w* R, s2 Tprint("训练开始")! G+ ~" _# f8 q2 {5 E
    #学习周期结束前一直学习0 Y4 |" p) q3 X& S
    while lt<max_lt:0 z5 M- @" C' F, x' ]3 D# v
        lt+=1# L8 C. y- O! K% a# b& [
        #求h1和h2输入值7 O- d) z( U- b1 Y- z% n
        hi1=linear(w1,w2,i1,i2,b1)
    ( `! Z+ i( o0 [: ~    hi2=linear(w3,w4,i1,i2,b1)
    & q+ w: b1 O" D, p9 {" {7 P$ ~8 ?5 {    #求h1和h2输出值
    0 Y  t$ d/ G! t" h6 s    ho1=none_linear(hi1)
    ; e$ W9 Y, P8 S' f    ho2=none_linear(hi2)
    / C5 K: T+ P% }- y. N6 O3 ]8 q    #求o1和o2输入值
    7 V! T/ V8 ?; o8 u5 |( \, x    oi1=linear(w5,w6,ho1,ho2,b2)
    4 w) E' |, Y9 z, ^% k& W: \    oi2=linear(w7,w8,ho1,ho2,b2)+ J. f& Y- L( p: {0 ^; `" d  G0 }
        #求o1和o2输出值
    2 _% z6 y$ S. j5 o    oo1=none_linear(oi1)! f, B; S) I, t# K- l/ L4 g2 t
        oo2=none_linear(oi2)0 v' D6 S' A2 s$ f3 `; C

    + G9 |0 v7 a" @7 g    #求当前计算总误差$ S5 ^) i+ ?9 @. X- J2 {
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/29 P$ q0 h7 ]5 S: Z! X1 F+ q
        print(f"第{lt}次训练,当前计算总误差={eo}")
    9 q6 }) j& y2 i8 x    #误差已经在允许范围,退出训练7 n4 Q% V# y9 ~$ @1 |& a  _
        if eo<eo_allow:
    + ~/ ]' y1 ?& H8 b5 N/ c3 D! ^        print("误差已经在允许范围,训练结束\n")5 X+ E8 K  [& V# }* ^+ r" a
            break* E! ^5 n' L' k8 A
        #偏导
    ; }8 S6 \( B5 j3 i# `    d_eo_oo1=oo1-o1
    1 Z9 `6 V% n- H9 A; U    d_eo_oo2=oo2-o2
    0 C9 @. F+ }, Q# A+ E' O    d_oo1_oi1=oo1*(1-oo1)
    7 s6 u& [$ k+ w1 ~2 r    d_oo2_oi2=oo2*(1-oo2)
    : S' d  b( N; p) W- c7 U& F; b5 |    d_eo_oi1=d_eo_oo1*d_oo1_oi1; t; t8 m5 }: o, e. P/ ?
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    9 I' u5 q( O! I7 d, R: e    #求w5_new; i! @7 s5 z( W& H6 _8 v; X! f
        d_oi1_w5=ho1
    1 F0 m; u! _) g8 }% x) w    d_eo_w5=d_eo_oi1*d_oi1_w5( A6 l9 A5 b' D( Q/ _; ?9 k
        w5_new=w5-lr*d_eo_w5* I: J. k" d# z  Y1 f1 I
        #求w6_new
    ! @$ H9 r% p! m    d_oi1_w6=ho2
    # U! `* n6 k6 m    d_eo_w6=d_eo_oi1*d_oi1_w6# p4 A* Q' a. c/ \0 a2 c
        w6_new=w6-lr*d_eo_w63 H9 P' |; {& P) }
        #求w7_new
    7 ~0 a/ U0 Q; v& l  a, H    d_oi2_w7=ho1! j7 r" |  n5 j
        d_eo_w7=d_eo_oi2*d_oi2_w7
    ! T' ]2 v! q" m6 M' F0 n% W) c+ A    w7_new=w7-lr*d_eo_w7
    % W1 F5 y) }! s2 {& w    #求w8_new
    ( X$ f8 T7 Y6 S; z1 [6 D    d_oi2_w8=ho2
    9 `, l9 @) A% g' v+ C, S4 h    d_eo_w8=d_eo_oi2*d_oi2_w8$ l, C9 l) u! Z7 p! c* \& q
        w8_new=w8-lr*d_eo_w83 e7 n4 C) M! p1 D* S
        #求b2_new
    6 N! J, M/ T: C' D! t! q0 z    d_oi1_b2=1! B2 ~1 o8 R# p3 F2 p) J
        d_oi2_b2=1, P5 J: U+ s" L. l
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ) ~- D  z$ V' w    b2_new=b2-lr*d_eo_b2  r. v/ P8 e1 S) r) z
        d_oi1_ho1=w5+ E2 x1 w3 M, G; g
        d_oi1_ho2=w6: y* v. S1 \: l/ U6 ?0 A& H) T
        d_oi2_ho1=w7$ \9 p; a9 m  m( m
        d_oi2_ho2=w8/ O+ ~  P2 W$ T4 y$ l+ R( m
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    : t/ w# a6 q# R# O, B3 ]    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2+ F  m& t0 K3 K3 E9 N6 h0 A! G
        d_ho1_hi1=ho1*(1-ho1)1 X5 U( h2 g2 D2 \( ~/ |
        d_ho2_hi2=ho2*(1-ho2)
    % [6 g6 O9 q; R& z: L- X; Z    d_eo_hi1=d_eo_ho1*d_ho1_hi10 l$ I$ F: G7 @6 z. l
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    1 i0 H' P3 u/ j/ @2 L    #求w1_new9 Y& P2 L/ _0 @* Q2 N4 w7 a( ^2 u
        d_hi1_w1=i1) K( Q, ^0 |4 ?
        d_eo_w1=d_eo_hi1*d_hi1_w1
    ) C! W3 n9 i+ l. Z: |    w1_new=w1-lr*d_eo_w1
    6 |1 Z  N# K) ~" D& l# Z* I    #求w2_new
    % R. q* e0 ~3 o& _& T3 F, c& v    d_hi1_w2=i2
    # c3 p/ m9 T' |& |; Y5 ]    d_eo_w2=d_eo_hi1*d_hi1_w2
    , @% O3 U0 l: O: s( i    w2_new=w2-lr*d_eo_w2
      A5 G& l% [1 s    #求w3_new
    7 i  Q  q! C1 [& ~% c, E! V    d_hi2_w3=i1
    6 f' ]$ {$ l' f    d_eo_w3=d_eo_hi2*d_hi2_w3- E5 U/ e* p3 e
        w3_new=w3-lr*d_eo_w3* M2 E+ q% F0 ~/ F/ `
        #求w4_new
    , k" N+ {2 d% V4 y    d_hi2_w4=i29 t! {8 c" A# _$ V
        d_eo_w4=d_eo_hi2*d_hi2_w43 _9 Y3 `& R) c9 V% o
        w4_new=w4-lr*d_eo_w4- u+ L8 P1 m" A) R/ `# z1 R' P
        #求b1_new- B" d8 l5 n2 g( E0 U7 g0 M$ D# N
        d_hi1_b1=1( W0 x  u) B1 W, d
        d_hi2_b1=1
    % A! v: X: J. N" g$ ^    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1: j3 V. o+ a. s/ o: ]
        b1_new=b1-lr*d_eo_b1
    % @* J) e* I' N0 [" A/ K    #更新反向传播3 \6 J& q! \/ L0 q# k1 t2 H
        w1=w1_new
    + R/ Q" d, F, N6 z! }% ^/ ~" s    w2=w2_new" q0 o+ p& X! C0 f4 ~& _( l1 ?
        w3=w3_new
    ' w1 a) k+ N. F! c! O" d    w4=w4_new
    % Z. J, n& W& L5 j% n6 \/ g8 F    b1=b1_new( N1 q0 ]+ L/ @. M! R! g
        w5=w5_new
    & D1 V6 f# O, B& I+ H' r% F    w6=w6_new" t& P3 J( B7 C6 [' i# v! n
        w7=w7_new" V2 a2 I+ V$ e( r7 G$ ~2 R9 X
        w8=w8_new3 I  P9 q/ \0 p7 ~
        b2=b2_new; E2 W- [4 E9 |& }4 d, U
    print(f"当前计算总误差={eo}"): |$ S( e. A4 g6 n2 [4 G
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    + h# i' {1 k8 \& d, H9 qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    * \7 L) g/ {* [0 w% S# _  @  cprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")" T) u8 C% G; K/ ~- h, y7 j+ R5 {
    : K1 ~: l3 `! G$ M
    结果5 I8 U' Z# i( s! T

    * i& |& F7 N! N: x! y' E
    : U' @$ w# T9 d1 A& H" H4 P) H5 g+ G$ I结语2 J+ M. t2 G: h
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    ! t% D1 k# R' l9 d" n+ u  z; F) c) v, I3 x: x$ J- \( D4 w/ c
    补充
    ( o8 q* o# Z: t, a# N- x" Y程序中d_{a}_{b}格式的变量表示a对b偏导
    0 G0 E4 o4 B0 \2 T: O2 a! u: `# h! r————————————————" N4 z$ L9 a% }$ W! i; s
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : V" P. q4 p% j  I9 j% ~, [原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679541 C% d8 N$ `3 A' C
    4 @5 M+ o8 ^8 \6 s: E1 B

    6 U7 Z  i2 _5 {( D  `; K; |
    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, 2025-8-15 06:37 , Processed in 0.454829 second(s), 51 queries .

    回顶部