QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3029|回复: 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 }2 s3 n! a6 o$ i5 K# q9 t

    : r# O' B5 e2 k4 W" D! C背景
    / }2 z7 r% F1 I8 l0 n! ^  |- h初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    " x' G; x/ n9 O
    6 M5 K, r2 B  W. m  r5 d【神经网络分类算法原理详解】
    - K1 h9 K* i) X+ K4 Q
    : A7 N/ P) J5 i6 x' a注意8 p" s6 F  \+ X5 n& X. N  m7 d0 ^+ w) E
    站长提供的图片有点小问题,我们更正如下$ {7 j0 f! a9 D4 @$ j7 H
    / H  i1 y1 X( q( N0 z
    - q: D9 h1 }& F) K& V- y# F: K/ C( i
    , `; s5 o" R: _2 ]3 K  a. Q
    问题
    ) N* T; {: D! k- F  x6 i( R8 B根据上图所示,我们有已知$ o3 Q; K, d# |, a7 I( x( B8 H

    ( K: u3 m* V/ R7 v#输入层( P' Z; I+ k: x. B% u% q( o# o( {* V; [
    i1=0.05  w1 J) y7 s  c
    i2=0.1$ v& K( B2 [" W# G$ e
    1 ]9 W9 `% [, g0 e) E
    #输出层6 K( H! h# E. M5 ^% Q+ r) \# D
    o1=0.01
    7 p; U: g" \& r  No2=0.99
    8 H/ X0 Q" Z  z( q这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    ! j9 B6 v; \# S1 I* _$ Z3 U9 h" X. e! G( O: u
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    5 D; q& j5 j9 a0 ~0 j+ z  Z3 v( `1 f: e& R) Z2 T+ [7 S/ F
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ; F* O4 q: p. i8 a# ^( h: {( E5 H
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    3 Z" f' {+ b, y; v0 D( P& A5 N+ d; {) x* V
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)). s  \) J0 q2 [; M

    - [8 }; b4 T6 ?5 s! K  D同理! @" P, \8 r8 {) X! e( C" J

    + ]0 Q- l3 s  U" D# x0 [神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))4 |, l# U' J: D' a7 C

    7 Y+ b* i8 \- ^& u) E. y- \) [接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式2 l- N+ R- o, \! L0 d1 E& C  }. H
    ) \! _5 b+ S# S" {
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    4 I: P- S5 F7 o1 O
    : v0 z& L) w* ?* L神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2: s" c/ S8 _' z: X& r& {6 P

    9 Y7 V% D. i6 d) c再经过非线性变换Sigmoid函数得到
    & D7 p: \! w$ n# C9 ]' w4 h0 d3 c# y5 h4 w, o1 h
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    - ?) u, C0 p; }+ X( d1 Q3 W1 {" `% v% F* b( D
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))* |& A: K) }& H1 b, X- o
    5 g5 n' R# d* P% k
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为  E' T' S  e; F, q, i+ o1 v

    ( l7 t& b/ o0 D. S: }6 Q损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    0 P5 f& ]: B6 ?+ {5 M$ g5 z9 P  g2 M& o" ]' M
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    9 x% a) c  r7 Q6 Y% l1 g/ s# q& A* ?# i6 y4 ^
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次+ h  e& h) Q; {4 Q9 x! ^& [/ R) {

    8 p  r2 G) y+ @+ e) i6 u! N' ^学习率 (learning_rate 简写为 lr)我们设定为0.5
      O4 P! ~$ _  Q( V' y1 h
    * r$ K! S% c3 V& n& z+ J依次求解代求参数
    # a3 u3 |/ ^8 r  h4 g, h! L' T$ V5 c3 W; o: E- _6 ^
    w1~w8,以及b1,b2
    ) I% X9 Q3 V1 L6 x, A6 f8 t# T2 H( w: u" j) I9 B& v

    5 h$ @" Y: S/ _4 y3 t3 T
    & v6 |- M3 U( j8 K2 \. n2 u损失值 (eo) 的偏导数
    0 T) I* J. }! \/ J) {  L
    4 p. F0 U& Q; U& B! T1 o6 o再更新该参数,更新公式为
    ; c% M2 ], ?: I% ]! J! |
    3 l+ v8 \6 }! B参数_new=参数-学习率*偏导(eo,参数)
    5 E$ I  p) a" D% t: ^随后进入下一轮学习' p  E8 P9 ]! c1 i/ u

    0 N2 o5 }, s. F: ~终止条件(满足其中一个即可停止训练); j4 x+ W; Z5 V

    * c) `7 d! I, p8 ^* P$ H1.学习次数达到上限. {9 v$ F# c6 B# F
    3 E3 {. l2 M; {5 \$ G9 r# K
    2.损失值达到可容忍的范围
    7 l7 E; S; h; U" p4 _- G+ A2 q3 z; O/ l: P& S
    导数+ k: C/ @7 ]. z( ]4 f; ]0 E
    f(x)=1/(1+e^(-x))的导数是: D- G  d! g  V6 t
    f'(x)=f(x)*(1-f(x))
    7 _) u) g; A) c4 z9 N8 K# C源码0 S; [+ {# x+ Z8 n0 R! _) Q$ o; P
    import math$ H+ F. O: F$ V& j" i/ K2 E
    / c. t# K  m, S3 g, ~
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    6 I1 R. x* e' h9 _* c2 ^#网址中图片有误,请看我博文上的图片, \+ R4 H* j. M( M& p
    9 ?; p& F/ Q( m" J
    #输入层
    : f6 [& U: p  _; `3 t. e9 Hi1=0.055 |1 u, S+ R* c! [
    i2=0.19 T& _- H: u7 L" w7 a9 _
    #权值参数+ w1 l& {7 X- m- D
    w1=0.15. Y- C% D* g6 `& N7 F
    w2=0.2) P# i: A2 H2 j
    w3=0.25
    2 `, H5 S* E. B3 t) `: v  ~2 Fw4=0.33 @  p3 ^% V  p  t8 z3 j
    w5=0.4
    ( s; S6 g. ?' [8 t; v4 T" ~w6=0.456 f. l& U8 ]0 a- \3 ?
    w7=0.5
    ! D, ]" F- _1 {8 @w8=0.55
    5 W; Y3 L1 m0 _7 i# F#输出层标记(即期望值)
    3 S' J( l% b" n: P1 Vo1=0.01+ N! R% a6 J, ?0 a0 F1 J: Z# p) E
    o2=0.99/ Y3 T( W9 e+ H2 A$ d+ |, G' X
    #偏置项参数
    ) w' \7 C* T- v( _( U7 y8 s) xb1=0.35+ j& S9 o, s1 w+ R9 r
    b2=0.6  v' z3 V( |! h

    ' l. ~/ ~  D# B) s#学习率  E6 l9 y* `" B  r" E
    lr=0.58 O" G. ^% m. b4 O
    #学习周期
    ) s, V# t$ R2 Slt=0+ B  k4 v2 ^# J; O7 g7 G2 R
    max_lt=10000: @0 R+ H( i8 \( t3 Q) C
    #允许误差( L; `" x2 X( m3 W
    eo_allow=1e-5& Y; i* Z. I$ W- a$ G$ z

    2 A! ^9 d* ?7 w7 K: {6 P  K#线性转换
    6 W5 S4 ^2 I6 u, R2 ?8 Ddef linear(w_one,w_two,i_one,i_two,b):6 W7 ^" N4 Z2 U6 S. X
        return w_one*i_one+w_two*i_two+b
    4 H' _3 a! l$ O) E4 T; H0 Q#非线性转换" _1 R. W+ f& ?. d/ [$ B/ L
    def none_linear(i):
    / y" \6 O/ m! R) u    return 1.0/(1+math.exp(-i))5 ]" h$ D4 H" A0 q2 G. x- A6 s$ @5 z
    3 f  c8 _  m: m* {3 w1 D+ {2 N4 N# s! _
    print("训练开始")6 M( M# `9 k: c
    #学习周期结束前一直学习0 F" J( E7 k6 H7 }/ A0 A
    while lt<max_lt:' w- X+ F0 b( m7 ^% q1 U- ?
        lt+=1
    6 [2 q8 h" m+ |5 M# J    #求h1和h2输入值0 L4 @( j0 M2 a! W: ]
        hi1=linear(w1,w2,i1,i2,b1)5 Z# r0 ?: c  I& c; b% S* `
        hi2=linear(w3,w4,i1,i2,b1)
    3 i( r5 I) Y8 m) t7 ]/ l- A2 \    #求h1和h2输出值
      E! p& q5 p2 E; R$ O    ho1=none_linear(hi1); L6 A* V" m$ r
        ho2=none_linear(hi2)
    - W8 A* K8 O8 E% R( z6 x    #求o1和o2输入值& L* f% \8 A2 x7 _
        oi1=linear(w5,w6,ho1,ho2,b2)
    8 X# P# R0 F! U: @: h  P    oi2=linear(w7,w8,ho1,ho2,b2)$ J- @/ T" Q7 L& N- u; q$ V& w9 e4 H
        #求o1和o2输出值1 _3 {$ c# N3 P/ I) F1 f
        oo1=none_linear(oi1)& u; C" J$ ^# [4 t+ m* M; ]
        oo2=none_linear(oi2)) k! Z: W' m) C6 L& L" l0 P7 }

    % J3 B7 o0 [9 w7 l( |/ L" X5 M7 D    #求当前计算总误差! j) A# Y6 d$ K
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    : r( J' u; N7 i7 z2 K, O0 ^9 \9 X    print(f"第{lt}次训练,当前计算总误差={eo}")8 m3 M- U* G, p9 g0 t8 O* W6 K
        #误差已经在允许范围,退出训练6 ]4 ]) m3 [7 G& l
        if eo<eo_allow:' t( n9 U+ c% U
            print("误差已经在允许范围,训练结束\n")  Z% H; y5 B1 \$ u' Q# B
            break
    ; Q" }% f) y0 [1 X1 G% I: O6 G0 W    #偏导
    # H/ Z' m, [5 F$ u6 n3 s    d_eo_oo1=oo1-o1
    / i8 s& p' _1 j& e8 Z! ~9 k) T    d_eo_oo2=oo2-o2
    % a! e" R; A  U2 N0 k. k( L    d_oo1_oi1=oo1*(1-oo1)
    8 Z1 w8 ~: g2 Y( ?* L7 ~0 g# X( A    d_oo2_oi2=oo2*(1-oo2)- o: p6 `$ x% w6 C4 Y
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    7 A: N1 h/ B% F    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    8 R8 ^6 e: i, c; ^- T* q    #求w5_new
    % m6 ^5 u$ I% C# F: ^2 Z    d_oi1_w5=ho1
    ) u; f) _4 p( l+ p% ~    d_eo_w5=d_eo_oi1*d_oi1_w5' V4 [  M# H4 d3 Z) r: \
        w5_new=w5-lr*d_eo_w5
    7 u. H/ r. Y4 c    #求w6_new+ J; i# j7 o3 f6 f; m0 k6 c
        d_oi1_w6=ho20 k" g% j$ l( R
        d_eo_w6=d_eo_oi1*d_oi1_w6* C" i+ K% z7 ?0 d/ C+ [4 o  q
        w6_new=w6-lr*d_eo_w61 B6 {, V$ u, u! v* w1 v
        #求w7_new! Q. }4 t7 ]1 F
        d_oi2_w7=ho1
    2 |$ V2 K- B8 O# g) v" d    d_eo_w7=d_eo_oi2*d_oi2_w73 _# _2 w/ r6 x. Y  g
        w7_new=w7-lr*d_eo_w78 P! l" p3 ?  Z2 L9 p$ o5 K
        #求w8_new1 L  v6 x; ^6 l
        d_oi2_w8=ho2
    4 |/ n$ q) l' H5 B    d_eo_w8=d_eo_oi2*d_oi2_w86 R! |9 O* l, c! i! {$ E/ }- E
        w8_new=w8-lr*d_eo_w8
    6 z0 G8 f1 r( D( K; h: J0 o" R+ z% X    #求b2_new+ D7 R0 B, _$ X  \: ]
        d_oi1_b2=1# H# y3 ~: H. s9 R- ~& A  H
        d_oi2_b2=18 c( X. q! b1 _# q2 E" K! ~
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2$ f' y2 o" `# V& U* Q6 s! c& j
        b2_new=b2-lr*d_eo_b28 A+ U$ |, O2 A- J% G- j& G' o; R
        d_oi1_ho1=w5% Q; f9 B) [8 p8 h9 G  z/ [
        d_oi1_ho2=w6" W# L# J7 \* n5 b/ N' N9 }1 }2 L) N5 I+ ^
        d_oi2_ho1=w77 Z  }/ F; ?; R6 z" G
        d_oi2_ho2=w8! a- x# u+ L* i
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1+ o/ g: e, R& I# b% U& c
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    ! W0 U4 u2 D1 U; O: B3 m& ~+ L    d_ho1_hi1=ho1*(1-ho1)" x! D0 V! f+ j/ u/ Y) p6 G1 q- }! K
        d_ho2_hi2=ho2*(1-ho2)
    , x6 s  R  j% F5 c# L    d_eo_hi1=d_eo_ho1*d_ho1_hi1
    1 T7 c6 `2 F+ L7 R7 d: Q    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    9 w# `1 }* o+ n    #求w1_new
    / E% n0 H0 E- t+ n" X    d_hi1_w1=i1& I+ d( r8 z  k2 m) @5 J
        d_eo_w1=d_eo_hi1*d_hi1_w1
    ! e- R" C; ]) N' e  |: S9 ]    w1_new=w1-lr*d_eo_w1
    1 C$ q& y$ H; b0 @  `; i    #求w2_new2 i. S" L6 B  t4 r4 z1 S% s5 V; {
        d_hi1_w2=i2
    5 g9 J: A& N) m# s; c% O- R" [5 }    d_eo_w2=d_eo_hi1*d_hi1_w2& J7 V$ P3 _, m8 A
        w2_new=w2-lr*d_eo_w2
    4 [  [& A; K  h6 [. k    #求w3_new
    ; P' g) O* N5 B2 N" Z+ I    d_hi2_w3=i1
    $ w& y7 ?5 Q' X    d_eo_w3=d_eo_hi2*d_hi2_w3
    8 d3 T7 A4 n! A& w/ C    w3_new=w3-lr*d_eo_w3
    ' y/ D- x3 P/ a5 g4 {    #求w4_new
    1 q0 g. H" r! c" K" Y7 V  L    d_hi2_w4=i2( q4 {3 F/ B5 V! J6 y  [5 B9 h
        d_eo_w4=d_eo_hi2*d_hi2_w4
    ( ^. v# m* J# d$ v, T* `    w4_new=w4-lr*d_eo_w4( d) H9 s( S2 G1 u0 j8 s; P# J
        #求b1_new
    8 T- l& r- W  I) N9 S    d_hi1_b1=1, a) s! l, h8 o9 ^; ~
        d_hi2_b1=1( }7 F6 ]3 \6 X; V3 N' B  J- l$ A
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1" n' ^. J7 e6 ^( @3 W
        b1_new=b1-lr*d_eo_b1
    1 ?2 J  x6 E' [/ u8 g; k, D' u    #更新反向传播
    . j/ u6 e3 C- H* g    w1=w1_new
    5 q0 b: A1 a' h' }4 d6 V) g    w2=w2_new2 W, Q% D9 G/ B: L6 I
        w3=w3_new
    : X) Y+ `( Q3 {    w4=w4_new$ o2 `) S& H9 y5 m: e- e
        b1=b1_new% E" i: Z4 D/ j' Y) c; y! V
        w5=w5_new' _7 m/ k- R3 N7 Y3 y; R' c
        w6=w6_new
    / B/ Y6 _. `0 z) m    w7=w7_new) }4 L  l  A" K6 k; Z
        w8=w8_new$ F4 P! k8 F: Z6 J
        b2=b2_new8 f; f- z0 Z& p: }3 n0 Q6 ?
    print(f"当前计算总误差={eo}")
    + p' e: M9 t: E8 \8 o. s5 I% t8 wprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")! n7 c& @6 T" k
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")3 Q. g1 K" ^6 X- v
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")2 G. s) s8 }9 ?0 |$ [8 k; D2 d

    # f: r2 f7 V# |) l, N结果
    $ U" F$ I# @) @; |9 l# J: l
    ; p0 P* K3 t* r$ W; w! U0 q
    " f- G3 A7 N) K$ Y结语
    , e; d# U! B& e& G可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。4 J) G5 Q  g1 r- E% Y; i
    , o+ J4 F  V% T" m
    补充- _" D2 Y2 Q" P/ j; k
    程序中d_{a}_{b}格式的变量表示a对b偏导$ W8 s3 s7 d" g2 y
    ————————————————
    7 u+ s! [( ?5 {6 U版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 |" S! F5 p9 `3 c
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954: I# b7 z. O4 u- b2 Y
    . P5 B9 L0 ~; }4 ~* Y; ]9 z2 b
    , ~9 S& m# A8 q0 N+ h) o
    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-6-10 23:37 , Processed in 0.401882 second(s), 50 queries .

    回顶部