QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2997|回复: 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实现)
    $ l# q: p' |, q/ E6 `7 M: f7 q$ L, B8 A3 j9 t
    背景
    ( N. V( z/ h( E0 g1 J. H初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    ! w% S4 n2 v( D$ w
    ) c6 Q; e! m0 n' n- l5 v- l  A【神经网络分类算法原理详解】1 q- g; Z7 O6 b# V% _/ ^
    . t" l9 V6 B  ?( C" V
    注意: m/ |  \7 }( N& N  u5 i. u* y
    站长提供的图片有点小问题,我们更正如下
    ; b  Z. E" C  O" L/ P4 w! V8 s+ Y  |7 w; K+ {! b! T
    ; h% M" T* Y4 [1 k: C  i
    ( P8 g5 V$ p, K) u$ W  M
    问题" q$ Y! |# C% ^' w. f
    根据上图所示,我们有已知
    ' f# |) ]! I$ S- d6 O, u8 u
    % O& M* r6 z3 C) d#输入层" D/ n0 F6 ?6 q3 D0 v
    i1=0.051 m) A, v' V6 t7 F
    i2=0.1
    + S) p4 }: F, s" p) U' h5 a4 J3 m( p8 J5 O1 y* A( d
    #输出层" T9 ~* J+ ~$ X. s6 v
    o1=0.01
    / \6 E/ ?! \! N+ l3 No2=0.99! {* O7 C6 D/ W9 Z
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的/ i5 y( V  o0 C6 h) l9 n, z

    4 @7 [1 H/ H; Z3 E) B神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    , H: o4 @1 j& e% l# D" s1 h+ I4 l" R0 k4 k9 ?
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1+ ^( l2 `0 L" N3 G' T' D( a

    ) s8 Q, I9 m3 I4 @8 f& r: \( a4 a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出& s) u( }: K% O, ~

    , g9 h0 w3 F% \0 E' l$ Z神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    7 Z, s* p) N) n% S$ P$ h) ?
    ( r' ^# C- u# Z  ~6 z/ R同理# t) d6 n) l7 ^  p

      C0 r+ Q/ g8 z; A4 D# O# N神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    / L7 \1 E, J7 n2 [
    ; Y5 C4 k$ H; d" G& |  o, a接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式1 a/ s% }$ ^" z; ?0 Z
    . _7 |9 ^1 T, c: W4 |
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b21 B, l2 `! l. s. z% b) n
    7 o' K$ Q0 r+ r; V) b
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    / y* e: ~4 ~& I5 {5 g5 f
    % m% u+ ?$ f1 e* M+ I+ E. c; ]再经过非线性变换Sigmoid函数得到
    ' O/ b# N4 N3 U% N1 G9 p% X9 U& T: ^" f; c
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    ! x/ d5 E% F7 N
    ! @0 w$ Z+ _8 l* r' a神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    ' k6 ^* Y% ]1 i
    2 Q& |+ H2 |# U/ b% S/ d我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
      Y" m" s1 r4 u% ~0 W5 z* ]( v$ I3 P6 j1 Z
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    ( q& l- K0 u. v2 S$ e7 e% ~! w7 ]9 P1 G) k, d# m$ p- I: I9 y
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    5 F6 U, @( U% d4 n& [5 W8 C3 N. W# ~/ X# c2 U/ ]* r- q3 [5 d
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    ; C+ G& V: Q# G2 b2 h* N/ j# V+ |: F0 Y8 i0 w
    学习率 (learning_rate 简写为 lr)我们设定为0.5) t9 u$ I0 j  ~# o* U  H
    ( j2 ^7 G$ Y$ e$ U* \
    依次求解代求参数# ?& A2 P  k9 |

    . w) u$ L  ?% D3 nw1~w8,以及b1,b2& X: g" D' j+ t/ g) a
    6 u3 Y- s1 L: d: n
    9 w8 R7 a# o, A  c0 {) }$ ]. L
    $ f/ B; @/ Z# t( O# K( {# y& y8 L
    损失值 (eo) 的偏导数
      ]+ k& q1 r$ `5 f$ B$ K) \" F! E: j$ N9 k# X
    再更新该参数,更新公式为3 l: i% l+ H% @" O3 z: A9 E# G  m! N9 T
    . u3 {4 |1 @  F9 Q
    参数_new=参数-学习率*偏导(eo,参数), p) ~% C, o9 O. O( v: ]% S' z
    随后进入下一轮学习
    6 c* d& Z; l1 i' {) M7 p- _) K1 Y6 F( p% b1 O+ {, y; l9 [2 t- a+ y
    终止条件(满足其中一个即可停止训练)
    % r0 t0 R, Z7 |( Y) M0 T4 B$ y7 [/ `: B( v
    1.学习次数达到上限* F6 L0 i. {! \# u% T# C% ]) Y

    ( e+ `& _9 f1 I  E  A  G2.损失值达到可容忍的范围
    ) h& O- b$ R# G* }# h% h, h" p2 m, i6 z9 ], I
    导数  ?7 W0 V  T  E& b. M. t8 ~7 c/ R
    f(x)=1/(1+e^(-x))的导数是7 _+ k, K  V6 N& `* l
    f'(x)=f(x)*(1-f(x))
    9 y8 h- ~4 T( y+ u$ F  e- ^* O1 s源码% q2 W* l! B. k5 h2 U" J
    import math
    7 |& d& q8 E, r2 d+ p
    ( ?. P8 Z& O5 \. N. ]8 V% ]0 l#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    ' A- s$ e* ?; z4 `( i& P#网址中图片有误,请看我博文上的图片
    , a' t) ~) @  \
    , V: z% Z. r' K! f' x9 u#输入层: l  g* i9 t! |+ o1 X5 ~* ?
    i1=0.05& p8 C; s5 [/ s" D: y. V6 E
    i2=0.16 O/ [( u: c* Q4 }% @
    #权值参数1 ?2 p- K& v0 p$ `# O
    w1=0.15, K! a& N/ l( ]' S- k
    w2=0.2
    3 k( [! l/ R; T' ~) q5 `' Q) ]w3=0.25% Z, n- i! s( P, Q
    w4=0.3
    6 i; `4 k6 \$ \; W7 |/ [6 \w5=0.4
    ! }6 f& |. N6 J0 G" z& K- w" nw6=0.45) @0 E* C! _) X
    w7=0.5
    ; Z$ {- H5 R" z, k+ x1 {w8=0.55
    ! m8 ?7 L1 f( H5 p1 |; K. o#输出层标记(即期望值)/ Z+ T2 c$ m1 J. g
    o1=0.01, r6 f  F" q" s) ]0 {' b# ~
    o2=0.99
    % _3 P; I2 b9 M8 y& V#偏置项参数
    8 [# s8 N  `& ]8 \9 R8 a. ]b1=0.35
    * {; T; R$ X" Y4 ?- a0 |# L4 H4 Hb2=0.6" i; e, R" M0 O  U# z

    8 P7 @9 Y) l8 b) N: V#学习率
    4 T/ X; m' W( B. q: @% m  ylr=0.5
      ]. ?, t- L2 o& u4 F3 q# M& H#学习周期
    1 t9 q( ~3 r' L( B& {+ E; e! Jlt=07 ], n& V: I* I- A
    max_lt=10000- j6 m( ]$ X3 T
    #允许误差* q( B; Z3 y+ Z3 ^0 ]! r9 d1 ^
    eo_allow=1e-5, A3 e& Y. q# A0 n2 F+ d

    # d: r& G7 {  j+ B#线性转换. ?5 _8 t- }; f+ A, F6 b( l5 q
    def linear(w_one,w_two,i_one,i_two,b):: H, R0 j% y8 h, `% h0 q& m) G! ~- t
        return w_one*i_one+w_two*i_two+b' G+ o& g. S& V) R- t6 i+ e. M
    #非线性转换1 m2 V; h6 J6 _; ]/ D! r. k
    def none_linear(i):
    / S# E8 @2 Q6 o7 ]$ l  G0 j- [2 f    return 1.0/(1+math.exp(-i))
    6 U, j' J5 U3 x1 \
    3 l1 t7 O& q* k: ]print("训练开始")% W* T+ }+ a2 h; e
    #学习周期结束前一直学习7 m/ X! l5 a* F; h
    while lt<max_lt:
    . N) y' K( R3 F% g- s2 N! o    lt+=1
    2 @3 v5 }1 s# W* |8 }$ P6 m    #求h1和h2输入值2 q/ S7 T% h# B9 B" F  J
        hi1=linear(w1,w2,i1,i2,b1)
    ) X/ q7 b3 l- Y2 O9 Q# ]# R    hi2=linear(w3,w4,i1,i2,b1)
      P5 t; L$ l0 |' @; m9 a    #求h1和h2输出值
    + C! Y, W+ A# W8 g    ho1=none_linear(hi1)
    - h8 y9 r% q3 c5 g0 o% q3 l    ho2=none_linear(hi2)
    * J) A& [% ?/ \; g% Y    #求o1和o2输入值$ b6 x' ]* X. h$ H$ x! Z; i3 M; H
        oi1=linear(w5,w6,ho1,ho2,b2)
    & Z6 J- S" C  r2 r/ l    oi2=linear(w7,w8,ho1,ho2,b2)6 G0 W! h" E/ a8 g4 J) W$ M5 ^: {
        #求o1和o2输出值
    - Q5 f. g6 n7 X( L    oo1=none_linear(oi1)
    % [5 y1 A, S- ]* Z    oo2=none_linear(oi2)
    : q/ P& ?" [9 I7 y  m' ]" R1 W
    9 K5 m! Y1 y2 i: \    #求当前计算总误差  P/ g1 ^& }/ `0 L. w
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/26 o  Z+ u3 w# z& \. n, P- b
        print(f"第{lt}次训练,当前计算总误差={eo}")
    9 d8 Y7 S/ b: |  q    #误差已经在允许范围,退出训练' E( x' J4 D1 X6 `9 f
        if eo<eo_allow:6 q( {+ F" |4 \# ], z
            print("误差已经在允许范围,训练结束\n")
    * p' B% a  N, f/ x        break+ ^! K+ Y5 E4 K  Y$ t: K
        #偏导
    / r, H# |4 }0 h    d_eo_oo1=oo1-o1
    : r& B; z/ U; t; b1 i    d_eo_oo2=oo2-o2
    4 u/ F  _4 v! _( v, {2 L4 u    d_oo1_oi1=oo1*(1-oo1)2 b+ e6 I6 D, G3 O: |
        d_oo2_oi2=oo2*(1-oo2)
    * M* w; Q1 Q. y    d_eo_oi1=d_eo_oo1*d_oo1_oi1  I* }5 ?8 c. b3 K" ~+ j
        d_eo_oi2=d_eo_oo2*d_oo2_oi28 d, D: R- `' a& R. T
        #求w5_new
    " J! @2 g) f. H& P# S    d_oi1_w5=ho1' w" G+ w. P- ^& |8 E
        d_eo_w5=d_eo_oi1*d_oi1_w5
    % f9 ^! {6 U4 z6 A& o5 t4 P    w5_new=w5-lr*d_eo_w5
    1 ^, [* [1 B6 S5 X& l8 i! N! z6 P; k    #求w6_new6 l% g$ ?& O7 \9 t# {) A% W: y
        d_oi1_w6=ho2. e. a# e8 V, v; a4 a) t- W
        d_eo_w6=d_eo_oi1*d_oi1_w6/ B  w  _! T- j* h. ^- M+ A& `/ e4 K9 ~
        w6_new=w6-lr*d_eo_w6
    ; F4 L; L* x- Z* u    #求w7_new
    2 l+ |, P% }* {0 G    d_oi2_w7=ho1& Z$ o' |, ~5 X+ r7 B3 z
        d_eo_w7=d_eo_oi2*d_oi2_w7( s  d! Q6 W9 t5 E% `
        w7_new=w7-lr*d_eo_w7
    ' m) J0 M8 e0 h7 K  p% t- h    #求w8_new  T8 A' g1 ]0 Z6 r  d, d  G
        d_oi2_w8=ho2! d  e9 p0 E& K' o- F7 w( H1 `
        d_eo_w8=d_eo_oi2*d_oi2_w8% }. i; P8 S# j0 y3 L) u
        w8_new=w8-lr*d_eo_w8
    - p3 c& I& g( U+ L3 ]    #求b2_new8 T, p; A, E7 `  z4 K: X9 a
        d_oi1_b2=1
    3 x0 {9 G! {/ {) C+ m# m    d_oi2_b2=1* v& @0 S, v7 S( H+ i' p6 M. ?
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    / ]2 {% [" r1 a1 e8 v% o1 ~2 h- d, x    b2_new=b2-lr*d_eo_b2  s0 k. `# I% F! {" `; @: @% g( @
        d_oi1_ho1=w5
    6 q8 i$ v) E1 v+ r( j    d_oi1_ho2=w6
    1 v* I0 {- Y* i" t    d_oi2_ho1=w7; T  p5 f" y' Z9 K, L; s
        d_oi2_ho2=w87 X* W! z6 m1 z$ S9 q4 _
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho14 V6 K; L7 q" H+ j. X
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho25 x& z9 b. b9 j8 @* q: @! n; Q. ^
        d_ho1_hi1=ho1*(1-ho1)
    * i" a& h+ X) L# H+ {& e. c% i% k    d_ho2_hi2=ho2*(1-ho2)
    3 k9 i: D# n/ Z! u" S) K. J7 d2 ]    d_eo_hi1=d_eo_ho1*d_ho1_hi1. L& L9 _+ w2 F  F; h
        d_eo_hi2=d_eo_ho2*d_ho2_hi2& H; ]) q& b0 {$ N' I  Q4 k
        #求w1_new5 P, f  ^* g  D! G4 z) L6 A5 Y# R
        d_hi1_w1=i1
    8 b+ l9 O9 s3 T$ e! F    d_eo_w1=d_eo_hi1*d_hi1_w1$ r$ y% B6 k, {* e% _8 Z
        w1_new=w1-lr*d_eo_w1! ]; Z8 f$ C+ }% M# W
        #求w2_new4 \: ?! c1 |0 N+ T. K& P
        d_hi1_w2=i28 |7 [- F6 Q9 b& _( Z! v
        d_eo_w2=d_eo_hi1*d_hi1_w2  H, g3 B; H' @0 t, D( u( V
        w2_new=w2-lr*d_eo_w2
    ( j) |! [3 ]! G    #求w3_new2 S# q% e$ ~+ @1 w) q
        d_hi2_w3=i14 }6 z# O9 j: v
        d_eo_w3=d_eo_hi2*d_hi2_w3% [; t( @* L3 O- L% h
        w3_new=w3-lr*d_eo_w3" @, i5 h, d3 _. M) I
        #求w4_new; ~1 [2 T$ i1 V+ v" J
        d_hi2_w4=i2* ]% s; c# X' V
        d_eo_w4=d_eo_hi2*d_hi2_w4
    " o; S) c7 x3 \3 [; m    w4_new=w4-lr*d_eo_w4/ Y. w2 a3 J" b
        #求b1_new3 Y/ W; H' K" e' |8 Z3 ~8 s
        d_hi1_b1=1
    $ m7 p0 Q$ N" u) Z6 l! Y3 r    d_hi2_b1=1# \+ J' [& w3 h/ R" A
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    5 ~5 W4 o3 A, S) {0 I    b1_new=b1-lr*d_eo_b1
    - z2 n; r4 V" S( M# c, R, z4 D# V    #更新反向传播
    ! {/ N! _0 U+ H2 j/ P2 E    w1=w1_new
    & P: R; A  b8 Q" s7 K/ A    w2=w2_new7 v/ l+ V4 `/ x1 P+ `/ k/ f: j
        w3=w3_new
    2 }/ F& o# M; C/ Y! a! x    w4=w4_new9 E) [* }( a3 t  J
        b1=b1_new* ]) `* ~8 r( c7 [% p
        w5=w5_new
    ; {, d* b: H8 Z5 c* R7 ^    w6=w6_new
      M/ D5 q/ v6 z. v" W2 N: ^    w7=w7_new
    0 G& ~$ ^0 E6 Q. n% H    w8=w8_new( k, I; _2 \3 K& T9 ~: B' w
        b2=b2_new- I& {( q- ^: D2 z9 `
    print(f"当前计算总误差={eo}"): |  R$ S6 R7 b
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    , H. I0 N" S6 }6 [  i9 Lprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! A1 p7 K# U5 L% [4 x% \
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")3 F' h6 Q; G4 W: N3 @
    ( [/ a8 i$ \% s6 A$ w
    结果( C# l5 Y9 e3 `; _4 a
    . m8 ~. g" S0 ~# w+ E0 g

    ) a8 f$ {- `1 K结语9 C- j! x$ a, r, @9 c( Z! Z
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 Z3 R$ N4 J* e, i( k. g

    6 T% R, ^( J7 ~/ t9 n' W* X$ G( y8 n补充- ^8 Y7 I! P1 j" n( p* M
    程序中d_{a}_{b}格式的变量表示a对b偏导
    1 [) p+ `! ], m————————————————5 \. Z/ @0 `2 I( _2 u
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . n4 m  _, v2 u原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    4 T: d9 B6 B! W/ c: R! Y8 T' l9 P$ t7 t- x$ m
    - R5 ^' b6 |& N( s
    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-4-10 10:41 , Processed in 0.423301 second(s), 51 queries .

    回顶部