QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3068|回复: 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实现)5 g9 I. l% {( l: G( i6 {' v
    # ]8 H5 n: ~# f& f* G" h
    背景  e" R4 ]+ I) y) w5 H/ Z9 ^0 {
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下3 @0 n1 J8 `" d0 I/ V& i9 ~

    7 E1 N* S2 ]! v6 R4 M【神经网络分类算法原理详解】
      r, u. ?" _3 m, \5 F$ P  V+ s4 Z- T- {
    注意
    # ^2 n: \7 o) f! p站长提供的图片有点小问题,我们更正如下
    9 y* J; R" e! S7 r8 K
    ) Q( p7 G! \- h- Q0 f# a# D* ^
    8 B3 N. m. ?% T. l& q1 H
    + L* d9 D, V4 m问题
    & `- Q  x, m+ b- d8 a. _3 L, g根据上图所示,我们有已知& j% Y" E* V4 j8 m5 _. n/ _

    9 y0 Z1 h) _! J; c#输入层
    5 l9 X& Q; u+ }' v0 ~/ I9 Ui1=0.05
    ; B  |( T4 n. W& R" _5 U- hi2=0.10 Z# d4 F" |* ?4 a2 S

    ) g  r. m9 x+ R$ j# ^#输出层
    : u: J9 _2 a5 o& lo1=0.01
    ) j: y* S  B- V) ~o2=0.99) D2 X9 j1 f/ T) z3 C5 ]) N
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    3 \+ x7 o  d) Q! d- F, m. w1 ?! x7 U  o3 t3 J
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1. m2 P$ T7 b" R5 l
    . ?7 i# B" o  x% g3 V5 l7 X
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1: E$ {3 I& e  g; Z

    * Q! z% ^$ e' q2 l- D3 p神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出" A0 t9 S0 o2 y$ O0 ^
    " U3 q' ?' S* Q% _4 Q
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    6 K1 Z- M& E4 T
    # B: h6 O. C* x. I" u& [# I. E同理
    " V2 Z4 S" M% r6 h# [  D' Q0 T$ m2 F9 d
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))4 z( w# T- Y& H* V

    & V  g' N5 ^- F7 O; u$ u接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
      u4 A4 N# Q0 q& M
    ; t2 H1 ~: S# E神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2! J' F  z8 q- q5 L2 c
    & o- B) p: j% U6 v
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" m: n$ k' I! m9 H, K0 M" q8 K
    / K/ ^3 c6 J& K7 C
    再经过非线性变换Sigmoid函数得到# i; V: p2 a/ ?2 C
    % N/ n$ f3 F8 D
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    * ^* B- C$ Y( i+ a4 X- T- U6 H* u) t2 Q7 Q& [- T2 I
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 x0 T9 |1 [* A4 v5 Y" |

    ; ~4 |$ G- G+ v8 A我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    5 o% E9 O0 m0 A( T- b, e& e2 a- O( Y1 X+ w) q# R0 s8 \5 j1 y4 |% T8 ?
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    1 i  O$ B. h: ?* i) i; V
    1 l6 z( H5 g7 n* M由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    , L1 R3 D4 D1 o0 \
    0 ^: N6 b  w; \6 Y学习次数 (learning_time 简写为 lt)我们限定最大为10000次9 ]6 {7 j4 H5 t
    # F+ h* G+ J' z; i2 K" z/ O
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    $ f+ [0 F( g/ A) b5 W& a: H. Y8 x+ S& y" q6 E9 B- W; V* j
    依次求解代求参数
    : t( o$ A& ]5 t6 ]6 U3 |$ M, |" x
    ' P9 \8 q( m/ i$ rw1~w8,以及b1,b2, E9 j8 i4 @' V( f& u4 M/ _
    " k* T" g6 ]" R- m: T2 B: T' B

    ! g( L4 F5 V5 J4 p6 @0 P. ?& d, S+ @' x- F( n& u0 Z
    损失值 (eo) 的偏导数
    6 Z( E: ^. g7 I9 _1 t
    , {& e6 }4 l6 g6 w! d再更新该参数,更新公式为$ C' l7 E! k% J

    : \3 S8 }6 _% V/ P参数_new=参数-学习率*偏导(eo,参数)
    ) }+ z. o( j7 e0 M- D1 l; I随后进入下一轮学习
    $ A: u% M' C' Y. B! r
      w9 w. F* s6 A. u0 x9 ^% i+ [" a+ e2 F终止条件(满足其中一个即可停止训练)
    % \, t9 A' ]# I8 ]2 Z8 Z
    5 l( v3 H2 W, X9 e1.学习次数达到上限
    : v% @1 r% a+ e+ i0 C! C9 z0 ^
    ! _+ ]4 j9 E% a: w2.损失值达到可容忍的范围
    # S' K' V4 {/ I: @0 P! F8 [1 t  i- c1 @
    导数
    4 ], t3 }9 i% n4 @0 T( |: y- Jf(x)=1/(1+e^(-x))的导数是
    0 [. e" m+ h* A/ P0 Z. ef'(x)=f(x)*(1-f(x))* O$ `" {7 c7 c
    源码/ N  A* l5 V; ?  @2 G, h& w3 c
    import math
    3 l/ w2 B6 U+ c1 J9 h* v" @7 d/ Z$ ?0 M5 N. b, M' d
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    4 l" v5 c- X* ^6 _- n( C) M#网址中图片有误,请看我博文上的图片
    3 B0 I. J+ {7 x, }
    * V0 X+ k* p: k7 j. N: `4 W. e#输入层6 l- k' r5 v# e; @5 ?
    i1=0.053 ]6 b: J& g2 \4 [, H$ w& V
    i2=0.1
      a2 [) T- w( W#权值参数
    ! {# G6 ^+ w9 Lw1=0.153 ~. Y" b: x6 Y- w, c5 b% ~
    w2=0.28 t3 m7 K2 X% I8 T% s- y% h
    w3=0.25
    ( C) k5 l- H! g( M* Z6 g4 {w4=0.3
    : ~# m* E% }, i' a3 aw5=0.4
    1 J& N; d  Q8 h! v7 o3 K, U( `" iw6=0.45
    * x6 _4 \. k# Rw7=0.5# T  O3 Y+ {  U6 w  X) d
    w8=0.55
    % v/ c) l, E7 T3 L9 C  o0 d5 |#输出层标记(即期望值)
    0 A2 k+ r; _7 p) n% h3 [7 oo1=0.01
    ! H! v2 o' ]; c$ b( b* Go2=0.991 F7 \- b# a$ a% }5 b8 ^% r* i
    #偏置项参数
    8 k  n, e9 `# Q; ^b1=0.35
    6 u8 X5 {3 _' _5 db2=0.60 g2 E$ S5 s2 N6 P) O2 n* ~: s
    / }" i6 ~1 d% Z" v7 x% }, u
    #学习率
    / Q  K; j: u+ N0 P; }: Wlr=0.5: e& E2 b2 F5 F; q2 `' T
    #学习周期
    7 P5 g6 W& x8 M* p& A+ `lt=03 l0 i0 j* r$ R9 N8 s' y1 w% y
    max_lt=10000
    7 [" N2 o; O9 J3 c" g: D#允许误差
    ' C2 x7 G/ ?, M# t+ a; C2 xeo_allow=1e-5, L! c5 M1 b' A" a

    ' q! e0 v3 `: n* f#线性转换4 @) G& R; ^, a5 U) Y, D
    def linear(w_one,w_two,i_one,i_two,b):9 ]' Y) ^# v/ @) I7 [3 E
        return w_one*i_one+w_two*i_two+b
    7 t$ I; x! R  s8 j#非线性转换4 R7 a7 T2 W' b# q1 v5 a
    def none_linear(i):2 s% r( ]* L# P7 W& e
        return 1.0/(1+math.exp(-i))
    ' \7 v4 L8 o* o$ H5 i2 q: K/ a0 E- e  V9 z+ m' b
    print("训练开始")
    . w; E! o3 P8 J3 S: R1 v#学习周期结束前一直学习
    8 R* o" C/ Q; G$ k- jwhile lt<max_lt:  r% h6 x# B6 H1 g3 }
        lt+=1
    / p% Y, d2 F% c, j; \7 y+ g  q/ t5 i    #求h1和h2输入值
    / w7 `: x0 P; O; e5 i$ [    hi1=linear(w1,w2,i1,i2,b1)
    2 ~- x1 V/ U; c+ g7 i' H    hi2=linear(w3,w4,i1,i2,b1)
    4 S5 s: E( Z% y- o3 W    #求h1和h2输出值8 \$ k3 d5 N' t& p7 P1 H
        ho1=none_linear(hi1): N) E* _; `" a6 @/ ], F- `
        ho2=none_linear(hi2)
    " U2 ^) a& K3 Z0 U$ a    #求o1和o2输入值
    # q  u2 \9 u  |4 c# y) r# W    oi1=linear(w5,w6,ho1,ho2,b2)
    ( P) {) j( h% ]9 ]. Z! G    oi2=linear(w7,w8,ho1,ho2,b2)
    3 L; I$ }9 k, v7 d& V    #求o1和o2输出值0 R2 E7 h# [- y6 T) V2 R
        oo1=none_linear(oi1)+ F( J- m: i# s4 h' \6 `
        oo2=none_linear(oi2)
    ( ^9 o: [. `  s* z. C9 ?
    8 y5 N5 n% \9 X    #求当前计算总误差
    ( u4 p; ~. k4 |& X    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 {  _2 W+ ^: G: _9 R7 J
        print(f"第{lt}次训练,当前计算总误差={eo}"), w, i8 D  Z$ ^9 T
        #误差已经在允许范围,退出训练- K9 g5 W5 z! {4 E7 ^
        if eo<eo_allow:" {4 p: q' E- n$ i
            print("误差已经在允许范围,训练结束\n")
    , R1 v2 K7 `: @5 @% e3 l6 t        break5 V, F0 F4 x8 ~# W$ H( F
        #偏导6 [  e; l0 P5 z# U% b. i
        d_eo_oo1=oo1-o1; Y& d; h9 o5 y, C( }
        d_eo_oo2=oo2-o2) e' X  u4 _8 e0 h
        d_oo1_oi1=oo1*(1-oo1)
    9 K( {" ^) V- e1 A+ _8 a( n    d_oo2_oi2=oo2*(1-oo2)
    . l' h2 k# g* |* z, T% j9 C6 F    d_eo_oi1=d_eo_oo1*d_oo1_oi1
    " ?; I- A& A8 `; Q6 F    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    0 c+ Y; _+ u9 _6 p+ x    #求w5_new+ o% R: U: Q- U) b7 A, K  z0 ?' {. r
        d_oi1_w5=ho1
    1 b1 @$ V# k, w% `2 j% X* E" X    d_eo_w5=d_eo_oi1*d_oi1_w53 o6 S! a" F/ D) a7 [
        w5_new=w5-lr*d_eo_w5
    : P" t; F; d8 q1 {' x3 m# m    #求w6_new- Z4 {; J- u% @4 {( L
        d_oi1_w6=ho2
    / G& D. I* [% m: a  Y4 d: H    d_eo_w6=d_eo_oi1*d_oi1_w6: k; l! T6 T, A0 U' |- L
        w6_new=w6-lr*d_eo_w6
    9 I  Z" o8 {5 q& q    #求w7_new
    : V' q  I, N8 W* S  h$ u# {4 V    d_oi2_w7=ho12 f4 U: c' |* V+ l+ H- \
        d_eo_w7=d_eo_oi2*d_oi2_w7
    9 Y: n9 }' i" l) i    w7_new=w7-lr*d_eo_w7
    , ~; \7 q3 H% s9 ^* ]    #求w8_new
    ) h+ t* b! i2 g    d_oi2_w8=ho2; Z/ r9 i! Q  |6 f1 T8 D
        d_eo_w8=d_eo_oi2*d_oi2_w8( Z* M- L1 c& l* T) O4 w8 R
        w8_new=w8-lr*d_eo_w8
    ( m$ O! B1 \9 Y+ B; F% G    #求b2_new8 A) s7 @! P6 z) W5 O6 ]
        d_oi1_b2=1
    ' j8 A) T5 F/ [" C+ s% P    d_oi2_b2=1. x) u. e1 }8 A
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    ' X3 N  L) |& [1 U4 X% C    b2_new=b2-lr*d_eo_b27 r' D+ M( c* \- d+ z( V
        d_oi1_ho1=w53 x: u7 X5 K3 \- c- |* o3 \/ t
        d_oi1_ho2=w6
    ' C0 i5 g9 d# k- |$ l- z/ A& e    d_oi2_ho1=w74 ?2 }. I- r2 T, n+ m: Z' }
        d_oi2_ho2=w8' P: E+ w# ?4 [- k* @
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho11 Q# w% g8 S* U
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    * z( i# _% F* k" e: F    d_ho1_hi1=ho1*(1-ho1)1 l, _. e1 A+ w7 Q
        d_ho2_hi2=ho2*(1-ho2)- ^0 D3 K, X. g( q( F2 f2 b
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    # _: ^0 ?# [3 [  u5 `4 |    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    ( Q& S3 ^$ ]/ i0 O' e" z+ t& H+ C    #求w1_new
    4 m: K9 u) K2 o9 P1 F$ Y7 W    d_hi1_w1=i1
    8 }2 s" I' E2 L4 n7 w% r    d_eo_w1=d_eo_hi1*d_hi1_w1
    , F  `! ?9 u  ^5 v+ ?) G* T# b    w1_new=w1-lr*d_eo_w14 w4 B5 w6 ~8 Y- f
        #求w2_new
    + {  X7 @  n  s4 p: b    d_hi1_w2=i2
    3 m( b" d! T+ d( x    d_eo_w2=d_eo_hi1*d_hi1_w2& s/ w& @/ }7 y5 ?
        w2_new=w2-lr*d_eo_w2) |  ^1 u. ]; B5 ^& C; \9 N" s
        #求w3_new
    7 T5 N! v# c) C" F( ?    d_hi2_w3=i1
    # U- G3 T- o3 \  r, u: Y4 i2 R    d_eo_w3=d_eo_hi2*d_hi2_w3- K- u7 {* Z! t3 j! ]
        w3_new=w3-lr*d_eo_w3; z: M1 a, S7 c; t  L
        #求w4_new6 P4 [7 H/ U# J1 h
        d_hi2_w4=i2
    ; z4 C  Z4 ^9 x/ z  t4 g5 u, ]% K2 P    d_eo_w4=d_eo_hi2*d_hi2_w4
    + N! n, L% W) \$ @    w4_new=w4-lr*d_eo_w4
    5 N8 [% i* ]& F, s8 z- Q0 i1 e    #求b1_new) _% K- F* A$ d3 x; n8 o) f& G, o. t
        d_hi1_b1=1) T) x3 i4 S" `- @; |0 A: `( M
        d_hi2_b1=16 d* A" D: Y  k2 [' b
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
      P; w1 q3 ?7 u* [$ ]& J8 \) j    b1_new=b1-lr*d_eo_b1
    ( b) J9 R# {' u    #更新反向传播( o4 p0 @- y2 a4 ?4 L1 l# K' F
        w1=w1_new) j# q0 s  T, i6 ?% [
        w2=w2_new; q% o  \7 t# \) \8 j' ~; B
        w3=w3_new
    . t1 S# F3 Y3 H4 A$ ?) p# F- `# @% G    w4=w4_new. [' K" z2 O, d/ t$ [
        b1=b1_new0 W3 \. y+ Q) x& _+ D
        w5=w5_new
    * e3 ?* y3 S, W4 E    w6=w6_new/ N, w) ]3 @( w
        w7=w7_new$ i+ v  i" i% |4 K8 o, m/ ~8 k
        w8=w8_new" d* j& x7 Y  v4 _; Y# V7 l
        b2=b2_new
    ) |  m1 s! t' z) O8 j4 lprint(f"当前计算总误差={eo}")3 W8 \8 f; V2 e# E! G
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    & e1 K! O4 Z& U3 j/ [1 _& }( rprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    4 r+ V5 x! S2 m& c4 K4 X6 W: P' A8 [print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")6 J6 C& V- J5 Z/ Q/ |* W
    8 K4 U% ^: M" X- I" K* y
    结果
    % @5 q  x' t  F  |  b. e/ T$ T8 H$ H; n- F0 _5 I

    ( x$ f# q% p+ B# }结语
    ' v; u8 A$ }% D0 ?可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。' [6 w8 n3 [, D4 r
    9 L* D+ [/ @; t' {, h4 g
    补充) h& A; ]; i+ W
    程序中d_{a}_{b}格式的变量表示a对b偏导
    1 Q! ~% }1 v$ |————————————————
    5 f' Q; x( O* k7 Q# A版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; I' Q( T% {& F8 l5 g4 J
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    " s4 t) v. U5 A, l/ t) C9 Q- F- D4 o' @% b! r5 X* B+ s2 G
    9 F  }4 Z3 h$ l& T( o( j# R
    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-8-24 04:03 , Processed in 0.666329 second(s), 51 queries .

    回顶部