QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1936|回复: 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实现)
    ) R) J0 s( `/ S& ]
    1 b4 `; i; Q" @/ J0 Y0 g背景5 o/ ?2 S7 a' t$ B
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    . ~$ p6 i: t% f/ w: a
    & V, S7 p; Y- `( }! o【神经网络分类算法原理详解】+ m" _+ S# ?; h9 W2 Y; J. F( V
    9 Z, N, r* {- s& y, c' M+ [
    注意
    " i4 z0 w# g& e; y1 H4 N/ p站长提供的图片有点小问题,我们更正如下& O. k# i! \, p) ?9 k/ X0 }
    * d6 A  S1 e: ?" v3 }5 @" e4 W
    ( S9 M4 b% H3 C3 Y$ ?. Y

    6 `4 i9 @7 U1 I问题% Y$ v) s& R5 p9 B/ b$ F" f6 T7 ^
    根据上图所示,我们有已知! H& B% @0 R* G7 U4 `- O6 q" b
    # n  H7 o/ X1 u" w
    #输入层* f$ U3 N8 R0 B" c* p: m
    i1=0.05, @7 D  w7 o$ M. U) m! p7 o
    i2=0.1
    # p2 D2 t' r1 ^" O8 |& Z2 q, O; w7 F! h( k4 A& U  c
    #输出层
    0 t* E3 g8 H9 r# o( ?2 S0 `9 l3 eo1=0.01
    3 c( S& h: W+ D: |) v; y+ To2=0.99
    " ~, p: V, N/ t9 Y这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    8 K2 N! w1 A& ^! H
    4 i# B3 D- w* B7 U神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1, A% Q. Q5 L$ U) b

    2 H; r2 k9 v8 T0 e' k: A神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    5 S% ]& y: W- ^, Z
    1 H% \, \0 P6 R$ T1 a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出% j4 F- I1 y' k- ]+ O

    . |) g( ^4 E5 V2 L/ y  y神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))7 m0 k" c" X2 ~  h: ?! g3 a/ u

    4 j! a8 D+ }3 x9 }8 e6 ?同理
    4 H. {+ l$ s$ o% I9 f) l" g  w8 q% G
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)); J2 v: [, @% f# F
    7 {5 \( w8 `5 z- F
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式! J: ?( j  Z, f1 t. H  o6 f

    9 C0 B8 V  r+ H3 G/ u; y神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b29 m4 S9 b3 I! r; p3 O% ]' d: \
    5 o  X" O; A1 q5 W' y0 `
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" g3 B3 k* ^* z* }  C
    / i  M- Y6 C3 ^3 v; B; S  i
    再经过非线性变换Sigmoid函数得到
    0 x2 l* e) F6 X. `# r" ?1 \! M+ }; c) v  x
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))5 S/ _6 z  e2 ~. f! H" H; L- p

    7 K$ b( Z* [" V& E9 f5 f0 ^& V神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2)): N1 ]/ M4 S1 X6 e1 i: E5 Z

    9 s5 D5 x2 z. w我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    & ]) B9 @4 M) u# C* f
    3 j$ X0 B) T4 ~  q" t7 ?, q损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    ; V8 N) X3 H% a5 i0 j0 X( [2 l, Y- z! R" j1 ~
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足3 q& P  z" y/ j& ]

    7 [# _2 @# X9 U$ m: B; _2 U  G5 b学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    - s9 H2 I+ h4 u" \5 h* Z9 w% ]9 F2 S
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    * v# l; I! Q2 ?( [' P8 F) N6 Y, D) x9 ]) r& d9 E- ^8 U
    依次求解代求参数. |; W2 R) x% U: [% @0 y
    $ S8 D, B, X4 S' }
    w1~w8,以及b1,b2' J$ L7 _9 W1 F

    " c6 N. R$ Y6 Q" h$ j
    : D; P  p" C# k: b1 B1 E# c) ^- {. I2 \. \: h- N
    损失值 (eo) 的偏导数
      J0 S/ r/ A; V2 o
    $ L8 @, @# s3 E# s5 R8 R再更新该参数,更新公式为$ |3 s" k, u8 h7 }4 T, p5 F

    6 X1 Q, h/ W% p7 r& y+ g参数_new=参数-学习率*偏导(eo,参数)0 L. o. f6 G" E% f* y& ^4 n  M
    随后进入下一轮学习* u. T6 H$ t$ R8 \

    $ K2 m/ K! W% z3 ^. j终止条件(满足其中一个即可停止训练)
    7 |# Y6 ?# ]% z3 ^2 q( V  w* z
    1.学习次数达到上限9 |4 v0 B9 t- }% d% j* V

    $ }/ @( {" n" W3 W4 W4 p* y. X% C2.损失值达到可容忍的范围
    ; p! L$ L6 L0 w/ A6 c
    0 z- k6 N% q0 l) l导数
    % m- O* E* l6 P: k& qf(x)=1/(1+e^(-x))的导数是
    7 T+ I& C6 ?) O& \+ jf'(x)=f(x)*(1-f(x))
    4 d  Q" F5 V* ~' B2 \( k源码
    - P6 o% K) Y0 B' c8 C8 {/ ?5 [import math, I8 x, Y; t5 C5 r' p9 k# }
    ) E3 k; T( p- p1 i) f6 p( v: N; V
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    $ {5 U0 O2 m, ?: H" q# J: J  C#网址中图片有误,请看我博文上的图片
    - a7 D2 F8 A4 z' X# }) U2 D+ J" `, b/ i1 y- v& K. X' ~: q
    #输入层
    * G4 k7 |: S6 q/ g( h+ k: x- q/ wi1=0.05
    1 t  I  ?7 l% y2 a8 }. K) U; ]i2=0.1
    8 i5 y* R+ ^: {" O4 W. S#权值参数
    ; s7 ?6 n& }  P% Rw1=0.15* i0 x6 A3 f, T% w
    w2=0.2) F- ]' S  X" L/ m9 \% B; X
    w3=0.25* x& D# Y& Z: i+ u
    w4=0.3( o& C0 A" @+ [. w, L6 K7 g4 A
    w5=0.4
    + y1 R8 }1 E8 T# xw6=0.45; w* ^$ Q7 \# w, ^3 _
    w7=0.5) P4 S! m4 c# [* K! g2 r8 i
    w8=0.55; ]( Z+ ?  S. D4 O
    #输出层标记(即期望值)+ G! C3 I( g4 G. c7 [
    o1=0.01
    # S/ G# `7 Y/ Go2=0.99; p- ^( N& i3 F, s
    #偏置项参数
    + b+ {, @% B4 J6 z0 Zb1=0.35
    ; c% O( J! S- O( I7 X5 j; Pb2=0.6
    . L0 a( T: ]2 S" s* W
    7 B+ l& U( M. k" P$ e6 t! u3 C2 f9 v#学习率$ C0 u, \, J3 h2 k& E. T
    lr=0.59 ^. [! C2 O5 n9 L4 G3 O6 g9 l
    #学习周期1 x6 H- @8 o8 e' j8 P
    lt=02 M4 Y  d$ ?9 t4 h5 r4 R- V5 q
    max_lt=10000
    $ y+ a" Y: F9 U# t#允许误差& k7 M6 P0 ]; g3 m" P
    eo_allow=1e-5+ `' I: }* q, \0 n: F
    - Q* M0 r1 K: [' _, ^) [
    #线性转换) b" ^% J( Y0 ~$ R) ^1 L8 o$ u3 |
    def linear(w_one,w_two,i_one,i_two,b):
    * p; F1 m  ^9 H% y: H    return w_one*i_one+w_two*i_two+b$ l8 [7 o" g! O) ^
    #非线性转换0 e# s! H# u- q' @/ g: N/ Y
    def none_linear(i):
    # i% v6 i2 R( _6 L. Y6 x. M    return 1.0/(1+math.exp(-i))4 {- t0 h5 O. j* |1 P; w

    * G5 I" }2 {6 Oprint("训练开始")& i7 L3 |! G) x/ l
    #学习周期结束前一直学习0 g" l( ~( {  _* \6 J
    while lt<max_lt:2 |: S6 D4 g5 T) j- d
        lt+=1
    / z; c7 C6 e2 J+ a4 n: \1 e. e5 ~    #求h1和h2输入值1 \2 w' w( O* p6 n) `$ f9 |1 i
        hi1=linear(w1,w2,i1,i2,b1)# \- w: R9 o) m0 j" d
        hi2=linear(w3,w4,i1,i2,b1)
    . v/ y2 p& J. j    #求h1和h2输出值% a; p) K4 c/ `: h
        ho1=none_linear(hi1)/ a4 V& z) F& H9 q
        ho2=none_linear(hi2)
    3 R0 h) q4 @9 {% B1 Y" T2 R1 h: f    #求o1和o2输入值7 R# s  y8 y8 X& ^2 }1 j. s9 w1 ?4 [
        oi1=linear(w5,w6,ho1,ho2,b2)" e+ G1 v6 q) y  w! U& o* a* P
        oi2=linear(w7,w8,ho1,ho2,b2)6 Z6 w2 ]- W2 ~) b5 J+ l
        #求o1和o2输出值) z* m. e0 o* E4 Z
        oo1=none_linear(oi1)
    6 R9 F$ H  n2 N5 @! e: f    oo2=none_linear(oi2)
    " z' Y4 M# V. f0 p  H, q. K
    ! O+ b0 l% M# N, c/ p. Q    #求当前计算总误差  r) G  w) `1 k
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2) A0 Q" ]! j" U( I/ J
        print(f"第{lt}次训练,当前计算总误差={eo}")1 N, w: {* n% f  H" ^( b
        #误差已经在允许范围,退出训练9 j5 ?; s) }  P/ P. M/ Z# P4 I
        if eo<eo_allow:2 a: R. l8 R8 n+ {4 W
            print("误差已经在允许范围,训练结束\n")
    " }0 H0 B& l1 V" H  V        break
      t  U1 l9 R9 Y; j5 y- n    #偏导7 B* x& x% u$ _2 e6 k
        d_eo_oo1=oo1-o15 V( N7 [7 |) ~& V% F
        d_eo_oo2=oo2-o2
    5 U9 b7 r# ]6 V& z, [    d_oo1_oi1=oo1*(1-oo1)+ T! c% U* z$ t3 g
        d_oo2_oi2=oo2*(1-oo2)/ V5 O. r7 z) u, k' `
        d_eo_oi1=d_eo_oo1*d_oo1_oi1$ V$ |) ]  U7 d, ]3 g  Y
        d_eo_oi2=d_eo_oo2*d_oo2_oi20 B# q1 z0 V* P: j
        #求w5_new
    $ X' Q  F. C2 C( C    d_oi1_w5=ho1* j* i0 v0 S$ }" |0 M
        d_eo_w5=d_eo_oi1*d_oi1_w5
    % j/ V; z/ {9 U6 g; e1 O    w5_new=w5-lr*d_eo_w59 y9 e. ]& S, ]& R% w) D
        #求w6_new
    , U% |7 T0 ]9 i9 P    d_oi1_w6=ho2% Z  {: s7 H* W
        d_eo_w6=d_eo_oi1*d_oi1_w6. c, J3 N6 X( R% J
        w6_new=w6-lr*d_eo_w6" K! X7 j- j! j3 Z/ i& [/ q& J
        #求w7_new
    1 m  E  B1 n: h% {, f' J1 I3 q    d_oi2_w7=ho1
    % ]7 z. l' I) S" g5 w( o    d_eo_w7=d_eo_oi2*d_oi2_w7
    ; C' |) A6 Y/ P    w7_new=w7-lr*d_eo_w76 g9 s6 U( _& K" b9 ?" P0 ^4 M
        #求w8_new
    $ l- [9 b6 Y$ ]) S# V2 e& N    d_oi2_w8=ho2; X+ _9 x8 [" A. t* P
        d_eo_w8=d_eo_oi2*d_oi2_w8$ [; i8 @8 M% I2 J6 a2 g: ~( D5 I
        w8_new=w8-lr*d_eo_w8
    " Z# c7 q6 C7 e; E( S    #求b2_new3 T' X6 A/ u% y, H8 F
        d_oi1_b2=1
    / H0 d& s; S% P+ q7 W    d_oi2_b2=1
    ( |0 D8 C- d$ }& C    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    % P5 l; X' T/ P3 H7 {+ t/ c6 B    b2_new=b2-lr*d_eo_b2
      w1 d5 b: r% d    d_oi1_ho1=w5+ ^6 {5 i; O  Y9 V4 _
        d_oi1_ho2=w6
      X4 O* X* j7 Y* h$ o    d_oi2_ho1=w7
    # U# p9 }8 H$ _3 _    d_oi2_ho2=w8
    * y8 f! V% n; ]6 x! S, O* e9 ]/ m    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    , S* j% N" O! q; N$ R    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    - ^  G  a/ H* L/ J    d_ho1_hi1=ho1*(1-ho1)
    ; x; @; ~' [; m6 ?4 P9 A$ p* j    d_ho2_hi2=ho2*(1-ho2)
    / \" O3 u- u' Q    d_eo_hi1=d_eo_ho1*d_ho1_hi1% d: U* o- X+ s. @1 z4 [
        d_eo_hi2=d_eo_ho2*d_ho2_hi2( Q* k* Z% r. h4 q# \, m
        #求w1_new8 F# ^& D8 t; p
        d_hi1_w1=i1
    / g/ ~+ r: V  Y; E# }0 [8 {* ?    d_eo_w1=d_eo_hi1*d_hi1_w1
    ) n+ ~1 U; }3 ]    w1_new=w1-lr*d_eo_w1
    , D6 ^" ^" d: e: T& D    #求w2_new
    $ k$ Q" b5 P0 R( U2 w% C$ |    d_hi1_w2=i2( s  J' W) W- v* R+ E1 h6 m+ X2 H
        d_eo_w2=d_eo_hi1*d_hi1_w2
    ! f7 s# _) U4 l# v6 n, a- A    w2_new=w2-lr*d_eo_w2% d2 V7 Z' t9 T# C/ {4 X
        #求w3_new
    6 J2 ^( L9 V- s$ z6 M/ ?    d_hi2_w3=i1+ X5 k8 f" b9 r- w! u1 [1 s  _
        d_eo_w3=d_eo_hi2*d_hi2_w31 {8 j+ Z5 k* ^2 \3 ~5 A
        w3_new=w3-lr*d_eo_w3
    ; ]( k  a4 ^+ @9 t8 ^$ `7 V    #求w4_new  W2 e# P& c0 i1 ]1 Y
        d_hi2_w4=i2
    & Q- J9 I2 J/ X& G+ x) H    d_eo_w4=d_eo_hi2*d_hi2_w4! V6 s1 L5 N' F: G9 K: ]5 m; L
        w4_new=w4-lr*d_eo_w4- t8 p2 Q9 u& t9 N2 n6 Y; t
        #求b1_new
    3 T  ^1 ?- O2 I4 z    d_hi1_b1=1+ k3 h- ^. b+ G; K. r
        d_hi2_b1=16 x& `0 Q7 B0 p
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1/ o! V6 L8 x# O8 N: C( l
        b1_new=b1-lr*d_eo_b1
    ) G+ u% g* n0 k: @    #更新反向传播+ {+ i0 Z8 t7 A9 s' A: p
        w1=w1_new
    . g: `% d& A- l    w2=w2_new; {1 o( C% n& z% C8 Z
        w3=w3_new
    ) ~9 D% H% o, ?: t9 @% ~3 p( s    w4=w4_new+ P8 H$ y4 w! ]3 ~  |
        b1=b1_new
    9 @/ d( X! r5 F+ G) y1 E% _    w5=w5_new6 Y9 ~- T; q5 z" ^3 t
        w6=w6_new
    0 R8 o  d  C9 Q$ B% g: K    w7=w7_new
    . f) h* Y2 t. c5 a6 X& b$ v1 G    w8=w8_new. L! [4 c$ B- d8 n* x7 [7 R: a8 p
        b2=b2_new1 b! C" A4 j9 Q5 w3 u" c9 a" Z1 ]
    print(f"当前计算总误差={eo}")% V/ `- v- N! u1 k
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")$ j3 K+ j" [) F9 s" s) j
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    3 @$ u; O0 ^5 m( j3 R1 Gprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    # Z% I% \4 _* a5 q/ ?
    ! J7 B) E! N  _. j结果
    4 |) q+ ?0 f7 P5 `9 x3 z3 K+ ~
    ! [) V! [" u2 F3 `" Q6 V7 r, B3 i1 k3 Y5 o9 |
    结语, R, z8 D9 A% b6 F  s
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。$ S8 x, U8 p3 L& c2 `
    / j- c/ x- q7 r, m  k6 j" L
    补充3 ^6 G! |8 G' K
    程序中d_{a}_{b}格式的变量表示a对b偏导
    & O3 N9 Z; \( v0 N4 Z————————————————
    4 m7 v- W& E! A% E4 H4 `版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % t; }5 S9 z, ], F# W1 x9 n原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    8 Q$ ]. U) p1 K
    / f) I: n& O" c5 ?1 g+ A9 R9 {% m+ E5 o! z! d3 P) g
    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-6-1 03:34 , Processed in 0.737776 second(s), 50 queries .

    回顶部