QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2996|回复: 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实现)9 X' F5 [# g( o. W$ Y/ [: I8 O+ z& W

    ) f2 c0 h: R' l( K2 C背景
    6 r  L$ h1 E( E5 w1 ]) [6 B4 N初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下- v4 D( f9 g" t4 f; j9 k2 |

    . e. G' ^6 V% T6 k# J+ v【神经网络分类算法原理详解】
    4 {7 l8 M/ p$ n8 V& E- M$ J) {
    注意
    & U7 o! [! h2 t# A* r: u8 }8 Q站长提供的图片有点小问题,我们更正如下
    " k# F; y) Q7 A1 y9 U
    8 Y' E/ l/ m8 m6 ^$ S  ?( p' X3 o1 s3 @7 A4 p4 d9 C! P0 S& D

    6 }* L2 Q# e# O+ Y. D% W0 a- k问题* A$ o9 L  M& j2 g
    根据上图所示,我们有已知
    4 L3 j: H- d$ t) [% }- z, p
    1 H, }+ w' J9 K% e- ?& @#输入层
    * |9 O1 G5 P/ M# F0 y* s3 qi1=0.05
      ^" c' G7 c2 n- Z& S/ xi2=0.1" E# k1 E3 U1 f% s" i4 h0 Q

    % _- s, k# x3 \8 y5 P#输出层! o  t, R- q1 S. }9 F! k/ V! u
    o1=0.01
    8 \3 Q) d0 w+ G% N( `o2=0.99- u& M* t; [5 O6 P
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的! o( @2 T; Q4 a

    1 E, y/ S& G6 h& M- C/ x神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    7 \5 [* B$ {/ {8 o  o" @* S/ z; G& g# y' _' {3 N# H$ H
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    . @$ k! j# L' K1 _7 J
    * F/ N- ^" F! R- ^- T' e8 U6 O神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出5 L8 y7 N+ V. Y7 ]8 B- a
    ( N& D1 ]& h( h: d+ p& Y
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))  N) X  B. \& |' w$ T/ i3 p9 q
    ) F# V6 `. k7 O& g& w' a
    同理
    ' H( I% G) p3 p9 i. ?6 i
    ( O) [" m! }6 ^9 r8 M- f, [# f; C神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    + g2 i+ h' b. j- c
    & W% W6 O" g' B3 {7 [* b6 `接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式, E# `7 A6 W2 w5 M/ d8 u
    % Y  e1 p/ N- K) F0 e( ?3 R
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    7 D! g1 @$ R  F/ }3 U. s( M4 }5 ~4 t# K9 ]
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    ' j5 {" o; K* ^/ G8 a- {5 o& A$ s# b( z! Y
    再经过非线性变换Sigmoid函数得到0 p9 h7 Q2 X0 J4 N+ K* I

    ! s; C' L2 \( h神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), Z: p4 W$ s& f( B7 Z* a/ e
    % u! H6 o- z: {
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    - G4 _% s/ {% t4 D0 G: E9 S0 W2 D$ l( W: ~. c1 R$ ?' e
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为( I: e* M$ x0 ~( d) x

    * z. c2 u% K2 T损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2+ ^7 M- T0 ]: P! B
    9 N5 k3 _* `- r( B; Z: M  y3 @; W
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足* m* k( l2 U3 r
      f- q/ g0 b$ p
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次3 b5 [3 T" M/ l9 [
    8 X2 ^0 e4 ~. r0 b; y9 ^7 Q6 _
    学习率 (learning_rate 简写为 lr)我们设定为0.5* N- \- Y# Z" S9 N" X
    % k* y5 g  N8 V) X0 {
    依次求解代求参数
    ) y' R( a) `/ e6 F* t" ^3 d( n. l0 \4 O6 C5 W2 \7 V, U
    w1~w8,以及b1,b2
    0 b2 T( v2 P' i/ ]4 F7 P! l) X% J  T3 ~

    - t$ M: S+ v- M5 O  w0 w7 N3 U1 o' X
    9 X& i0 J7 R* S( j! C损失值 (eo) 的偏导数
    ; L9 I! k6 K& a( e. T  ?6 ~% R( r; c+ ?: L3 b8 t  ~* Z8 h
    再更新该参数,更新公式为
    ' @. d2 b2 W1 z4 m; v1 ^" ?
    0 h1 c3 b, ~& M2 o* x参数_new=参数-学习率*偏导(eo,参数)
    5 x, @2 {$ X8 s随后进入下一轮学习- b' _( z: C( p: Z

    - q* g2 l; g. N) Q: Q7 w/ s; X终止条件(满足其中一个即可停止训练)1 V1 n/ w9 W6 p1 t+ H0 [& e7 P" A
    * X9 k9 K7 Z2 t; r" c
    1.学习次数达到上限9 c) [; }- J) b" ~3 N/ J' R( L

    * O" i7 `8 u6 S- ~, E2 o2.损失值达到可容忍的范围) |4 L2 k8 ?8 @; B4 U4 `6 O  R

    8 Z4 C' R4 h9 |0 w: r; z导数
    * p) _9 m& [7 r) a, C8 ef(x)=1/(1+e^(-x))的导数是
    5 m, B0 @$ S/ Lf'(x)=f(x)*(1-f(x))
    ! _) A5 Z6 C, ]源码( k4 O/ @# }9 u8 {0 m
    import math
    ; [% I" X: v6 j6 o0 c0 M7 `1 L5 B" D, {, r) H; E% S/ x
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】5 c0 {  P3 K6 S- }
    #网址中图片有误,请看我博文上的图片
    8 a. @  [  B8 s# P, r, T( o' f- e) z. b' a0 f& b
    #输入层
      z3 E3 e8 \, I9 qi1=0.05
    $ y- Q  n/ [( n9 L3 c4 X* @i2=0.1
    & ^0 O- R" T' M# [" q#权值参数/ @/ B3 G# p# w& A
    w1=0.15& _0 Y+ x1 x4 A" i
    w2=0.2
    8 `3 k+ J1 T; X; K6 Vw3=0.258 [5 l4 S/ F" a9 g+ s9 U" @
    w4=0.37 V, }) H7 L6 Q" i  p( b4 R
    w5=0.4
    , L8 |: _! a! x% r8 |4 _. \% ^w6=0.455 n; r, t5 b" y! @$ @/ }0 [
    w7=0.5# Y/ c# ]. V7 z. r7 T1 p
    w8=0.55
    # u& A/ o9 L7 ~5 j+ _  R  c4 v: ^3 Y#输出层标记(即期望值). {; G: Z* t9 A+ {+ i2 P* t
    o1=0.01
    . n7 I" H7 t1 @' y6 ho2=0.994 y* S. r  |$ y6 A8 |+ {
    #偏置项参数0 D& C7 t+ ]0 @" x' g( H
    b1=0.35
    - Z) g0 T; _: P" s6 l0 d6 A7 rb2=0.64 }4 j! B7 g" D; o/ P  n$ H9 L3 V
      J& N8 l! N) Z- [% t
    #学习率! @5 Y: K5 D/ }6 _' _3 a
    lr=0.5
    4 X4 t# ~8 e" {4 U. l& I, R#学习周期! N+ P- Z- C5 {  o
    lt=0, T  [, {+ h4 V0 q1 g0 D4 ?6 E5 H$ N
    max_lt=10000
    3 A9 X  P* }1 H( t) I" x5 [! B#允许误差
    ) D4 \- Z) S  X- Peo_allow=1e-5  ~2 G" \$ q' @! C' }
    & j0 N1 K6 ^2 R% c, }" G2 u7 P
    #线性转换( H5 t( E* h7 @4 X
    def linear(w_one,w_two,i_one,i_two,b):
    0 M' }0 v3 u" n8 P: X    return w_one*i_one+w_two*i_two+b
    3 z9 j! o8 }: w8 n+ g# s* N#非线性转换
    3 C; P7 o; h# M& Q+ I; U- [def none_linear(i):( ~( T& }8 ~/ X# q
        return 1.0/(1+math.exp(-i))
    3 W8 s( M/ C0 W2 e* @
    * f. [' W) Q9 N) ?print("训练开始")  ^: w! E9 @! G. n; P3 I" p
    #学习周期结束前一直学习
    # }1 Q" \4 W2 T3 q: e) W+ A  }: Ewhile lt<max_lt:
    # D8 M& G, v, g/ a0 r3 s7 r    lt+=13 i- l6 |+ x3 F2 V/ R. \
        #求h1和h2输入值6 O' ~  p* p9 ?3 Y# ^
        hi1=linear(w1,w2,i1,i2,b1)- t2 }( Q2 h: h# Y4 m) k: i
        hi2=linear(w3,w4,i1,i2,b1)
    8 B1 w4 }" E6 y4 O    #求h1和h2输出值1 P8 m6 ~; ~/ Z. ], m7 l0 O% D" E
        ho1=none_linear(hi1)
    ( D! ^5 T2 ^) q    ho2=none_linear(hi2)
    6 q9 ~0 m) d5 _, d    #求o1和o2输入值2 h! f  F& R, Y6 @! ]6 ~
        oi1=linear(w5,w6,ho1,ho2,b2)% r  K6 o$ y5 Q0 W0 m
        oi2=linear(w7,w8,ho1,ho2,b2)+ a" |, T) }+ B9 h8 A$ C
        #求o1和o2输出值
    5 N  t  w2 P, S: g    oo1=none_linear(oi1): i; F* S% C9 D) |2 T  O0 j
        oo2=none_linear(oi2)2 m3 {6 h- S' ?& C

    . P! b) {1 [: G; e9 z& p4 A7 A    #求当前计算总误差
    + M8 v% N/ {7 J5 T    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
      O2 p7 |) [8 G- j) k    print(f"第{lt}次训练,当前计算总误差={eo}")- z* E; w( {& ~( _0 n: r# }
        #误差已经在允许范围,退出训练
    1 T6 A& n3 r  ^    if eo<eo_allow:) P/ z5 _+ g/ B) P+ ]* N) C
            print("误差已经在允许范围,训练结束\n")
    2 c0 n' G; N0 f& Z9 M        break
    6 _( {4 c) G9 K; V    #偏导- s. Y; s+ y; @3 p* }
        d_eo_oo1=oo1-o1
    ! M: ~+ O6 U# c: s    d_eo_oo2=oo2-o2
    ' i5 q2 z- R$ w) g    d_oo1_oi1=oo1*(1-oo1)
    # Z- t, [6 k, x# I$ q; H2 a    d_oo2_oi2=oo2*(1-oo2)
    $ [( k6 v; Q4 B. ]2 O# Z    d_eo_oi1=d_eo_oo1*d_oo1_oi1( o7 o5 b0 i* `; v! U! Z
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    " ^- o5 w8 ]! T& T) d3 W    #求w5_new
    5 J1 X* h" m8 {5 ]& ?    d_oi1_w5=ho1" e( |7 |% f9 s
        d_eo_w5=d_eo_oi1*d_oi1_w5
    . D, L& f! B, ?' a. k6 Y% R    w5_new=w5-lr*d_eo_w5) A# g8 _1 j" a' K, B* S1 l
        #求w6_new
    4 ^+ ~6 G3 _. d% m  ]7 {    d_oi1_w6=ho2
    / g$ v. F1 B1 `, N  f    d_eo_w6=d_eo_oi1*d_oi1_w6; {2 p" d% v5 [9 c
        w6_new=w6-lr*d_eo_w6- d2 p+ |0 q( v# b/ R
        #求w7_new
    $ _2 Q0 p' b" j0 h* T! y- B    d_oi2_w7=ho1/ k2 y( V: M( _5 F
        d_eo_w7=d_eo_oi2*d_oi2_w7
    7 O8 b0 v5 V4 C5 ~& b, A3 L: _- o    w7_new=w7-lr*d_eo_w7
    6 s1 ^$ U" \/ x    #求w8_new# a2 _9 a& n4 F3 V9 k' A/ S" c; @0 {
        d_oi2_w8=ho2# V8 w3 Y3 Y4 W) R' c& B
        d_eo_w8=d_eo_oi2*d_oi2_w8
    ) k* y" }( X& f  ~    w8_new=w8-lr*d_eo_w8$ w! y6 S9 |3 k* q
        #求b2_new  z3 R: n$ T1 l6 V2 o. D( l. z  v
        d_oi1_b2=14 S# Q8 V8 F/ J2 i; Y! n
        d_oi2_b2=1' b. s  w* f  }4 K. ^
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ! I  G1 `# i- g! i7 ]$ b6 O- e    b2_new=b2-lr*d_eo_b2% {- Q6 [7 z1 }6 [3 {
        d_oi1_ho1=w5
    9 t' t3 O8 d8 `' q& Z+ w3 V9 ]    d_oi1_ho2=w6
    , G' j0 \5 d% b, l) C1 C    d_oi2_ho1=w7/ l2 ~% t0 E) r- r$ C$ d* s
        d_oi2_ho2=w8
    # t$ k) \; U( F9 N" _    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    & V4 m' J" V# `8 \    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho27 b5 T$ s1 t1 E: w+ S
        d_ho1_hi1=ho1*(1-ho1)
    % c3 }: H8 {9 p    d_ho2_hi2=ho2*(1-ho2)% X2 {2 l' [$ ?
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    " m) U% G9 I% s3 t; l    d_eo_hi2=d_eo_ho2*d_ho2_hi2
      B  T3 q  m. o! A    #求w1_new
    " j6 {! D9 R, e0 S% J6 \    d_hi1_w1=i1
    ' r7 R* I8 e3 a7 p- b    d_eo_w1=d_eo_hi1*d_hi1_w1
    6 v8 Q' b& d( e( c/ s$ H# c4 ~    w1_new=w1-lr*d_eo_w1" S2 D! }( a0 r5 ?
        #求w2_new2 M; f( |& j+ q2 @& {, U
        d_hi1_w2=i2
    1 C, V: H6 \$ N' V0 T    d_eo_w2=d_eo_hi1*d_hi1_w2+ N  H# q" c- _, O) r7 Y
        w2_new=w2-lr*d_eo_w2
    : [% s1 D! ~" r* x' p+ X) u    #求w3_new$ _" a9 L' ~7 ^; H, n8 u
        d_hi2_w3=i18 K* V' R6 E9 c, Y, V
        d_eo_w3=d_eo_hi2*d_hi2_w3' |& N! Z% w& a
        w3_new=w3-lr*d_eo_w3
    3 @. a. O8 [! h8 C  Q/ w: C    #求w4_new
    4 l! G1 A2 K: O. o. b# z" X    d_hi2_w4=i28 E( c: M3 i2 G: u1 u) s
        d_eo_w4=d_eo_hi2*d_hi2_w4
    : y6 q2 u0 A' x' X    w4_new=w4-lr*d_eo_w46 ~, `" ^. u! d
        #求b1_new
    / n6 i1 @8 F  n; n+ g3 I    d_hi1_b1=16 S6 R6 f! b' I3 X  n7 c! g0 ~5 r
        d_hi2_b1=1; J4 s- L& s' ]
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% b0 T) M$ S; I
        b1_new=b1-lr*d_eo_b1' D/ n6 Y- m- V! i# x
        #更新反向传播! M$ u4 l( y: C3 p
        w1=w1_new
    ( Z0 B( X) S- I( c* K    w2=w2_new0 ?& T' l) g# m% O8 d' o
        w3=w3_new
    ( n7 g' v: F- C$ O    w4=w4_new
    1 a7 ^6 g0 ]2 A& u2 \9 l! D    b1=b1_new
    6 v( S3 g) c  g8 b" F& d    w5=w5_new
      ?" \: r1 o' ~    w6=w6_new" v3 a! V! Y2 d# K5 W, Q( n5 ]
        w7=w7_new( N" B8 V3 J9 R% G; R
        w8=w8_new
    ) f* ]5 C8 M9 r4 _0 Z; R# B8 `    b2=b2_new
    6 W4 f/ k. D3 R7 C$ \% p6 c% Sprint(f"当前计算总误差={eo}")
    1 \7 P' J- w7 r# Hprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    % w, j9 k2 F" L7 l& vprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n"), X& P$ V) l/ R$ B: p
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")& p' J/ h8 U4 @- `3 }' e
    7 j7 }) ^. }% s  _4 `+ x9 @/ ]
    结果$ q# x9 P% r( m

    0 M  O+ N% u  ?4 ^! ~" N* b
    . E5 W" G* L- x结语# ?) G2 _( G# |# F
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。: I( z& n; H0 Y2 K2 `
    8 M5 u! G. S5 F( l) {
    补充. c2 q7 E) k& u( ?: a- U& g
    程序中d_{a}_{b}格式的变量表示a对b偏导. a+ X' D( m+ ]
    ————————————————
    ) z8 t0 p1 `6 K/ c- _- p版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: E# h7 z( `# ^0 n$ B) d4 Y; l
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    & s2 `, a$ \/ W7 U6 H. q: B* l' F; o: S1 O2 \
    # N2 U( A8 W- y! w
    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 08:55 , Processed in 0.757212 second(s), 50 queries .

    回顶部