QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3004|回复: 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实现)+ v9 z( U  a* X7 y0 E

    ' b& }) [% q$ p. d1 U5 S+ [背景
    / J& }( n. m/ h2 d6 `+ q. q3 G3 o初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下8 @# E. C" Q) w% A5 {5 G5 m1 C7 t4 {

    % {! i0 B" y' t+ M0 y! Q2 e【神经网络分类算法原理详解】2 l& h- Z( v0 ~- q- u; K
    4 q5 D* i6 `) a" d# s1 k
    注意3 k8 N1 v1 F9 _) x
    站长提供的图片有点小问题,我们更正如下: ^! B8 F4 [  X+ p

    & `. m3 N1 F( E  V
    $ D2 E# w: X) }) E" ^% q  I3 h0 T- \7 Z  {
    问题  K+ p7 K0 I0 ?: n# p& U
    根据上图所示,我们有已知( @/ ~# M: Z4 e
    : R" R$ Y: ]% o9 U3 p( A% {$ d
    #输入层  G" j3 r4 L+ I: J/ ?0 V' C
    i1=0.05
    4 |2 W6 Q9 s+ ii2=0.1
    8 O3 |, [% G3 t, N
    6 Z8 l. e; f2 f# w' U% w- n" L4 X#输出层
    / d% I5 H  B* M# o7 I0 o5 X, Xo1=0.01
    : C9 o1 T5 l: K/ y. r9 b, O# |* Ho2=0.99+ |: Y! `) J/ o4 ]- |* e
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ) Q; q( p' |! _, ]- V$ ~5 a, ~
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    $ a4 D* v3 H! t& P
    4 @. p7 X6 C( x$ U9 z3 ^神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ! ]% N3 [' C+ S% H
    0 c; v! C. @0 W. `" `+ H神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出  B  \1 k5 f9 r
    ) I$ V3 ^+ Q# W. L& _/ ~* q/ P
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))! {0 R$ @3 ]/ {' w! ~

    1 C' Q8 ?" H$ C& r+ l7 I同理
    2 {& ~  Q: {! t7 K
    1 f4 w. K: i. K/ B7 F( }神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    8 P' D. w1 K, v- A9 A
    . `3 S- [( N" Z$ e8 q* Y0 P接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式8 P4 r- e( w6 L2 `8 j6 U
    * H. b4 A; M' b+ I+ K, e+ v# E& w
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    & P8 E4 n% d0 Q# o; J* F) g, \  G" }8 u' l# J
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b29 Y- B  |- K5 a( w: R5 }9 ~7 w
      u$ p5 j; s3 X+ w$ U0 ]( r
    再经过非线性变换Sigmoid函数得到
    1 U' }+ A3 e4 V! S
    # k) U2 D+ T1 e  B' w3 E9 B神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    ' s( n7 X; e. w' v; [% Q8 [5 {8 L" T( \, W7 a
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    2 d7 z% c6 a0 F/ Y* R$ @4 u. e* F: x6 n6 ?# `
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    4 u7 g/ ^& }! F  [% G( \) }# @; M6 y3 i5 b
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    $ i: u8 j3 |: z! @) ]: Y% B7 q3 U' k- E# N- b( T# ]
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    1 u: i# H# ^, l; l# l2 J% w
    4 L( ^9 C1 x9 l% H/ V学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    ; \& @4 m1 U: {6 ^# B/ v, {
    5 ^4 H" V8 O5 R2 k3 e& O& i, |( x& P学习率 (learning_rate 简写为 lr)我们设定为0.5
    - k4 h# C2 M( ^( Q: t( x# ]  h9 v! @+ W" w5 x% G0 `5 S; W3 i6 g
    依次求解代求参数4 x! R. z. B1 v, E$ j/ v
      `5 K7 ~. ~1 `
    w1~w8,以及b1,b2
    : i+ n4 Z' E1 U9 ?$ S' d. E- Z0 ?, \8 O8 v! h+ h8 D/ f- Q
    / i' o5 N) l2 s/ N) `
    3 O# i- h- g1 H
    损失值 (eo) 的偏导数
    2 l9 e- s% o  y# [9 {( U1 {/ ^+ S7 R
    7 F; W3 X; e, A再更新该参数,更新公式为# o. R  F/ P& [' c; S& H

    * Q8 w5 U2 u4 _- U7 X2 T, @参数_new=参数-学习率*偏导(eo,参数)
    ; V7 ^" {! x% z- |: z3 @随后进入下一轮学习
    ! `7 K% G5 X. f# c) b
    # N" v% h5 u7 \$ |! K' m) R$ f终止条件(满足其中一个即可停止训练)$ C; ^: G4 _. L  f4 F) q+ k
    8 G% t% V2 F+ k+ e8 t
    1.学习次数达到上限
    & G1 e4 w5 S* ^: [$ B4 v$ ^' `5 G5 M- B6 k- |/ b+ v
    2.损失值达到可容忍的范围& z, O, O* K" \9 j

    ( M. K6 }+ k( b' y+ K1 x% X4 l6 p导数. _5 O# \- a% _; P9 v
    f(x)=1/(1+e^(-x))的导数是
    $ o' S0 L! d5 w. [6 Yf'(x)=f(x)*(1-f(x))
    5 N( N3 V# K% m0 _# A  x源码# X7 Z* G3 c- z! E9 _3 V# i0 O. I& p
    import math2 y! G4 h4 f3 k/ T+ Y  j* z, K

    / G2 S6 x( h8 V. F5 y#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】: k& q7 Q, [2 T6 Z6 r& M
    #网址中图片有误,请看我博文上的图片
    ; \8 I, Q: v) q6 h' m( @! k+ b$ j; Z1 U# ~) G
    #输入层
    ' I( V2 g7 Y/ V1 [7 E- }i1=0.05. G) x+ `, v7 a7 c
    i2=0.1
    * q( Y. `& O5 E+ p4 E- L/ @#权值参数
    * S! Z* U4 z6 f  G7 c% b0 O1 u$ nw1=0.15
    1 X* r7 I4 }: aw2=0.2
    6 X, b  p0 S8 p1 j7 g# Qw3=0.25
      d$ h2 Z% C. x/ Z2 }# o5 m" B$ rw4=0.3
      D+ e8 z  m, b6 t/ O/ P" A/ aw5=0.4
    + Z2 [, O4 ~3 x1 `* W# {: @w6=0.45
    # f/ u# B( j& x6 h* ]w7=0.5
    6 w1 {. o) Q8 f  s7 z9 b- tw8=0.552 x  L& q$ Y6 p2 V4 A
    #输出层标记(即期望值)
    9 D0 K1 v7 g$ Y+ f9 m, e7 {) w. v2 Zo1=0.01
    ( d3 f$ q4 w2 v& e: d! R; C: Ao2=0.99
    2 M8 h: f' T6 K#偏置项参数" y; f5 k; f0 w
    b1=0.35
    $ y* U8 I( {5 R- S2 Z9 Kb2=0.6# X5 e3 B7 U& B0 e- F, h1 T
    6 P' X  |$ z- y1 }/ O: D# h
    #学习率
    # Z1 X6 P5 s- q% g$ i- }. [+ ylr=0.5
    3 X0 j7 F- D8 X" q' Q( |0 }#学习周期
    , S( }& F$ c7 P8 @  A# q* Dlt=0
    3 k( J8 A/ f1 [9 umax_lt=10000
    & T" s# C* L4 b6 U#允许误差
    ' e( X# N/ u: Z+ _. y9 B) F& k7 Geo_allow=1e-51 U3 x  q# T% N

    ; z1 f' u, f( D) |; k9 ?' L, y#线性转换8 A6 Y* b# ~$ h9 A# E0 j- p/ u
    def linear(w_one,w_two,i_one,i_two,b):
    / S; f5 _6 g$ t0 _    return w_one*i_one+w_two*i_two+b1 |0 Y4 m3 p# g! `, `
    #非线性转换7 G: \" x" Z$ F" _% C
    def none_linear(i):$ ]/ @# y* O* _
        return 1.0/(1+math.exp(-i))3 {& `/ w6 d& K' h
    , U3 N% \% S" h0 J
    print("训练开始")
    " i; `* Y2 I7 A#学习周期结束前一直学习
    . S- a# |  M) ]$ f. w3 \# \while lt<max_lt:
    1 S5 C& Z& W3 P: ?+ P    lt+=1* D& B" d& c; v8 X! ^  ^
        #求h1和h2输入值
      I+ x' n8 y# C, o) c  H; s7 N    hi1=linear(w1,w2,i1,i2,b1)
    $ g8 x8 y5 \3 ?8 Q    hi2=linear(w3,w4,i1,i2,b1)
    ; @0 a' t( `7 X( Q    #求h1和h2输出值7 v) }/ J6 p! k) p7 Y# d% _
        ho1=none_linear(hi1)3 g7 N1 ^9 `5 x0 m: b" ?. b7 X3 c
        ho2=none_linear(hi2)1 N. w2 [8 T5 b: G$ L/ }) i. g
        #求o1和o2输入值2 m% j7 j0 y2 Q) G- q+ {
        oi1=linear(w5,w6,ho1,ho2,b2)
    : |, m$ U* K* t" ?3 d8 a8 ]5 K    oi2=linear(w7,w8,ho1,ho2,b2). n& L9 M1 y% ]& \% m
        #求o1和o2输出值
    9 C: k( ]6 J+ C  T& a    oo1=none_linear(oi1)! V6 h, F8 U9 V7 L2 G, U5 G
        oo2=none_linear(oi2)' m# x* y0 t& F; l0 |( z% g6 k

    9 c$ {# l. d) [* H9 i1 c    #求当前计算总误差
    9 t- F: H$ w" T    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    ! g6 n; H5 H) G& G! V5 h# V    print(f"第{lt}次训练,当前计算总误差={eo}")
    3 g8 e  k, l: J    #误差已经在允许范围,退出训练9 q, v) u8 y, o& B
        if eo<eo_allow:
    % G1 ~. r) u; T1 ^  t        print("误差已经在允许范围,训练结束\n"): O1 Q( k- }9 B! d, X+ {2 `% z
            break& \  s3 h  ]  @0 ~* m
        #偏导
    / Z; p! d. M& j' G, N' B; _    d_eo_oo1=oo1-o1) ~  B) L$ A5 d2 }
        d_eo_oo2=oo2-o2, G! W( ?9 a, s
        d_oo1_oi1=oo1*(1-oo1)  q  l2 R7 i9 X
        d_oo2_oi2=oo2*(1-oo2)% L1 x& l- t; R8 C
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    , X1 ]  L3 R. _; H    d_eo_oi2=d_eo_oo2*d_oo2_oi2: S0 r" y+ u5 m+ ?7 M# J: n6 O7 v
        #求w5_new/ U8 z' R4 F" K# B
        d_oi1_w5=ho1
    # I: f. j. I) N8 K+ ~' ^, n" C* s    d_eo_w5=d_eo_oi1*d_oi1_w52 i+ r. e6 D4 j
        w5_new=w5-lr*d_eo_w5, A. M7 L3 ?) ]! G( A1 k
        #求w6_new6 W7 M6 |- v8 v$ O; o8 {" J# q" p
        d_oi1_w6=ho2( l7 V# s1 ^4 Y6 ?! [' t: V1 K
        d_eo_w6=d_eo_oi1*d_oi1_w6
    . N0 M9 f  T1 R' l- p" X; v    w6_new=w6-lr*d_eo_w63 u. s6 I$ s* K
        #求w7_new) J9 B! A8 a  p
        d_oi2_w7=ho1
    / Q6 Y$ `" U. d" p    d_eo_w7=d_eo_oi2*d_oi2_w7+ [! E8 l' n* z9 m9 e* W1 N
        w7_new=w7-lr*d_eo_w7
    4 u" A- M2 |, U7 {    #求w8_new
    ( {( u4 g7 G9 J    d_oi2_w8=ho2) K; b+ D$ b6 z! {
        d_eo_w8=d_eo_oi2*d_oi2_w8
    $ k  o3 D3 R' M. ~    w8_new=w8-lr*d_eo_w8; {1 s- N# [/ n- O+ `
        #求b2_new- L0 K3 c4 ^" x5 `! r, Y7 @9 ?. g' A
        d_oi1_b2=1
    ! c4 G/ x/ `/ a% X1 [    d_oi2_b2=1
    6 l$ H' H% |4 d4 _5 x7 S    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    8 \6 \4 X) m6 o! H+ L    b2_new=b2-lr*d_eo_b24 v" W4 {* u# P; ?! ?# x# [
        d_oi1_ho1=w5% W+ G7 i/ }; l/ w
        d_oi1_ho2=w62 I- y3 k& @! X% L
        d_oi2_ho1=w7" J' {: _& K3 f" D1 Y& F( P8 {
        d_oi2_ho2=w8
    9 `4 j; p9 p. _& [2 h; d    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    9 U% W# B* H0 {/ W+ ?' L$ T/ D    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    * H0 j: L0 O9 ~* K$ W* Q+ m7 s% T1 J    d_ho1_hi1=ho1*(1-ho1)
    8 C7 B9 r5 I5 I    d_ho2_hi2=ho2*(1-ho2)" i, x+ L/ h# F6 X  i
        d_eo_hi1=d_eo_ho1*d_ho1_hi1/ m6 v) V" R1 ^: T
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    , t. n& C$ R3 ^; a- z    #求w1_new
    4 q: C" j* r$ ], @( Q" d    d_hi1_w1=i18 Z7 P6 n6 Z  w) ?+ b
        d_eo_w1=d_eo_hi1*d_hi1_w1
    - K6 s7 o4 @7 a+ ?    w1_new=w1-lr*d_eo_w1
    ; g5 S2 Z3 |- t9 _+ p    #求w2_new
    2 i( w( s2 W! Q, O/ V    d_hi1_w2=i29 B' X+ e. m' W6 \( m3 j, v, _3 W
        d_eo_w2=d_eo_hi1*d_hi1_w2; ?- x. y0 R, i* y" s' R% D
        w2_new=w2-lr*d_eo_w21 _# @& G7 K" v( v& ~$ D5 Z
        #求w3_new. [3 A" k% w! k7 A* t, F
        d_hi2_w3=i1* o$ `* I2 l5 |7 ?6 K
        d_eo_w3=d_eo_hi2*d_hi2_w3
    : V* i) c: }- V2 o+ j* F) c* M. C    w3_new=w3-lr*d_eo_w3
    0 }# {/ s0 t) o! s  Y8 G    #求w4_new
    4 @) Z# b2 ~5 x( Q# g    d_hi2_w4=i2
    , ]9 F  n6 A% P7 V# j    d_eo_w4=d_eo_hi2*d_hi2_w4
    0 K' h% a0 |; C: G6 u' d" l2 [    w4_new=w4-lr*d_eo_w46 ~. D/ ^1 _1 Z6 t
        #求b1_new" q! F9 \6 f4 W6 ]* C
        d_hi1_b1=1
    1 {. z9 v! C) }0 E( X1 c3 u3 [    d_hi2_b1=1
    ; G. W- r  L- M! o! e' {    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    * L, \' R3 N) s) r8 [- k. f1 `    b1_new=b1-lr*d_eo_b1; U# s2 ^3 Y1 l. M6 ~( |) l
        #更新反向传播! J7 C8 G$ J& L- h: s+ z: `' L
        w1=w1_new. |$ t; ]* }5 K7 b' W6 ^
        w2=w2_new& U* F  s3 t/ o  Q
        w3=w3_new9 W9 j: T( b+ y0 s3 _9 E4 V" A
        w4=w4_new
    # s- P3 ?3 A+ O3 t/ o$ D3 E* j    b1=b1_new
    5 s* c2 S" k0 U$ h# x    w5=w5_new
    ; H2 Y. L$ W* Z6 H% b    w6=w6_new! h* a& }, K  j4 J% h; ?
        w7=w7_new
    9 P. v! R0 l/ e* E    w8=w8_new
    9 B+ \- w3 n6 R1 U% a5 j    b2=b2_new
    & f7 f  x  x$ X1 _# `: Pprint(f"当前计算总误差={eo}")+ H) m9 e3 T3 l4 n
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    4 E$ S- S; l1 ~' F( i+ vprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    1 E4 `7 e. x/ wprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")$ O/ [/ I0 d( z4 D  Q
    " n. G0 I5 i6 T3 o, m
    结果4 Z# d* v2 `) }; d3 k

    + f( O8 S: N7 u1 P" n" C' z+ G) \2 }, `- v7 W- @0 p9 o
    结语
    ( x: p# ~' w5 j8 ~1 r: w$ ]; w可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。$ A! L( _) i8 y- u) r# z

    # Z- T2 Z7 Q/ g- d补充6 M) T0 j6 i. }* W! Y' R
    程序中d_{a}_{b}格式的变量表示a对b偏导& r  b: J1 A2 Y: w
    ————————————————
    $ Q$ q0 p# \$ x: m; s版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " R: G$ x! E9 W9 V3 W0 D' j原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
      ^9 N; V( J# G; R
    8 r; s' D- i( ?8 G2 n9 h( j! T' i9 N+ O; 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-16 13:54 , Processed in 0.422163 second(s), 51 queries .

    回顶部