QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3110|回复: 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实现)) J2 F4 ~8 A) N$ T
    8 O% E  [; }  i% v! |( Y8 Z8 A: u+ b
    背景
    $ j( ^# t- {  c& K初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下5 A& p; i1 ~$ x, ]. }
    * U" j) d/ a" v4 q
    【神经网络分类算法原理详解】
    , ]$ h: J# z3 F" s/ I
    $ b+ ]. l6 M: P' f. a; |注意: j9 g3 Y; |  b# M* @6 w
    站长提供的图片有点小问题,我们更正如下
    / w: v& e. f4 o* b1 h, o2 H: F  q- x/ G# o
    / Y. k9 s+ ]9 ~
    : [( t& I) u- B8 }: t- ~: s
    问题6 F/ N9 C3 l9 C7 z
    根据上图所示,我们有已知( }8 q6 p  u% F1 {" e
    9 l! {) `# v; F1 M
    #输入层% i: s- u7 q" r
    i1=0.05; P# b1 j! M/ ?% R' w; n
    i2=0.1
    / `/ T2 b. t7 n1 ?$ U  v  p3 G2 C
    #输出层
    ( J3 a- d1 l$ _9 Q$ U  E0 Ao1=0.018 n4 [/ T  z. G5 S6 K- `% I4 j
    o2=0.99" N" B" m" u  ]: n( Y2 C7 N
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ) g8 e$ G+ x+ G' M5 c  ^
    & d8 n$ ~7 t& V1 G( d; {# \# M& l神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1  A$ {  I( a" ~6 l+ D; y- v

    9 a* h" k& W$ w# Q" t. a神经元h2的输入  (hi2)=w3*i1+w4*i2+b1& K4 ?9 ?& S7 A+ O0 M2 P
    2 c! F+ c1 M: Z, _
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出- T4 F6 B2 D: D! k

    9 J- h6 m8 r  A- h+ i神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))( m+ w9 j$ O: M8 N3 f6 \; k- H

    ) u) k) X7 j  ?' c  d同理
    0 I" K6 h! T( Y4 j* w& l8 C0 K" p; @
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))+ H0 J% ^8 G" h3 W" t

    ; q& D  q2 y2 V# w接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式; b$ a, M. F+ o8 b5 g: z  z
    " v  q; @+ j. M
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2$ p- h* u; \/ u2 ~/ A2 r  w
    & o4 f; P6 ?& O! A( ?5 F  ^: S( r
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2# p0 {2 P. g# X: W

    4 f: _* X/ C6 v# k( j/ ^再经过非线性变换Sigmoid函数得到
    3 y& O+ f" B9 t; \* d% u" C: c3 q# G  s2 h8 o& M% k' P$ i
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))' j3 |- k2 P& V0 h
    ; P! W1 ?$ `( e1 k" X* O
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))* ?% |" ^8 x9 @4 @& Y
    ' _- @9 a6 }+ G2 _, t% N  u+ |
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    7 F. @% H$ j% H9 z
    5 B2 h* d# q$ y  [损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    ' h& m! d7 I9 ]7 g$ }2 w, p4 r. n/ \
    ' R* s. Z4 j5 V& a3 I3 f# ~2 {, A由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足- h, r6 U, U# ?8 o- ^

    . {" w( t1 T& q2 v$ a# m学习次数 (learning_time 简写为 lt)我们限定最大为10000次: Z4 ]+ Z9 Z) P; ]7 n8 p8 I

    " b, r$ K/ _0 A$ \' B% @学习率 (learning_rate 简写为 lr)我们设定为0.5* Y1 V2 M! m) L# X& g8 L$ f

    9 k6 F7 K0 T& y8 B+ k( {. M% `  d依次求解代求参数
    & z- ?3 T3 p6 p/ {# V/ `
    % N1 i, m1 W$ y' W+ U' aw1~w8,以及b1,b2
      v) D8 |: D; A
    + M7 a: K6 l1 w跟
    ) j" X4 D% Q$ h0 C0 J% G/ d% S3 Y! a
    ) N- Q7 w% _3 Y: t损失值 (eo) 的偏导数
    ! q. E/ B' J; k0 m6 G/ V6 O0 u, n0 N) ?- I5 p9 {
    再更新该参数,更新公式为3 R( R: h$ E, l3 @

    ) _; m0 H2 f4 t( B4 _8 P1 I$ g参数_new=参数-学习率*偏导(eo,参数)
    6 p' @2 C+ F$ e9 p% o- L6 l随后进入下一轮学习1 \6 R$ M: {4 l; j
    . m: e- |5 y. o4 N. x
    终止条件(满足其中一个即可停止训练)9 Y+ q' m- V1 y
    4 C7 ^: O) v1 Y
    1.学习次数达到上限
    $ k3 q# \; ]: I5 p- X, m& E* c2 h6 _9 v( J1 p
    2.损失值达到可容忍的范围
    9 Y# K4 x* {. R6 `( z( A: L7 @
    . T+ f; B# v+ _, w/ ]; r  _! D& g导数5 e2 Z' x  p8 c+ B) X) e& N" V
    f(x)=1/(1+e^(-x))的导数是
    ' u7 P. k3 y. q& g" nf'(x)=f(x)*(1-f(x))( K. D' G$ x9 c5 ]
    源码
    # P; t8 k  x  r+ S5 Simport math
    , c6 O" B, a4 O1 v; r
    & N) `5 `9 n! C$ Q#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】9 N* v1 R( ~5 l, f, s; j0 r
    #网址中图片有误,请看我博文上的图片
    # s5 e! i% g) {5 O" S  A, v0 d: r7 I3 J9 I/ _; A6 F  V- W, H
    #输入层3 R! u$ W/ X9 c" D& j
    i1=0.05
    1 ~/ e! T* Y' I1 gi2=0.1- J8 e3 N+ z, w+ l
    #权值参数" V9 \6 A9 a8 l1 j8 n8 ]
    w1=0.15( V4 V0 ^6 h  G( I7 J0 }0 y
    w2=0.2( R/ @: N: I0 L' F8 E. N- B
    w3=0.25- @3 n- m6 t, E! Q' L& c/ n% w8 r4 b1 K
    w4=0.35 C; a) _. [1 M; o
    w5=0.4( F" |% Q9 K! S0 E& z1 T2 |1 t
    w6=0.45
    ( B2 k, `! I+ r4 K, e" |w7=0.5- F, g4 M# e! |$ K# X2 n' R
    w8=0.55
    0 s  m" I/ S& I6 U/ I#输出层标记(即期望值); M( L" P8 Z. q8 P( X# m/ L2 b
    o1=0.01
    ) K2 t0 r6 v) o: d0 S& @; C2 {) h8 b. \o2=0.99  p5 t8 c' I  g
    #偏置项参数
    1 R5 j0 u3 E: u2 t7 tb1=0.35
    0 Q* r+ }7 ^) K2 M4 f0 |  Y. |b2=0.6; _- |5 v, O/ `9 P" J

    : E3 C; P/ {& [; e#学习率$ i; v" ~, `% i/ n
    lr=0.5
    # ]: S1 j9 y/ ]" ?/ k5 |: [#学习周期: S- Y; S$ Y( A( r0 j, q6 e; i' ]
    lt=0) ^! t4 R8 X2 R6 F2 v  ~) Z1 M
    max_lt=10000
    ( I8 C  z# \. h$ _% t#允许误差
    : M+ e$ L! i* j7 k7 x  T  `3 ~eo_allow=1e-5$ k" U- V! d& a8 |1 v0 Q- b' ]
    " P& d: S  c: Z# [5 i, z
    #线性转换
    2 _' J& b/ B$ G, d; ~; Fdef linear(w_one,w_two,i_one,i_two,b):
    7 i4 k' V8 {  f% {    return w_one*i_one+w_two*i_two+b8 d" S& [& _* G1 ]
    #非线性转换4 F4 @: @9 {" Y1 F4 Q7 l" G
    def none_linear(i):7 `& \2 U7 Y% H4 Q6 l3 M" F3 z
        return 1.0/(1+math.exp(-i))4 G9 V3 _" z' J6 Q& M" m& a9 I

    0 G+ B! v0 E% A. Hprint("训练开始")
    ; R- ]' n7 J, ~% B* K8 G. F4 u" l#学习周期结束前一直学习* q( a" h, ^7 P" |3 ]
    while lt<max_lt:
    . O) ]1 Y& b% a& o4 G' K  f* Q    lt+=1- Z0 B. q& w. k/ u
        #求h1和h2输入值
      I9 g/ Q, g+ M* u, l. ]7 S+ {  B    hi1=linear(w1,w2,i1,i2,b1)
    0 R% K' v4 F* g: k# i, W; A6 u    hi2=linear(w3,w4,i1,i2,b1)
    3 R' j  |0 G# e/ i) {: h( o- V    #求h1和h2输出值
    ! Y) Z! Z; o& E0 B7 _9 W0 D1 R( S    ho1=none_linear(hi1)
    ' j+ ]) Z2 u- C8 ]* x7 M    ho2=none_linear(hi2)
    . x0 [, v* b* r4 m    #求o1和o2输入值
    $ q& Q8 \+ T. _2 l  D" `0 a    oi1=linear(w5,w6,ho1,ho2,b2)
    ; J2 J5 q0 ]% c1 a- |& B    oi2=linear(w7,w8,ho1,ho2,b2)
    : `( n# i6 @3 ~    #求o1和o2输出值8 w/ d0 w" J% _6 Z/ e$ W
        oo1=none_linear(oi1)9 Y" h& [; @3 [7 X
        oo2=none_linear(oi2)
    3 W5 t( m" F; s3 ^& B, b. B/ b" Z9 `4 A4 J
        #求当前计算总误差% d0 h5 H0 G* W6 z( G
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    . @/ D5 {  a1 Z2 R1 D  X    print(f"第{lt}次训练,当前计算总误差={eo}")
    . @8 j( K3 {- T( l6 N. L, h+ y    #误差已经在允许范围,退出训练
    ) k7 o' L4 t2 e; w    if eo<eo_allow:) f6 x+ O( ?6 m, N, e
            print("误差已经在允许范围,训练结束\n")
    2 \! L; |0 E6 G        break
    & a+ d  {# B1 I2 R1 w    #偏导
      x6 }* b: R% @+ i    d_eo_oo1=oo1-o1
    + @5 p) m. c3 O4 [; E$ a! A5 a    d_eo_oo2=oo2-o2. z& Q  V1 x0 v- a2 [
        d_oo1_oi1=oo1*(1-oo1). p! I- e& z- k( V( K( g
        d_oo2_oi2=oo2*(1-oo2)$ D3 j" S' B0 y* C1 Z6 O3 b
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    8 ]$ W, @  w8 Q3 O    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    $ K/ D# K, S" ~6 e/ K+ [    #求w5_new/ l; {0 }6 n+ L  s
        d_oi1_w5=ho1
    - o& J: i/ r' ]* o    d_eo_w5=d_eo_oi1*d_oi1_w5- L& f8 G8 @/ e% s$ h4 x, R" ^
        w5_new=w5-lr*d_eo_w5
    ) }9 h4 k1 r& {6 o' q    #求w6_new
    & C2 }$ V# W5 z$ d    d_oi1_w6=ho20 Y1 L+ t2 l: H. G6 E! e! E9 \
        d_eo_w6=d_eo_oi1*d_oi1_w6
    8 Y: X1 B' ^# d' P. P, c8 ?' V    w6_new=w6-lr*d_eo_w6
    ) ^* ~8 t* o" P0 W, Q9 [( s, a5 N( \    #求w7_new
    + M& e9 [- P, @* h5 p% U: w    d_oi2_w7=ho1
    ! g- y3 W' A: t1 U. j    d_eo_w7=d_eo_oi2*d_oi2_w75 x% I$ _& |6 J- s1 S
        w7_new=w7-lr*d_eo_w7
    2 A( C* J# M  N6 g0 N1 ]: S( \7 p    #求w8_new
      z4 @; q4 [% n( D5 f8 A5 X& c+ U    d_oi2_w8=ho2- E* @% j; g% O7 y: p( V
        d_eo_w8=d_eo_oi2*d_oi2_w87 i, z7 p# a- J) `6 }: h' M
        w8_new=w8-lr*d_eo_w8$ \5 {( b* u& Z0 E
        #求b2_new
    6 G, P- m4 G2 D) r3 [    d_oi1_b2=1
    - i& Z8 @( ^3 b1 {    d_oi2_b2=1
    * F: S7 i/ ]# Y8 h  b3 Z    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b23 y; T# @( A/ V3 u% d9 B
        b2_new=b2-lr*d_eo_b2
    1 h9 z  `9 j* d5 [) I. _7 u6 _    d_oi1_ho1=w5# n5 q7 E6 W3 D4 n. Q/ [
        d_oi1_ho2=w69 Z4 o1 _1 j$ r
        d_oi2_ho1=w73 e3 ?# J1 }! _8 y2 q
        d_oi2_ho2=w81 {' l, R0 D" N3 l4 k  x
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    8 j6 _( ?3 b4 O$ L    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    1 ~4 f/ J: K- \+ ]: D( N, a    d_ho1_hi1=ho1*(1-ho1)
    1 C/ ^* s* F3 s+ z0 I    d_ho2_hi2=ho2*(1-ho2)+ `: G3 K5 n' o9 C) F
        d_eo_hi1=d_eo_ho1*d_ho1_hi11 ~* \% y& D+ a6 ]0 S
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    & |# v4 L! j+ }/ l6 u    #求w1_new7 B! c0 @( k& R/ T* t9 f2 d+ `$ A
        d_hi1_w1=i1+ B+ I+ F9 O, |2 ?( O1 e' F* |! n
        d_eo_w1=d_eo_hi1*d_hi1_w1
    ' T- n1 V/ W, b/ p% n' r1 Z    w1_new=w1-lr*d_eo_w1( q( z: M$ l, B: P! k
        #求w2_new
    0 h1 @! l5 Z+ w, y' o- p. L1 V    d_hi1_w2=i2
    ( I5 c# ?1 Z4 `. K2 Q* s. X# `0 T. i    d_eo_w2=d_eo_hi1*d_hi1_w2
    " I; b7 J9 o% U% J  l    w2_new=w2-lr*d_eo_w22 M3 Q2 J' U6 S2 \2 ]
        #求w3_new9 T/ D7 x) h6 B  g4 W% A) ?; ~
        d_hi2_w3=i1
    . k( q/ ^+ {- ~$ \. b' @    d_eo_w3=d_eo_hi2*d_hi2_w3
    3 b, V' m0 X5 Q" T6 T, b+ C# C& u    w3_new=w3-lr*d_eo_w3
    2 P3 T5 R; ]% S. v8 r1 ]    #求w4_new. [, P+ a; W- D0 n" q
        d_hi2_w4=i2* Y: e( U6 m2 ?5 `4 {
        d_eo_w4=d_eo_hi2*d_hi2_w4
    ' [# w, u& K/ a4 ^) h; l: y  n/ p    w4_new=w4-lr*d_eo_w4
    + Y% J9 M/ Z* n8 y- {: c0 S    #求b1_new7 t0 ^8 V- C+ c1 L3 D9 u: L$ g
        d_hi1_b1=1( ]9 |1 S' q! u1 j; X0 j' L
        d_hi2_b1=1
    1 G* q, U  w5 s* [    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    % W$ Z% z! @# P( r    b1_new=b1-lr*d_eo_b1
    2 o: `4 b' ?8 W$ s6 O6 d    #更新反向传播
    % N( p, Z& Z" E2 B4 F: _5 Y    w1=w1_new
    1 w- a, e% l. ^    w2=w2_new( L  k* }5 K, R
        w3=w3_new# Q( W9 x. B: I7 B
        w4=w4_new
    0 D7 s/ U4 z7 T7 f! n    b1=b1_new
    " x) @/ Z1 q) _1 p. Y7 g4 p    w5=w5_new& S" D! @$ L2 }# K- \! o: v
        w6=w6_new  \6 B1 w: H3 w5 A. a) @
        w7=w7_new7 B' s3 o: l( \+ P& E# p0 G
        w8=w8_new  U" U$ K" s+ p* X1 V9 \/ j' q8 `
        b2=b2_new
    7 ~  s) h0 |% `- {6 _2 C, r6 [print(f"当前计算总误差={eo}")/ f. d/ O  L# U9 {, f" T4 s
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")* o3 E  d2 `( L. Y
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    % ?0 f* L5 s5 A: C1 hprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")9 Z& S5 y- e" n

    0 x$ Y6 v$ _+ o; [) Z/ N结果
    0 w8 E; h) }5 F' S6 M8 ~  a4 S# Z0 P5 Z/ ]

    8 e9 q2 c& ^: g结语  o$ ]3 K7 a& M, q
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。; n& z% q; v. P  c6 y

    8 M0 }) H$ \2 }! M6 ]/ S补充) |. l4 _( F% i) S4 o, Z! Z: o" E/ J
    程序中d_{a}_{b}格式的变量表示a对b偏导0 p: z% O; Z6 b* M' `
    ————————————————" r9 n8 j; ~. x4 F# }: P" m# \7 Y7 L! ?
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 F; c, H$ K. o9 ]+ j+ \5 [+ y原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679548 q/ d& J# E+ g" e8 ?( ^" I" y

    , c3 B; n0 G, Q& N# b9 `  E0 I% P$ S7 O7 f. }2 k; w) b5 t
    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 07:35 , Processed in 0.395437 second(s), 51 queries .

    回顶部