QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3036|回复: 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实现)
    0 U0 N0 u! x: z  D7 J! N! b! o+ n( H
    背景" m) R- q* _6 v9 {
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
    & x  N2 z8 _5 z/ J# P
    # S: }  D$ D+ c8 {3 E! m/ T【神经网络分类算法原理详解】# q" p  ]( l3 F

    ' q" Y0 i2 Y$ ]2 b注意3 s# R/ \6 |1 T% X8 I# [: {9 ~
    站长提供的图片有点小问题,我们更正如下. n! U5 @" k, C- h5 {9 ]

    . x( }4 s0 s5 b( O, ]' G. ~* @' o/ f& Q4 D( C6 _2 J, Y

    ) n8 Z% @% H  s0 f8 u2 E0 J! }+ g) M问题+ Y: }, V6 Z$ U% Q7 D) b' V/ d( \
    根据上图所示,我们有已知4 q3 |% E- n9 Z2 f; `

    # f$ o9 ?! w4 e' F#输入层
    # x$ O6 d3 L( W+ y) Z; c3 V8 `" Fi1=0.057 G  N& T/ ?7 y  b
    i2=0.1
    % e% o5 _3 W7 G' m  ^+ c9 C5 M# y" N7 P; p- z
    #输出层: I4 Z  D. H3 E1 H: e: |
    o1=0.01
    , w% O* O/ Y+ V% p1 v# L) qo2=0.992 A! h" O6 q8 t+ N6 i0 g# \
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    : B. ]1 K& J' M" _
    , G2 E! p' R9 d6 I) Z, S7 N: S/ L神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1: z+ t0 M) E$ Z* Q3 z# x+ O/ U6 b
    7 }& f  f, n6 x2 k1 Y" v
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    . _# `4 |: g, [2 ?8 X7 Q; d8 L( G  q
    # E3 K* \- \+ Y. I2 r6 q% ]神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出/ L: ?% n& x" p% n# v
    ! ^# \7 }1 K+ f" b# c$ O8 ]
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))9 z8 Q, j; d0 M( ]
    0 b$ U( ]( X0 }" U# f
    同理
    5 k& C+ _4 E9 M- x. ?+ B' G* P$ r- H/ H% T, }
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)); v; E$ z: A, H3 W3 \+ E4 C6 L6 M

    # @2 P% `* f- |  V. c/ k" F接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    % @, T. c- a; d4 g8 X2 \/ b$ @, q; E) T
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2/ U* k. @% k5 y  j9 B3 R
    + g2 z2 p) @9 G  [4 C" k8 q' G
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    % h; i! ?% D. w3 a! _1 k5 q/ `; _' p& L6 {& P
    再经过非线性变换Sigmoid函数得到6 u# O# b; ?3 j! k
      R5 P+ L) J. b$ n8 `8 q8 F- t9 D
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))& k/ {9 F8 R) i' [2 r
    + a8 P4 [& u' b( u0 C- h8 p
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))% G) S- W7 t. K  W1 U  p

    + w" f9 }& s' W' ?, v我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为* X* b/ j+ E* K$ S

    4 p( O& z7 T4 a9 N3 S# U损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    $ ?* }2 `& x) v1 i9 H, q- c8 Z( P- N# E: ~6 _# `6 k
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足, P2 M3 ?# w( v# {) z, z- W* ?; ^2 i* ?
      E* C  \+ q5 ]8 e6 V+ ^. |
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    % F* [, {3 s; r: X1 V1 @
    ! `2 v' L! o) z8 ]2 \0 e7 v学习率 (learning_rate 简写为 lr)我们设定为0.52 |0 A% `% P5 Z/ \9 o* @, \
    , z+ k. F% @2 P$ f
    依次求解代求参数
    ( b- D) ^/ i5 _! a4 x
    - q5 l4 d8 F4 W/ S$ Q- h; Z* Kw1~w8,以及b1,b2
    6 t, Z5 t5 E1 x
    . V3 l" [, n. Q" d( Q( g
      [6 E/ J) u; O. {% z( U! p1 y0 @) T! T/ M( [
    损失值 (eo) 的偏导数
    , R9 t) A1 q0 k3 h( n" n/ ^8 b9 U3 Y( Z' s, k
    再更新该参数,更新公式为4 h- ?( f! y+ n0 I
    : D% y; w1 U0 R. ]6 G0 m( c
    参数_new=参数-学习率*偏导(eo,参数)
    3 t: q8 j' y$ T' D( E1 o. [: N随后进入下一轮学习
    + J& d) ^  Q3 |  e  _* ], w5 G5 T' ~0 U
    终止条件(满足其中一个即可停止训练). R" T7 q7 c. j2 k
    % N* C: {* J2 h" D  m- A4 U
    1.学习次数达到上限
    # ^# |, U* }3 C) }4 {* v( ~# W# m
    , O/ I* t9 T2 J* X3 O2.损失值达到可容忍的范围
    # h; t. p+ V( z5 F2 l' H" a+ r5 \
    ; X: [0 a. x8 h" k) B导数
      k2 x. ~& `( x* M1 |" Wf(x)=1/(1+e^(-x))的导数是, |5 U& g+ Q" z8 X; l+ ?. n! ^
    f'(x)=f(x)*(1-f(x))
    6 a1 [- W$ i( C1 K4 i% x. W8 r源码$ F- t; V) r. h* u4 L
    import math9 {# g# w2 x* H

    / O3 C6 c9 z, y2 e; K& @#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    2 y5 a$ L) W6 |8 }6 z& j3 b( `#网址中图片有误,请看我博文上的图片  B, n( g6 q: P3 d7 {+ W
    # q: y5 o5 Q, A- H& n, E5 l' }
    #输入层
    0 \  {4 H& w$ r* n$ S  Ni1=0.05* s- N! `& w+ U: P
    i2=0.1
    7 [- K* a' T* b0 [8 _# k+ [#权值参数2 h! u, U4 R  P; O! [
    w1=0.15
    ; P1 Q+ D" v5 p6 Pw2=0.2
    * V* U, B2 M0 s! o* I+ d9 T, mw3=0.25
    & n. z5 ?! K$ g. [/ S. M& S1 `: s: gw4=0.3: x8 l, n( e" S& t. |3 X; p9 c
    w5=0.4- N4 i  ]# M' }
    w6=0.45+ a. q5 T+ ^+ h/ \3 D
    w7=0.5
    ; j" ~  y  J1 c  Aw8=0.55
    * W" b: N7 u& b) s6 v2 E7 q#输出层标记(即期望值): G" Y) k/ v- ^
    o1=0.01
    1 H0 I" o5 F+ z- z, J8 ~0 wo2=0.99
    8 p. e; u7 Z/ @4 }! \8 L#偏置项参数
    0 J& P/ ]: D# f8 ~' C! l/ {b1=0.35
    7 I( v0 v6 z; R2 o. ab2=0.6
    ( X# R$ `9 T8 a7 a5 A& e/ S' r  o. z2 D- l' d
    #学习率+ U- ~) i) ]. o2 Y1 @# G
    lr=0.5
    : k& p% j" l+ {) v4 u. ]1 ~#学习周期2 s: _2 y- D3 w, c; e
    lt=0( Z4 b1 }9 U# z+ D( d
    max_lt=10000) J7 r8 }, N4 \4 R7 }2 j
    #允许误差$ M7 x# ~2 L/ O0 w# U9 \
    eo_allow=1e-5
    2 c! C% h) |6 \& o/ g. S& W3 x9 S
    #线性转换
    * s. C% ]6 Y' \  u2 o. H" _9 Kdef linear(w_one,w_two,i_one,i_two,b):
    4 Y8 d- w  N. u/ l; B( i    return w_one*i_one+w_two*i_two+b
    1 r% s& r5 s! u2 u" Y/ Q" C#非线性转换* b# H) i8 e" F, Z
    def none_linear(i):4 ^% G& m( r7 ]/ h
        return 1.0/(1+math.exp(-i))& B; H4 V: W  P/ h2 u" j

    : ^, ?3 T8 X; z  M+ xprint("训练开始")
    7 E) L6 H2 ]4 H8 H: L#学习周期结束前一直学习
    8 n5 l6 T4 V, L5 s/ I3 I# pwhile lt<max_lt:
    ( @2 n4 r7 F7 F* o  H    lt+=1( x+ Q' v7 a1 L' |* \9 p
        #求h1和h2输入值
    " S5 O% V6 r( C/ A7 o' @3 C( ?    hi1=linear(w1,w2,i1,i2,b1)8 d& l7 Z$ Z; V$ u2 E6 o" f' c9 T
        hi2=linear(w3,w4,i1,i2,b1)2 ?" j: s" E8 o! k& Q
        #求h1和h2输出值" Q( a& ^3 |0 v
        ho1=none_linear(hi1)
    , d. ]& q2 v! ~! h    ho2=none_linear(hi2)$ {( Q8 A$ o( o. h' L3 m. q
        #求o1和o2输入值! Z5 U# y8 m4 h+ N8 ~; N
        oi1=linear(w5,w6,ho1,ho2,b2)
    2 l/ |. E  P( B8 K7 E/ F9 ~    oi2=linear(w7,w8,ho1,ho2,b2)
    ; g. F* l# Z5 x% K    #求o1和o2输出值
    * v) ~. I* p6 `1 V    oo1=none_linear(oi1)
    - b) l+ E$ {- @! \: E# e    oo2=none_linear(oi2)  G+ x) i3 @. ]2 i

    : ~4 t' {+ m; ?& r    #求当前计算总误差7 ]( V, Y6 \+ R  U7 }  m6 q
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/28 |$ G. I( b* E( r8 A5 F
        print(f"第{lt}次训练,当前计算总误差={eo}")
    4 ~$ G" a/ y, b+ x$ B; J    #误差已经在允许范围,退出训练  E  i. L7 l' t) E6 B. ]* d; J( [. S
        if eo<eo_allow:, ^# r5 U/ B# u, n% M4 R4 q4 E
            print("误差已经在允许范围,训练结束\n")- Y6 |, R* i7 b" }$ N8 R! I* T: R
            break4 ~; Z* u  i7 f+ b
        #偏导$ B$ ?( D, C# T; h3 {9 m  L% |
        d_eo_oo1=oo1-o1
      ~& E2 G; Q1 v% @    d_eo_oo2=oo2-o2$ H5 z: R% i. b
        d_oo1_oi1=oo1*(1-oo1)
    * R; U% N5 L! m% Z. X9 o    d_oo2_oi2=oo2*(1-oo2)+ j. ^% X2 ?) f! s
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    4 L" C0 ^3 f) j; V" {1 w    d_eo_oi2=d_eo_oo2*d_oo2_oi2
      p9 p) d: S" C8 A& M+ d/ |    #求w5_new: o# @; o. l, u1 D% \
        d_oi1_w5=ho1
    0 O% b5 `* e- ?9 R& t    d_eo_w5=d_eo_oi1*d_oi1_w5
    # [; t( _" j/ B/ N    w5_new=w5-lr*d_eo_w50 F, o- V3 P/ @" p' R
        #求w6_new
    5 N8 v! q# |) H! F0 P, Y( Z    d_oi1_w6=ho2
    3 @' @: `) `( }    d_eo_w6=d_eo_oi1*d_oi1_w6, W& t; V: A. r. }8 s
        w6_new=w6-lr*d_eo_w6
    % Q* s* q; S; F7 F! C) g1 @5 O    #求w7_new
    ! m/ J9 Y0 ]: }& X! X    d_oi2_w7=ho1
    , A+ f8 }2 ?4 t3 f    d_eo_w7=d_eo_oi2*d_oi2_w7% C8 \0 q  A% ~
        w7_new=w7-lr*d_eo_w7
    7 c3 B, @4 @  b" [' m    #求w8_new- G+ J% I7 G9 Z1 K
        d_oi2_w8=ho2
    + t" A& b) b- Q& p    d_eo_w8=d_eo_oi2*d_oi2_w8+ S5 i& ]$ l4 p
        w8_new=w8-lr*d_eo_w8
    $ e: e! Y3 T5 A6 S    #求b2_new
    ( s0 T; k+ e: a* b- p    d_oi1_b2=1
    6 q2 h$ [8 Y: [2 q% x; p    d_oi2_b2=1
    9 T3 m0 F( O- X# w1 m    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2) G+ K8 O; f$ C, y4 Z$ d% [0 M+ i
        b2_new=b2-lr*d_eo_b29 E( s1 w# i5 h, D- @
        d_oi1_ho1=w5
      n- P4 n" o$ F7 u    d_oi1_ho2=w69 g. r4 _6 P5 h
        d_oi2_ho1=w7; C; ]; j) [* L$ N. I8 U! [7 p
        d_oi2_ho2=w81 @& C: x* ?# [7 w5 @# l- Y, Y2 b$ z
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    9 A( _0 q" f& u3 M    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. f) k9 H# A. V
        d_ho1_hi1=ho1*(1-ho1)
    4 n  {- Z, w, w* l/ B% k    d_ho2_hi2=ho2*(1-ho2)
    9 u2 k) s, H( G/ X2 G5 a9 u1 I1 G, @    d_eo_hi1=d_eo_ho1*d_ho1_hi1& L3 q2 G% a2 }. \! y' N4 F
        d_eo_hi2=d_eo_ho2*d_ho2_hi2$ T; S9 ?  N6 J: r
        #求w1_new
    ' _# d2 H' G9 ?5 f; j& Q    d_hi1_w1=i1$ B6 r) n  T2 }' f/ A
        d_eo_w1=d_eo_hi1*d_hi1_w1
    # D5 n  c+ z9 k; A  {0 b" j    w1_new=w1-lr*d_eo_w1
    8 T6 J1 ~/ u- B3 q    #求w2_new
    & z. P( w2 h6 m; p) P0 @1 @, H$ s. }    d_hi1_w2=i23 B0 a/ r0 e1 c& [
        d_eo_w2=d_eo_hi1*d_hi1_w2) t) i9 l/ i9 E3 o) J: e
        w2_new=w2-lr*d_eo_w23 d5 [# C$ R2 w3 @7 L2 o7 i; r& s
        #求w3_new) |5 _% f% o4 Y
        d_hi2_w3=i12 ^$ n$ }7 }3 X3 y! m7 x* {
        d_eo_w3=d_eo_hi2*d_hi2_w3  ~7 e( y+ J9 e  G! y9 m' J, n, N. g* D
        w3_new=w3-lr*d_eo_w37 ?$ Q; X1 P3 f- m8 K0 a. W: p
        #求w4_new
      r& m: l# Y( e5 o. d$ @' q* k    d_hi2_w4=i2
    8 R  s2 g0 i* z! Z- F1 [9 D# A    d_eo_w4=d_eo_hi2*d_hi2_w4
    + e+ _+ D) ~+ Y4 `# u$ d- [    w4_new=w4-lr*d_eo_w4
    : B) k) H: p5 ^/ C% D( t    #求b1_new
    + J9 b; x; b; x& `    d_hi1_b1=1
    " q) S8 u/ @- J+ {0 D    d_hi2_b1=1
    # E* X0 A/ h* ~; l  W3 v: M    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% Y" s! s; c/ K7 E
        b1_new=b1-lr*d_eo_b1
    1 g4 {3 w3 r! q' ~0 j& H    #更新反向传播+ C4 P0 O" ]9 Q3 l6 C9 P
        w1=w1_new8 i" x$ @6 I) j4 V
        w2=w2_new/ y) v8 J5 x# H0 `! C0 _
        w3=w3_new9 C- Y; R, W& M, c$ l" R4 \& k" F
        w4=w4_new) ]! h. X" y1 C" [- Z9 K
        b1=b1_new1 }% x: R: F. r5 e$ ]8 k
        w5=w5_new
    $ F( Z# D. t8 F  u: s; d    w6=w6_new
    , S( O) g8 C& b9 M. q    w7=w7_new
    & T8 H: R3 @, R8 ^    w8=w8_new
    ; m+ ^0 H+ }, X6 P- u    b2=b2_new
    + E2 s% f; p9 d2 k9 v6 `$ A! U( hprint(f"当前计算总误差={eo}")
    , k7 T: f& C, e, w1 A  Tprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    . @. I6 x6 o6 @/ o  j! [# qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")' |  d4 L9 K' ]1 _4 v
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    0 C9 }5 B. T% J7 ?7 ?& b% U0 h
    8 @1 A: l4 ?8 |0 }! [结果
    2 A" w2 u4 g, N# I7 ~% D0 N) u# h4 h, z! Y- Z& h

    ) {  D% W& B6 W0 M结语! R3 u! P9 C7 Y* f9 ]
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 i1 s: N2 h( c0 @) [
    % {3 j* B$ T; U, L7 p
    补充( s! m1 _/ `& [$ J/ p8 ?# @5 ?: @8 K
    程序中d_{a}_{b}格式的变量表示a对b偏导
    ( y6 ^0 i: i% N6 |- \& V————————————————# l# ]  v3 T2 R- R( a
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - g# `6 j( O1 w2 S4 V原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954, G" y/ ^6 X- D( e+ I0 _' \
    4 V. m4 J( I  J1 z. l

    9 o% u" f# J0 H) k
    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-14 20:35 , Processed in 0.373535 second(s), 51 queries .

    回顶部