QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3081|回复: 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实现)4 ]% ?. A/ [# J( u

    + Y/ S' R) f/ `. q背景
    1 G$ R2 v4 h! F: f  c初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    , {. v5 p& c; t( }3 r+ N! w: l. ~7 v  R( D4 Y
    【神经网络分类算法原理详解】7 p4 `! o1 q' ~

    % I7 c& E9 A7 k; S' P注意1 L5 J- ^! O/ ^* k4 L. |" I
    站长提供的图片有点小问题,我们更正如下1 W- G* [, S1 ]! u# l# U$ u  ?. Z
    * x0 x$ V1 ^0 n! w2 ?

    ; ^8 y8 q, t8 {+ {* G% G! g. L1 W
    5 ?+ K  H0 z5 x( ~8 k  [问题. G) z% p  x! h" I5 P9 t6 h
    根据上图所示,我们有已知
    2 M* W) g: e# A% \) E# Y7 O4 E& |, H  u( L) f; x1 y
    #输入层7 f0 M' P  l8 V8 ^
    i1=0.05
    ! @8 z" w8 o( V# k/ Si2=0.1( l5 ^# A$ d! }% r+ q8 t0 a7 D6 @
    3 P7 r- W, G  x% m
    #输出层
    + H- E2 X: o1 w9 {, x- po1=0.01
    $ Z( @( @3 p( o6 so2=0.99
    6 R2 p* G/ \" Z7 ~* p这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的8 o2 |9 \# o2 U: y
    6 }) |6 ?+ `$ B& H
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1+ P4 m) D% d& j5 J
    % X7 G# w- W7 v/ L+ B* N
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    . N3 l6 C! u0 Z+ I
    ) O- N8 a' S0 r# G神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    + q+ P. u% B( F& T2 P" Z- [! L# Y) d2 @9 e- }0 l- \+ M
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))- _% s8 K$ ~% j3 N" e% a# v5 @, t! |

    ; k/ }1 i' i. T( y同理# z+ g: p* M2 v$ \- N

    ' P" \! E( D, [- w* Y8 T) C神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))8 F: F8 J) Y! X
      c+ v5 u) c5 c: m) v8 B1 B9 V
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    ; N$ }5 |+ b6 J, d) w) ~4 l  [
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    2 s( a9 h" S/ G' w; l; t$ u, i9 z; M6 b" D
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    3 H5 d8 E2 P; \) ?; u( I: ^6 B- t
    6 y+ }. Q: d2 W$ C$ \$ n# O再经过非线性变换Sigmoid函数得到6 e9 `! _. w$ ^8 b! p9 c
    0 k$ ^9 r5 |, x; ?# W; W1 }& ]+ u
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    + T) I) r$ q8 u+ j! ]8 j  `0 ?# g# I# P
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    1 z" j' x! P/ r: u" f! A4 I/ F
    ) B- ?' y, W8 O  S我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    5 s6 t6 b) D. `4 l) \
    $ A1 d& k' p7 L2 |  t/ x损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    ; y4 F. k: K+ D. _( G5 P+ t
    5 A3 X4 L1 u: I0 ]由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足5 v( D4 z5 o1 X: S( `; o2 H
    1 p' }1 I& P( t) i
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    3 H( r5 x& a( U8 H( Q" z6 S1 A7 \" m; }9 [2 ?& {
    学习率 (learning_rate 简写为 lr)我们设定为0.5# q, m% J2 y4 s0 W; e6 m

    , n8 E  k1 x; n, q9 @依次求解代求参数
    3 b3 s% ?" b/ e/ P4 Q
    8 h/ A; z, b1 g. dw1~w8,以及b1,b2! G: T% a3 I9 I, e* X3 ~, A* Y

    6 W% O; t6 N3 `2 K" _+ V( d3 m; N+ C; n9 s
    6 `' W) T$ {% b' ?# _; b0 t
    损失值 (eo) 的偏导数8 l9 Q" {; ~& }8 u
    2 s. x. T0 `% o- ~
    再更新该参数,更新公式为
    + q% Q7 ~0 I5 G  @9 F, i" G  N: E, i' ~
    参数_new=参数-学习率*偏导(eo,参数)
    3 n+ J  j- Z" e  ?3 i6 h' F- [6 r随后进入下一轮学习
    ! o0 t' D9 v8 o7 C- u: r' `1 a% k9 }/ ?/ L% P9 M. ^( l, t1 \1 S
    终止条件(满足其中一个即可停止训练)
    ! S5 w! W6 D6 E% J$ ~
    5 o) D9 n3 M4 z5 i2 C# f1.学习次数达到上限
    " ~+ a  h+ E# `" y* O  Y
    % B0 ?9 Z2 |& z) }8 m' _7 q! v. K3 a2.损失值达到可容忍的范围' {4 V- J4 H1 m8 _! r& G4 V& c

    3 M, V$ _2 k5 m% V5 v5 Q( y导数
    ! E$ c. l/ N) [% q7 _" Jf(x)=1/(1+e^(-x))的导数是
    * w6 W5 F6 ^8 o9 R* Xf'(x)=f(x)*(1-f(x))
    # |2 A! p" J" j  d- l5 K源码
    # D1 k* m6 F5 N- O$ H# h9 Bimport math" M& J% Z$ V$ U* U9 ]

    & r5 [) j' u+ H+ f- D2 o#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    8 \' z. @. f3 t+ B6 v2 C#网址中图片有误,请看我博文上的图片
    $ L3 ?6 x6 \* m9 J+ x/ Z( t) c$ g, t; t. l8 g8 l1 Z$ O5 R
    #输入层
    ) R  v4 `; r: oi1=0.057 m$ N! ~) R+ l3 C5 }5 \" a( x
    i2=0.1
    ; }" b/ l( c: }9 _+ S1 v#权值参数! f3 `- x% a0 |3 S* e" I
    w1=0.15, n$ M( J# _+ G) X4 p! z/ s* ?' V
    w2=0.2
    $ M. E" y* \6 v" V" y+ l' j& l& nw3=0.25+ Q, [+ v( W1 l& R
    w4=0.3
      I' t) \2 `& E3 _w5=0.49 r2 h1 B- t( b2 g! d# d2 R2 }' n
    w6=0.45
    : i8 o& G* B0 I9 m, {8 J$ [: r4 Yw7=0.5, ^8 b# o) B: M/ d
    w8=0.55
    / y; ]7 O0 z# I) j/ K, z#输出层标记(即期望值). q' @. b$ m$ H
    o1=0.01
    2 \; Y. j/ k' j" e5 J. `8 c0 Zo2=0.995 S  \2 b' y, K
    #偏置项参数3 r8 N+ L; J' H0 p  n% D
    b1=0.35+ t7 N& v. h3 {- t
    b2=0.6
    3 ?4 B9 g. _4 c7 V) m/ h' _; s/ L4 g# M; }& `7 |4 \; d9 R
    #学习率0 i9 ~, s9 a! Q9 ]! m1 b& Z
    lr=0.5
    6 {& O- \' q! h  Q#学习周期
    % R+ E4 \, }1 {+ R3 B1 m0 Blt=00 H: J# ?  e/ `6 W. M" r9 B- Q, e
    max_lt=10000
    ' E* _) T" s- o+ K* [: r# F#允许误差6 b- Y( U5 q+ z4 \& J
    eo_allow=1e-5- N# K- K- ?; K8 X2 `8 J

    " a. U$ o( m% t" Z3 Y#线性转换3 k2 W8 n- |  c. _# T2 Z: j
    def linear(w_one,w_two,i_one,i_two,b):
    - a. R. h( B1 [- g    return w_one*i_one+w_two*i_two+b
    # c* M" ]9 P% v#非线性转换
    0 `! Q: _& `. o( pdef none_linear(i):: y* H8 _  T- g" H7 z1 ]
        return 1.0/(1+math.exp(-i))
    ( i$ j4 r; ~9 N% n; f
    ) e; t$ n3 v; vprint("训练开始")
    - l& K; N/ v" }) a# X, T. V# d7 M2 u#学习周期结束前一直学习% q" i4 Z9 y( c5 [
    while lt<max_lt:7 E, G# L! `0 P$ d2 n! }8 X5 m7 N
        lt+=1" C. Y% W* v7 x- P1 W) I
        #求h1和h2输入值: j. B3 x1 q) d! t. a
        hi1=linear(w1,w2,i1,i2,b1)3 A# }- d0 U" g- n- P
        hi2=linear(w3,w4,i1,i2,b1)" K3 r( X( H1 A* A" ^/ C
        #求h1和h2输出值' Z+ j% H9 R& @1 c0 T
        ho1=none_linear(hi1)4 y- b( j6 ~" x# o% X. R+ e6 b* r
        ho2=none_linear(hi2)
    / p& i  ^% a2 H! L" ~) x    #求o1和o2输入值( _7 Y4 G0 S9 ^% S5 ?9 P' f' K( h
        oi1=linear(w5,w6,ho1,ho2,b2)
    4 p, z3 l) L& h0 F* Z, R: a    oi2=linear(w7,w8,ho1,ho2,b2)
    4 U6 F) c" \/ P+ H6 @$ N    #求o1和o2输出值. a9 v" B8 x0 m* ^
        oo1=none_linear(oi1)
    + s7 ?  ^. n7 y( `. |' M    oo2=none_linear(oi2)
    . F- q/ d% M0 [; t; @
    + O0 [3 g' Z/ a8 C+ m. }  @    #求当前计算总误差
    ' X, v. u$ K4 e' B" b, a    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    " C+ v% R$ j$ @3 \+ f, |9 c1 b    print(f"第{lt}次训练,当前计算总误差={eo}")5 @5 J8 p# b+ ^
        #误差已经在允许范围,退出训练/ F; H6 ^- N* q: c/ z8 b- M
        if eo<eo_allow:
    ; v' u1 h- u7 B* M& U- E( o& T        print("误差已经在允许范围,训练结束\n")
    9 n9 D( y& ?) N- l* ]        break
    1 O# c5 ?5 C$ v    #偏导
    / B( |' r' C% `8 b; r1 {    d_eo_oo1=oo1-o1
    ' }5 J. {; ^: }. E    d_eo_oo2=oo2-o2  w2 o! e( y) N+ C+ B( Z5 H
        d_oo1_oi1=oo1*(1-oo1)( i" e" i' U  N
        d_oo2_oi2=oo2*(1-oo2), B$ `2 q% {% i& `+ N
        d_eo_oi1=d_eo_oo1*d_oo1_oi1& c- m* N5 z2 \5 C1 P
        d_eo_oi2=d_eo_oo2*d_oo2_oi2/ @" ?. b, j. u4 Y4 b
        #求w5_new
    , i3 H3 @( D- B" I% r; Y7 h    d_oi1_w5=ho1
    6 C9 A0 a# }9 U6 m    d_eo_w5=d_eo_oi1*d_oi1_w5
    6 }6 B' o5 Y  A    w5_new=w5-lr*d_eo_w5
    / s" L8 V0 A; a9 m# {    #求w6_new( e" _$ |& o$ `, o
        d_oi1_w6=ho2! p. m" Y+ K0 |% D! A' \
        d_eo_w6=d_eo_oi1*d_oi1_w6
      c4 ^2 y+ z' I  Q9 y& x    w6_new=w6-lr*d_eo_w6+ `' W2 z9 `0 ~9 j7 T0 ~
        #求w7_new/ K( ]) D1 y; e, u; o' M9 A
        d_oi2_w7=ho1: n+ G$ Z: i6 B! P
        d_eo_w7=d_eo_oi2*d_oi2_w7
    0 P7 V  Y3 R" J# U9 e    w7_new=w7-lr*d_eo_w7+ j- q# D9 q6 S  r' Z' u$ Z4 U
        #求w8_new( c/ y( ^5 M: C
        d_oi2_w8=ho2
    3 @: [2 h8 w* P+ e7 v    d_eo_w8=d_eo_oi2*d_oi2_w8
    8 u/ \4 T; g6 G4 Z1 G1 o    w8_new=w8-lr*d_eo_w8
      H; r! j- ~* e( _    #求b2_new' v0 ^- r/ o5 H, h. V7 q. U. z
        d_oi1_b2=1) |, z9 a* Q% A( @' d
        d_oi2_b2=1/ |" c& K& |9 n5 q( i6 @
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2! Y4 x2 v; [7 [5 e
        b2_new=b2-lr*d_eo_b2
    5 y2 U* d, H8 ]3 j" {. Z; ~  p    d_oi1_ho1=w5( P9 x* |- i# u
        d_oi1_ho2=w6
    5 W  K& w( _* P; ]1 R    d_oi2_ho1=w7- ]+ Z2 E1 G& b6 c" c+ ~" H
        d_oi2_ho2=w8
    . R8 {+ x0 \. k3 X5 B* T$ I0 O    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    $ j: g: m; x, i% e    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2+ o7 {/ R& v( i- X
        d_ho1_hi1=ho1*(1-ho1)5 U& I! Y9 I& O2 F: j0 R
        d_ho2_hi2=ho2*(1-ho2)  n/ m; v8 p" Z8 P
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    " h. H$ k! ^9 v9 T6 p9 A1 u+ [    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    0 O: B. H- x! ~0 T# S, `" M7 Z    #求w1_new
    # Z7 [$ S6 }, U: \" p* [    d_hi1_w1=i1
    6 k9 g8 K  v( j9 d/ `' s& n    d_eo_w1=d_eo_hi1*d_hi1_w1
    # [- n) l. }  X# n/ [3 H9 g    w1_new=w1-lr*d_eo_w1
    $ H+ D* J. E& W$ g    #求w2_new
    5 B9 g6 b4 n* u* L7 [) T5 T* v1 L    d_hi1_w2=i2
    % N' K) N+ b* c& R$ U. {" Q    d_eo_w2=d_eo_hi1*d_hi1_w2
    2 h3 p; C  @5 t* D1 |    w2_new=w2-lr*d_eo_w2
    , d6 v1 s; U8 n) ]    #求w3_new
    - f9 N( v& K6 w3 D    d_hi2_w3=i1
    % o5 J1 u4 W) A2 Q    d_eo_w3=d_eo_hi2*d_hi2_w31 y: k3 [4 K; y2 L8 @- d
        w3_new=w3-lr*d_eo_w3( b$ Q- X$ Q5 T7 h* ~
        #求w4_new
    & v8 _" a  |# w$ c' \$ j' ?4 `    d_hi2_w4=i2% ^- L* t! J) s- a# u& L4 O
        d_eo_w4=d_eo_hi2*d_hi2_w4
    ; U1 R; ?( u4 I9 M# h* `/ p" D/ m    w4_new=w4-lr*d_eo_w4
    $ d5 U: ^  V4 b    #求b1_new
    , t  d( C# \+ f, R4 t* o    d_hi1_b1=15 ?6 P& {/ _2 F+ a* G7 p% ?
        d_hi2_b1=1* e! [4 l9 a3 N6 G& U3 u: S, S
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    6 D; r% D- c6 }1 ?2 E    b1_new=b1-lr*d_eo_b14 r) g8 ^: F* ?; C
        #更新反向传播
    2 f9 a/ e- @( n% W% r1 s    w1=w1_new" A8 ?; F$ q. G% v9 n* n
        w2=w2_new; d4 ]& Y5 D7 Z  o! z: w6 N
        w3=w3_new
    + b4 ?3 h2 c+ `) i9 a! }; B5 [' ]    w4=w4_new
    5 }- O4 f, T# C# o5 v$ c    b1=b1_new5 c8 W. t  h5 z8 s9 s+ ]
        w5=w5_new
    5 U2 A9 ?. F9 x& p    w6=w6_new8 K3 L+ Y" h( Y3 G* m
        w7=w7_new) m4 s* |2 q$ D6 p/ T* e
        w8=w8_new
    1 y) D1 `9 d2 j$ p9 n; j5 }    b2=b2_new; c+ g' Q4 P$ K2 L1 G( v5 o
    print(f"当前计算总误差={eo}")7 \7 L9 y. `/ y$ o6 K; B# Y7 l
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    2 W2 b* v" ]5 J+ Cprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    " o# ~& d  U3 [' xprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]"), j& h7 ]9 Q8 @- C6 f
    4 _* |7 [" l+ C( R
    结果
    : d: @9 J+ l) D" z8 y. L" n- `
    ; N( u8 ^. G  w' h' g! j. g, j& P# S# s$ q- j! n' h
    结语
    * X& H5 L4 K- Y' L可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    ) }' y0 f+ _3 f3 Y  m5 N
    : ^& P7 |+ x7 C: ^  n+ ^补充
    1 e! \) K0 }% H2 [/ U" U程序中d_{a}_{b}格式的变量表示a对b偏导
    " y, J# _6 l' ]+ \————————————————, e6 f$ q* {: L( u# Z7 F4 t; n
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 C8 S9 j3 c# G5 o8 g原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    , _% j3 I# [1 O. T; }' |/ `8 C5 L
    4 e) p% L) g/ \, T# I
    ) V/ V1 J1 z2 W$ b! x2 e( L
    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-9-13 21:04 , Processed in 0.298318 second(s), 51 queries .

    回顶部