QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2465|回复: 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实现)
    ! h0 i% _) y7 _& F8 V
    ) ^. q- H  H! i5 }# b3 Y背景
    * h" ^, W. _/ H$ |+ `2 p  A0 ^初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下4 C4 ^+ X# I  A1 v

    & ?7 p6 `6 ^: P* k2 N: X" K【神经网络分类算法原理详解】
    # @. s5 T& A$ {/ n/ U# ^
    ( n( X4 ^: n8 W% m  r% y注意. x. T" d/ f7 w* O* g* m. ?0 y% d+ F% c
    站长提供的图片有点小问题,我们更正如下
    % {7 B2 s: u$ ?0 U
    ; M! e) @, [. U: g2 N2 S  N0 y) M5 J: J

    - S/ x0 D  I, m4 E) L( [问题
    1 c8 b6 {$ I( [. @+ S4 d( i( W根据上图所示,我们有已知
    % {8 V9 _2 s0 ?: [' Q8 z( f3 f# D+ I8 M
    #输入层& I" x& |% I/ Z" [8 f' L
    i1=0.05/ b, e+ @% I8 X6 P4 k2 e; d
    i2=0.14 s# `1 z/ s, G1 u8 |- B
    0 F" O; V4 r' ?" G- N% o
    #输出层
    + w7 u  F% S4 X: }o1=0.01- @: t1 J' \+ _! q/ B( i) C
    o2=0.99
    # T' [" w4 S2 Y这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的5 i! K+ P$ r* K$ Y& e4 B- b
    9 R- ^: X5 g: X5 {! J3 P
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1; `- s% @5 Q4 G$ v$ x0 L9 X5 A

    0 `+ C* O0 ?) N8 }. k1 s3 ~" @* j/ ]神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    $ d" i+ u9 x9 k: t2 U7 h: ]: _5 h% X' p7 g& ]5 x
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    5 W8 e! r9 c- D  W. }3 |& V3 p1 X
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    8 f" s$ G. h" H8 j
    0 B9 F- q* I1 M2 O* O% w# }9 Q, X5 ~2 a同理
    8 E5 R: A, ~" H' G4 y, J' C3 F6 k, [
    % z2 [& X3 G, C4 E  I& ^, W神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))0 w: n7 w& a) q
    / j- o3 a5 {* O3 M( w8 u
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式% c0 a9 X* w2 c9 i) n
    : k' o2 x& ?9 s
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2! \. ]; p$ Z1 x

    5 b) v0 l0 I8 \9 F神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2! k) r2 |% V" E. I+ |  K
    5 U7 h# [+ K& F% \
    再经过非线性变换Sigmoid函数得到
    ( T7 R' w( L/ z; F: Y7 e1 z2 }/ e% t
    * b1 e4 H# o: x" I! h( H8 W+ B2 U' O: q神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))) A8 E3 `5 o3 t
    1 `: P9 g3 X( O1 s4 o/ _
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))4 A2 Q3 n* p% A' Y- X, i

    7 Y* v8 n% \/ Y) X3 E我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    3 j8 b( Y# H2 T7 V+ L9 e* b$ ^+ V$ x* e6 q$ I* K0 ^: n3 _- g
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2! C5 S' y' E7 j6 W
    % l3 H+ A( }6 O, a7 Y
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    $ |7 j6 N6 g4 W5 }! O% w
    : p1 x2 u  G+ K* k1 g. I. U学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    # D. u4 m& z, a# C$ l( j7 J- I' x$ m( @  E% u
    学习率 (learning_rate 简写为 lr)我们设定为0.51 x6 ?; a, u$ p& R1 q. x8 x
    - d% X  e8 @; ~8 b0 O
    依次求解代求参数. l6 \* X  v! h3 ]' b# m- a
    ) d9 K: p( v8 I/ d5 @8 m) u
    w1~w8,以及b1,b2
    8 h: h, W7 b1 y: R) n* e  t9 z8 ~& ^8 M* e
    + h& m& f! h$ b6 ?4 ^
    ( |* l' T# \9 K# w0 G
    损失值 (eo) 的偏导数2 C2 y& E4 o; X
    ! R$ M" Z7 T" `5 Z5 E  _
    再更新该参数,更新公式为5 X8 v$ N, w, a. @) X3 h4 \

    9 |) h# Y8 S+ Y- g. W6 R& n' r) q参数_new=参数-学习率*偏导(eo,参数); @9 x7 H9 N. ]  \3 @$ B  ^  _: z: b
    随后进入下一轮学习' g, e/ g9 u  z1 a( S4 N. _

    2 G& A6 @4 `" b) [6 |4 y终止条件(满足其中一个即可停止训练)
    ' J% f' L2 ]: f" }& i7 J8 }
    " _3 Y( m0 v. \8 s" Y1.学习次数达到上限
    # ]- z: C% \# P
    - S& y: d/ R$ I7 r0 P2.损失值达到可容忍的范围
    ) P& j. I: Z" F; W: L* \( w/ |5 M9 {4 B( k1 T3 T7 T; Z
    导数* r# Z6 j7 ]9 l0 V( Y4 \
    f(x)=1/(1+e^(-x))的导数是
    ' [% q  Z8 V9 L) d$ _0 Cf'(x)=f(x)*(1-f(x))7 v# x4 c/ p/ U7 d
    源码; E5 g. s' P* u* R! j, z& q* K: Y
    import math
    7 L- ^9 r; Q( e2 U# Q, U
    $ b% F5 i7 e, i#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    8 x, n/ d0 g: J; l9 y0 F#网址中图片有误,请看我博文上的图片
    ) [2 v- G  f: s# v9 R/ V, K' K8 {& v) @+ v1 h2 d# v
    #输入层
    * H# O2 ^5 w7 E; V8 @9 bi1=0.05
    6 z7 |" D  d. l0 u$ ci2=0.1/ W' t4 s0 x7 L; h, }
    #权值参数
    0 K  T. M! \9 X4 ~/ Ww1=0.15
    % i$ z& p" J! }- T9 C( Y, ?w2=0.2
    ' L2 j" }2 q" ~0 R: j. |6 aw3=0.25
    8 P) K) V" l0 \; z: Cw4=0.3
    ) z6 K4 o" z; C7 h) Zw5=0.40 U7 c2 O, Q/ V5 p8 K1 h
    w6=0.45$ f8 {  f1 S- u9 }3 D
    w7=0.5" |0 l7 U4 ~( C4 I, b
    w8=0.55
    ' y$ {' W' ~- f! i" y0 y) O#输出层标记(即期望值)
    ; X6 n- r8 `6 {$ Y% {; _+ bo1=0.01% ^: }" J( M' ]2 x/ P4 q/ \
    o2=0.994 Y" Z0 t: ^: i$ n( v6 O  N) D
    #偏置项参数% ~2 ]) j0 v. }
    b1=0.35
    2 |9 u* Y9 H; w' f: o  _* G7 Z" j: V! [1 `! ib2=0.6( E* g( J2 K- K" ^. f2 \
    9 o# S2 m1 ^1 `6 p; B" h
    #学习率
    7 f! T) a5 N$ x% E/ Ylr=0.5
    * Y  R  c7 u2 x2 [#学习周期' ]( ]# I% ?3 V6 f( K8 ~
    lt=0$ Q1 X) {4 p, e$ {0 m& i
    max_lt=10000
    8 y7 h* ^1 ]9 \0 y7 Y#允许误差* k7 ~8 r! {% y
    eo_allow=1e-58 b. I; v5 G' i7 \. m/ h! b2 I
    . J6 q. e1 X" _, ]; R& v
    #线性转换0 R( n/ n, |3 Q( I# ]( k, p+ G
    def linear(w_one,w_two,i_one,i_two,b):& T. Z# ~( b4 O# Y
        return w_one*i_one+w_two*i_two+b3 K. B' E* L% e
    #非线性转换
    ( Z& P$ e, [$ Q# j% m7 n) Z9 Pdef none_linear(i):
    " F9 Z+ `& q! `4 v3 B9 u) W# W    return 1.0/(1+math.exp(-i))
    " s) k2 S" X* a! @
    8 G) r1 }* m! [' W1 P5 @/ aprint("训练开始")- ]& w1 a  ^  D6 I8 e4 K+ e% V
    #学习周期结束前一直学习- a1 }1 r6 [7 ?: b
    while lt<max_lt:% l3 `2 z# E3 U; n; B
        lt+=1
    ) H& n& U/ C/ h    #求h1和h2输入值3 D3 Q; l. o+ o5 C5 E  S
        hi1=linear(w1,w2,i1,i2,b1)
    , |6 A) x8 [# o6 x+ T    hi2=linear(w3,w4,i1,i2,b1)
    5 j& X# _2 [; ?    #求h1和h2输出值
    7 Y* G1 \3 v2 e3 r# G    ho1=none_linear(hi1)5 ]+ S! p6 W3 S( I$ `! @5 q
        ho2=none_linear(hi2)! N" k& y) B# t& l
        #求o1和o2输入值; V3 Z* _! [6 k( a
        oi1=linear(w5,w6,ho1,ho2,b2)" A+ l; i6 B; ~" H) C# c) F
        oi2=linear(w7,w8,ho1,ho2,b2)+ o9 j, z9 w3 X9 _4 p2 y4 ^
        #求o1和o2输出值
    6 }' j1 B$ h* F) i' ]- f    oo1=none_linear(oi1)
    7 |3 f- q6 z, k6 q( ?5 D2 P, d    oo2=none_linear(oi2)& P8 g8 @4 M* W8 h) w
    3 c  K7 v$ u0 [5 U# \- Y/ s
        #求当前计算总误差9 v; `- k7 U" x5 \  U, _
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/20 ]- \) S1 X4 y! u$ k$ x7 a! a) d9 L
        print(f"第{lt}次训练,当前计算总误差={eo}")% |' d; x2 ?3 Q( r
        #误差已经在允许范围,退出训练5 {7 Y7 `3 y6 _, w1 K
        if eo<eo_allow:$ `8 Z$ r4 l: y# @4 G( Z2 J
            print("误差已经在允许范围,训练结束\n")+ K4 N, d+ D- w
            break* X2 q& e) C2 j
        #偏导
    ' e: {$ y6 T5 v( v1 ~) [    d_eo_oo1=oo1-o1+ j! Z4 K% L5 }6 S! _
        d_eo_oo2=oo2-o28 z6 l6 A1 g9 M- [/ u
        d_oo1_oi1=oo1*(1-oo1)
    . c5 W: g8 ^! u    d_oo2_oi2=oo2*(1-oo2)
    * N- Q( s/ M( C$ w+ J: @# L0 g    d_eo_oi1=d_eo_oo1*d_oo1_oi1
    6 O: g/ ~, C: f( ?  a" a* H    d_eo_oi2=d_eo_oo2*d_oo2_oi24 c* S# Z: E- K6 r: B9 X0 |  [
        #求w5_new* G& `8 `* _; K! `% o# M
        d_oi1_w5=ho1
    ; g- B/ v9 L. g8 }    d_eo_w5=d_eo_oi1*d_oi1_w56 E4 l; A: Z1 ~
        w5_new=w5-lr*d_eo_w52 `; Q" v% s4 b7 t) _+ q
        #求w6_new
    ) r8 K1 [, C; \9 Q3 ]8 x& B    d_oi1_w6=ho2/ G# i9 l* g. ^& T' U
        d_eo_w6=d_eo_oi1*d_oi1_w6
    , C1 \& T6 C5 \& p  e3 v5 T% E) Z4 D    w6_new=w6-lr*d_eo_w6
    9 C5 K0 Y3 F' G4 c% H3 H    #求w7_new0 f2 a& C9 r2 V. D0 i- W
        d_oi2_w7=ho1
    9 `: o: u0 L/ e( W# K    d_eo_w7=d_eo_oi2*d_oi2_w7
    + ?3 S' F% g7 B    w7_new=w7-lr*d_eo_w7
    0 b* T) P& m' j: d" ~0 a+ J+ k    #求w8_new- V6 a1 e, v6 p; x( U2 F' r$ Z
        d_oi2_w8=ho2
    2 t4 o( G" w; x& I' _$ r) W$ e    d_eo_w8=d_eo_oi2*d_oi2_w8
    & x# O" b5 |; ~) q* ?    w8_new=w8-lr*d_eo_w8
    1 p) K3 K2 D2 F0 G, _6 e    #求b2_new
    8 @5 N8 R5 m& V. A9 u" v    d_oi1_b2=1
      \9 O/ z: G& G! |; v$ A    d_oi2_b2=1* ]3 P5 z/ I" h- p; i( ~
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    5 I1 N# O2 }: H4 u: F    b2_new=b2-lr*d_eo_b2: y: F# X! w# |+ q
        d_oi1_ho1=w5( L6 l$ A; ]' I1 k
        d_oi1_ho2=w6
    & y, B( H: C7 V* h: i9 u4 B& y    d_oi2_ho1=w7
    * S# j8 }4 u5 U) l    d_oi2_ho2=w8) ?7 c  ~! }, H2 J! X" Y
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    # Y0 f9 Q6 k" i* M( f% m6 Y8 K, @    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2" I% M0 z4 L, J6 ^  b
        d_ho1_hi1=ho1*(1-ho1)
    7 c9 c& e; Q1 J, S+ D6 b    d_ho2_hi2=ho2*(1-ho2)
    . ?. y' |7 e% K; h# G$ [    d_eo_hi1=d_eo_ho1*d_ho1_hi1- D+ U( s+ s2 T7 A# w* q0 j
        d_eo_hi2=d_eo_ho2*d_ho2_hi28 p3 n3 F) z5 Z' h
        #求w1_new0 z: \0 k# a2 b; _  o5 Y- ?' d
        d_hi1_w1=i1
    0 A8 ?8 \" D3 l" b  A    d_eo_w1=d_eo_hi1*d_hi1_w1* f( d1 r) l8 h) e) S
        w1_new=w1-lr*d_eo_w1
    * T! ~  d; u+ U    #求w2_new& p# G' C" s8 I9 [/ P. ?, z3 I% @
        d_hi1_w2=i2, `1 l3 e9 {8 w, C2 W9 g1 ^
        d_eo_w2=d_eo_hi1*d_hi1_w2
    1 v( z" h0 r3 O8 F8 [    w2_new=w2-lr*d_eo_w2
    * S8 a( ?  t; A    #求w3_new5 W% y1 z$ ^) ]
        d_hi2_w3=i1* I1 }8 Z; G/ o0 S' r
        d_eo_w3=d_eo_hi2*d_hi2_w33 V3 g9 ~* |' J  i: B
        w3_new=w3-lr*d_eo_w3
    1 \% X1 h. R5 @. }    #求w4_new. D* ~, J% `3 T# M
        d_hi2_w4=i2
    ; o3 l$ \) K$ {& c: Q5 [- B    d_eo_w4=d_eo_hi2*d_hi2_w4
    ; x) W" `4 E! o+ T' Y3 j5 z    w4_new=w4-lr*d_eo_w4
    ' y; J) {& T7 n' v" t    #求b1_new
    ! Z; e" H& n4 w$ H    d_hi1_b1=1! j6 `+ w, B* c+ g6 p
        d_hi2_b1=1$ |$ H# f! b+ |& q8 e4 Q$ J
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1! B( ?, t- l6 m! \5 S
        b1_new=b1-lr*d_eo_b1$ A2 L3 R; f( p9 t# y
        #更新反向传播. U- t, `2 W3 ^. J
        w1=w1_new- k$ n5 I' y3 P
        w2=w2_new
    / L8 R3 T  R' \3 v4 t% _2 ^    w3=w3_new5 Q7 y& L0 ^: H7 S* T. z4 d. R) h
        w4=w4_new
      p7 ~! E3 I9 |, [+ r    b1=b1_new
    3 v  S" _; h& ?/ n* d$ r# |2 H    w5=w5_new
    0 z6 J4 D1 x& _6 g" J0 s: K, m  r9 R" C+ ^    w6=w6_new+ r( S4 P& Y% n% T0 E4 z7 y; b
        w7=w7_new
    2 C. F: m3 ?# r6 d; p    w8=w8_new: ]. w: [$ q( a# D
        b2=b2_new
    4 b9 Z+ Z" m7 V" X7 _# Bprint(f"当前计算总误差={eo}")
    . o/ X  q: d: c$ c' H# x& zprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")+ [0 P, S! ?* ?* p+ s& k( r
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    / T& X' R8 W. Q& L2 @print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")% Y4 C5 `* s9 R  k0 t; d/ v

      ^2 S% q4 E! ^4 ]结果
    ! M3 i+ Y8 E% d  M5 E& J% o: a; [* x4 d" d, Q5 r$ W
    & p& V  k$ K3 A2 [, a7 w! n
    结语1 O% w% y7 `8 O( t) w8 l- @
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。9 @$ B2 k0 J3 v' V, Q0 T

    ) \. @) X9 T. q补充9 |% R  _" t8 t% D7 d0 n) u+ G4 @! {
    程序中d_{a}_{b}格式的变量表示a对b偏导* D; t3 L6 a4 n  ^- y. W. C
    ————————————————- V* ~& q3 D2 \, O
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ |6 M5 F, W$ b% Z  s+ a5 l  Q原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679546 K& Y' {1 H: K8 }
    : i% s% o0 Z% L" U6 X6 ?6 d/ s

    , p# B* D+ A6 A& {/ B6 E4 B
    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, 2025-8-19 09:39 , Processed in 0.419747 second(s), 50 queries .

    回顶部