QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3107|回复: 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实现)! d1 b7 j, f/ V( U0 }5 v: n

    * T4 Y" {) c0 _& D5 x* ]背景$ m: c! ?$ ~8 u
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下9 c7 X, r2 y6 N5 y; h+ I' M; V

    - {2 ?+ F- y+ _5 }- ?0 q! K# k) T【神经网络分类算法原理详解】
    7 i0 {7 \$ q* a/ \* j8 D3 ^) j  ?2 j
    注意& `% ~8 b& Y$ K0 p- g* K6 {
    站长提供的图片有点小问题,我们更正如下- n* h4 Q/ z1 k' Q, Z3 G7 e
    6 O2 ~/ H1 f8 Z% F8 _% O, V
    * m3 h5 K8 _8 B* U

    ' \/ G* E& f+ X1 B) Z+ l" |& z) @5 N问题
    ' H% h& m" o7 k$ z$ x" w% k# s根据上图所示,我们有已知' w1 n% n9 D# j! c1 f

    8 M4 |# z5 K) P1 I' C) E#输入层
    1 ?7 z& \) S# `+ vi1=0.05
    ' O( r9 `- n/ @$ f& V! ~i2=0.1
    ! K' c) x' e& t4 v: k' a- |" b. D; U' N
    #输出层* X3 {% U5 ]+ m' V/ _2 {
    o1=0.01
    ; T6 }- L1 r9 m4 \o2=0.99
    1 F; |/ l, ]- t( o$ L) \! `这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    2 m5 w5 w0 `* o$ I
    : g. @0 R5 J& D4 R8 v神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    1 e& ~5 X; D$ ~8 z6 K
    . O3 k( m( F- U. A5 }: V; E神经元h2的输入  (hi2)=w3*i1+w4*i2+b1* T. u) |: i( x. M7 W' a; t7 I- G: q
      J( c) l* u: j# }% Y: W$ L  V
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出0 ^5 j' P; k0 q9 l) f
    3 Y* i4 s2 s4 S1 K- i
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))7 a2 k4 {2 m7 U& M8 e

    : g' w- I4 B5 p6 H6 ~# p7 J7 S同理
    / R! _0 m7 m( D4 s; p' y4 J" V' K1 h, y5 A5 X; t. N
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))  J* W1 k9 W, ^& t/ n$ R% Q
    8 i3 z3 u& @" L$ I, @
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式: E) d8 H9 F, @$ M$ ^
    . [5 W, U* c: F7 A( O( d; ]
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2, E4 m9 E- f8 [' T
    4 B# Y9 O# t1 {
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2- h3 A8 \2 f! x5 s; b
    6 G4 ^/ E; l) g. f" x
    再经过非线性变换Sigmoid函数得到
    " c9 a7 Z. u, o/ w- q2 R) b
    $ o: f# @  z  i; Q  ?0 o神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))8 i0 u$ F$ y! }$ X7 o3 @( [
    . l  r. k8 ~  ^
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 g* n" ~/ N2 m. r

      E$ ^- `& U5 o. T/ o我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    ) Q& m, D3 I0 e  }! H3 \2 C( f9 u. A0 e
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    " R1 t! X+ k8 @5 D% j* ]; n2 h2 C
    7 o' \# M" X5 @/ B" H由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足0 R6 l/ Q0 X; m+ u

    7 E% W" r+ j$ R* ]. Y学习次数 (learning_time 简写为 lt)我们限定最大为10000次+ n2 e, h& s  ~7 l% E3 {9 C' `
    + Q1 B- j# o+ f" E( i: q  w
    学习率 (learning_rate 简写为 lr)我们设定为0.5* C- ~, @& p: f# ?
    # f! f  v2 V5 u; A% L& J# G3 R
    依次求解代求参数
    ! j% X0 Z, h9 O+ p- u' l6 `' V3 K
    ; I" m/ c5 c& o& Hw1~w8,以及b1,b2, }4 F" Y' a8 }

    $ u& C' s/ K8 t, L5 `  m! s  z+ U7 W: w跟: m. P; E3 t, W$ p; W/ d' E: t, v4 X* N
    ! Q3 p! t6 z, b0 e
    损失值 (eo) 的偏导数
    " `3 G+ V3 T0 B: L6 H1 `
    / P2 g2 [& P5 g2 d, N3 c5 v5 V4 V再更新该参数,更新公式为
    2 B( N8 M+ P, m1 @! t  \$ e6 R2 l/ M( ?2 q  \- N4 c
    参数_new=参数-学习率*偏导(eo,参数)
    9 J2 L9 [" E; B7 ]随后进入下一轮学习
    7 [& B% _& L2 D" M6 h. {' V+ ~8 M" d1 P  I, s/ @
    终止条件(满足其中一个即可停止训练)
    & q$ k! m2 }0 ]+ m, p; Q
    : Q7 y/ p/ O* |' Z# F) j! g1.学习次数达到上限
    ! N2 v- z6 F# b$ M
    # h; Y7 W, T# h( d+ V2.损失值达到可容忍的范围4 S  ]3 n) E$ G( Y9 ?8 h7 ~
    6 x. e# K3 C8 _; K2 Q3 C
    导数5 s' w1 i6 M5 x) w/ \3 g6 L8 p
    f(x)=1/(1+e^(-x))的导数是. H. k! t$ W; U) U- `2 @
    f'(x)=f(x)*(1-f(x))
    7 \* S" B( n* m( H0 V源码
    2 X' }( Y1 J( l! j7 d1 t4 K, N0 Yimport math
    4 G! o& q4 w& I5 G: H- G+ _8 ~* b" d% c+ U& H" Y1 V
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    ! k, T8 [9 J  R7 w# }#网址中图片有误,请看我博文上的图片
    . k8 ~) |$ \( t3 H
    4 U. l2 S! X0 j: U0 S#输入层9 |+ ^- z) V- s4 r
    i1=0.050 c7 B9 ~  o9 V4 B
    i2=0.14 k% a: L' a, X1 T9 C7 R! Y0 z
    #权值参数( {6 h9 j. F5 U( E
    w1=0.15
    ; d/ w* P( m" ~; q) u& u3 Cw2=0.21 T, F) [; s: a' P0 U% ?
    w3=0.257 s8 r2 f: l4 }" B
    w4=0.33 S, w/ ~. e. Z
    w5=0.44 _9 _, C9 D" {0 Y
    w6=0.45
    - ~" k6 R0 _9 g' K4 @5 X6 Dw7=0.5. j) t5 P# }' p7 |5 j: _4 Q. V
    w8=0.55! a- N; u" N! K
    #输出层标记(即期望值)
    ) h9 b6 ~: I3 ]4 A7 u7 w8 no1=0.01
    $ y, D# f% W! \5 N" V5 g+ io2=0.99
    6 `5 P2 e3 |% c0 M/ s+ u& W1 B8 W6 d#偏置项参数
    # l5 Z# Q. z* W/ Ob1=0.35' ?( K8 A8 i/ x# r/ [) P  i9 N
    b2=0.6
    ; M2 ^- o/ [4 t
    8 D# F# {: q5 L' m& c6 a  k1 b#学习率1 x. K) P. O& p6 _
    lr=0.5! u5 y* S" g0 P1 C+ c/ \$ ^
    #学习周期; U2 i5 w, c; n* G
    lt=0' ]8 y+ l8 |# Y7 n- \9 g2 l% n
    max_lt=10000
    / S* b/ n, ?$ {0 ?, L# |5 R#允许误差
    4 y5 e( n( E! P% Z  _! q9 aeo_allow=1e-53 d* t& I$ R# y+ N" c& G4 F

    + M- x: f$ ~6 ~8 {) H$ A- g1 k#线性转换1 b, E4 R4 Q1 l! |1 o" `
    def linear(w_one,w_two,i_one,i_two,b):
    & S3 ^: P! w- J! H$ f9 ~% y* P+ c    return w_one*i_one+w_two*i_two+b
    : z, C; \5 v* h#非线性转换
    ( B" {* ?$ O1 t  Q8 Y& Xdef none_linear(i):
      P0 N" }" C" y0 R    return 1.0/(1+math.exp(-i))3 G; x1 P1 N# J  M
    5 g% x' n& x( \- B& R4 |; f& h/ Z
    print("训练开始")3 r6 w+ v% u' ^& d. z8 p! A  g  J
    #学习周期结束前一直学习1 Y# Z1 h7 ?8 Z1 d. \
    while lt<max_lt:- [& n. D1 s  F2 q- c, Q
        lt+=1
    8 R. o4 e# P2 [    #求h1和h2输入值' [: X' K3 |' a5 y
        hi1=linear(w1,w2,i1,i2,b1)
      W) u, ?9 D8 W! z" p' N  N4 g/ B    hi2=linear(w3,w4,i1,i2,b1)& c# Z$ ~. m. p7 u( U
        #求h1和h2输出值- o1 E; X: P" E7 U' ?( n: O  T
        ho1=none_linear(hi1)7 n' n$ o5 q: C* h/ |9 ?" s& D
        ho2=none_linear(hi2)
    % E% A. L" C8 }, V3 d    #求o1和o2输入值
    2 C, H' |" O2 l5 d+ J    oi1=linear(w5,w6,ho1,ho2,b2)0 k7 i& l. o* [1 t2 {  |! @
        oi2=linear(w7,w8,ho1,ho2,b2)
    , E" J% `) k  U    #求o1和o2输出值
    2 f4 |  y  K2 `# t5 T7 b& L; a    oo1=none_linear(oi1)$ {; P  @2 {7 S$ K
        oo2=none_linear(oi2)
    4 ~4 w: f8 C5 k% B; H' j
    5 B* \% J+ ^- g2 U6 l    #求当前计算总误差$ ]7 d/ l4 p! O* D/ O% f5 g/ y2 N
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/28 G6 \$ b$ v0 l" Y$ I6 d+ G
        print(f"第{lt}次训练,当前计算总误差={eo}")/ e* \7 B! J8 V7 }) U
        #误差已经在允许范围,退出训练# a* R" b4 T$ i, o8 h# ~
        if eo<eo_allow:
    " ~1 i& R& i5 o0 o% H9 y        print("误差已经在允许范围,训练结束\n")
    4 L% ^4 y' S8 k2 L) t) G2 d        break
    ; @% |9 @) s4 h& h0 X1 Y    #偏导
    , R/ `6 |/ l! Z+ Z9 J+ ^3 e    d_eo_oo1=oo1-o1! |7 t. I0 h2 V8 X% n$ W
        d_eo_oo2=oo2-o2
    / {* P/ Y! B( \; u) V    d_oo1_oi1=oo1*(1-oo1)/ y" @  d: J9 _8 u  U% j& P
        d_oo2_oi2=oo2*(1-oo2)1 K5 A4 z( o& l, c
        d_eo_oi1=d_eo_oo1*d_oo1_oi17 H  Q: b2 C+ u" @0 m" W2 W
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    & ]2 u& L) M9 x; r5 Z    #求w5_new, Q" a1 W  r4 M2 V
        d_oi1_w5=ho1
    ( z# a' N1 a& n    d_eo_w5=d_eo_oi1*d_oi1_w5
    5 K) M5 c6 L2 q2 s6 z    w5_new=w5-lr*d_eo_w5
    , q0 @' E3 U6 l0 P) o6 V    #求w6_new' Y0 v& }3 I: D8 N$ S5 t
        d_oi1_w6=ho2
    0 _0 j. F# Y  T0 y9 ~4 A3 T    d_eo_w6=d_eo_oi1*d_oi1_w6) Q  y2 Y0 m: a$ @6 B
        w6_new=w6-lr*d_eo_w64 A1 F: `/ q5 P
        #求w7_new0 ^! ]" Q8 I, U( T8 r6 G* n
        d_oi2_w7=ho1, K2 {3 s5 r/ y7 m: K; j
        d_eo_w7=d_eo_oi2*d_oi2_w7
      r7 ^3 v. R, X    w7_new=w7-lr*d_eo_w7
    9 J3 F2 }7 d! X8 c/ F    #求w8_new
      q6 z7 s- [0 `) ]% q    d_oi2_w8=ho2# C9 Y) m7 K* A7 V2 t+ U7 @
        d_eo_w8=d_eo_oi2*d_oi2_w8
    . k: d( b8 i  c; `3 z    w8_new=w8-lr*d_eo_w85 f) O. |. ~& H
        #求b2_new
    & {! Y" m1 n; X. `  ~2 [9 \  m( U    d_oi1_b2=13 ?4 B6 o3 V5 g7 U
        d_oi2_b2=17 @. [1 x. L4 j" d& X' ]
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    $ g4 k( g7 ]. h, L9 c& B; U# K% L. M    b2_new=b2-lr*d_eo_b2- b1 k' ~4 J9 _9 L9 o: I* H+ k
        d_oi1_ho1=w57 t' t7 a  F# e* j  I
        d_oi1_ho2=w6
    7 L& q( G/ m6 d" H4 a1 u    d_oi2_ho1=w7
    ' e" I% h" s6 @. f5 M4 @    d_oi2_ho2=w83 W8 B3 P7 b6 c
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    $ {& \5 F2 U1 U    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2/ z" ~6 i. Z5 m9 |+ X1 s
        d_ho1_hi1=ho1*(1-ho1)3 y: r; X6 U0 H1 M9 O1 i
        d_ho2_hi2=ho2*(1-ho2), k5 u1 Q: ^; I7 U7 L3 L
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    8 ]- _7 g3 [% [& Q    d_eo_hi2=d_eo_ho2*d_ho2_hi24 d9 v! ]8 X" w+ H9 |
        #求w1_new
    3 k  z! {! p; w* ^: M& B9 }    d_hi1_w1=i1
    5 i5 T# I4 n& V6 w" W. m    d_eo_w1=d_eo_hi1*d_hi1_w18 ^4 K5 @8 b8 e- C
        w1_new=w1-lr*d_eo_w1
    + f' V% z5 P8 x9 |* w9 T    #求w2_new
    . @% t. @# W+ d! H    d_hi1_w2=i2
    / \6 K" i7 |/ T0 b    d_eo_w2=d_eo_hi1*d_hi1_w2
    3 y! k  C4 }$ m    w2_new=w2-lr*d_eo_w2
      k: q- N3 x1 r6 u6 u6 z) ~$ U    #求w3_new
    , B, r# y6 e/ T    d_hi2_w3=i12 v4 S7 i' t, g# p
        d_eo_w3=d_eo_hi2*d_hi2_w3; F- a5 S2 ~6 |" M" O- g6 x
        w3_new=w3-lr*d_eo_w3
    % M+ E) a  j2 ?8 J$ q7 _    #求w4_new
    7 r' H. [3 J( z    d_hi2_w4=i2% T& f, k- K8 J
        d_eo_w4=d_eo_hi2*d_hi2_w4
    " z& }% ^7 E! ?$ W& L: L; P: y    w4_new=w4-lr*d_eo_w49 n- V) y* `# p
        #求b1_new3 F1 {6 P. r1 m4 R; a
        d_hi1_b1=1
    8 {  w1 s. M- s7 b5 ^/ M    d_hi2_b1=13 v9 D7 v+ l# d% O) q/ ~
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    7 W. o$ r0 K% i7 ?* B, t    b1_new=b1-lr*d_eo_b1- u6 t  o& |  h, B) C! I* v1 R
        #更新反向传播
    * \( ^* t3 b) T8 v! Q/ p    w1=w1_new
    # m, m' P: Z7 H5 D/ T; j6 [2 l    w2=w2_new) ]9 }9 X; Y" O7 ~# e1 L( h
        w3=w3_new( s) U, o% q% c
        w4=w4_new' ~% [2 y( }8 d
        b1=b1_new
    # y2 O7 V1 L. F1 x( u% y    w5=w5_new* v5 q% I' k) _+ g9 ~& o' B
        w6=w6_new
    5 s) i; U0 N6 ]7 W2 H    w7=w7_new# B( a) {( {' c) Q( e1 |8 |
        w8=w8_new, r2 l) x7 V9 f8 `
        b2=b2_new( X4 A3 T& ^- S6 M; w8 z$ r3 K0 N6 y
    print(f"当前计算总误差={eo}")5 x8 X8 C$ R8 {* L# X4 B
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    ' J' j% }% M. @9 J' u( t; _print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")) \% |$ d: A" j2 Q! \: t
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    ! s2 ]1 L& t- [8 s  W) f3 _" D9 t! Q
    & l  B1 q6 T# S' y5 j% w结果
    9 i: L! V: [9 o8 D
    ; u& z0 x) r8 w/ A2 c2 m) u" D7 u# r' t3 W# }& H/ o
    结语
    : `+ D. Q4 ~6 Y& t8 y9 t8 c5 F可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    ; e+ h3 i+ Y% U. I0 J
    4 G# C* o+ b( E补充
    % D* ~0 l; h' g- m8 |程序中d_{a}_{b}格式的变量表示a对b偏导
    0 W2 Q/ k/ k' @6 P- U! t————————————————+ W+ C4 a+ L' {  q( y# c
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 o, m2 M2 y( \5 J9 ^原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954' P: L* V- n) M- R
      C( _0 q% Q5 L4 s
    ( R2 V* J8 g- Q
    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-10-9 07:37 , Processed in 0.420782 second(s), 50 queries .

    回顶部