QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3053|回复: 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实现)
    8 P1 r6 X2 j! @0 H, `" b) T/ Z0 f/ E2 [
    背景9 x3 f8 _" _# U$ c! i. q
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下. b: k4 S. T% p

    , e1 O- P" P9 k# e4 ^6 M- Q+ O【神经网络分类算法原理详解】1 B, e5 g4 h7 ]1 x( H+ S

    % k2 w& g/ l( T9 L/ V6 l' l- m注意* G2 g! `/ i  B
    站长提供的图片有点小问题,我们更正如下
    - D/ l& e+ }- x8 O$ S% B9 y/ h& p7 U/ l, `
    : y) d% ~* f- R+ n
    9 ~) v6 x: E0 F
    问题* l+ Q* @2 v; ]9 R7 x. d" ]
    根据上图所示,我们有已知
    * K5 Z7 A4 D& n1 B( f4 r" o
    + I* d- W  U' N% G& N; o2 l) L#输入层
    " Y6 Q" n6 _: yi1=0.05
    8 g& H4 R: _  q- }7 n  {i2=0.1
    . R6 ^2 D0 H) u- W- K3 c3 ^2 @% U4 N) E7 ]! Y/ ^& ^0 M+ H
    #输出层
    ) h/ i# y$ y6 n' X/ a% V" j( Y9 F, io1=0.01$ Z; \4 R( S" G* H) W
    o2=0.99. a8 S  D+ B2 I
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    8 K% a% c# s, i1 O0 v7 [4 {3 W" m% m! L
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b17 K. N4 w. Z0 l2 k3 U9 a
    8 n# ^# }: Z( F6 d# q6 P# {
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1* i2 p4 N& F, X0 k7 o- g& @
    4 [0 K) d' q1 {+ {$ I6 c
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出! U# {4 Q$ x" G4 U2 x, S
    4 S7 z# o: d% B/ F' w; E
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    + x7 Y: U9 h1 Y7 m( h1 |' [+ h4 I. h& O8 a: u) u+ @! Q
    同理
    / N; R* X1 |2 s5 w
    % i5 W+ E0 ]2 \9 N7 B神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))) n  Y5 l' O5 G# @
    * p! H7 l* E9 r4 D. M9 H
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式$ Y0 R( [0 V9 u+ `- X
    ( q% Q# d% w$ r$ l+ M
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b21 }: N! c2 X* F4 H* T" S
    * W& [8 B/ X; R# Q3 H) P
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    - y1 o; L8 I6 f; h& t$ u' `( _( l8 K. S% c, D/ L3 y6 M
    再经过非线性变换Sigmoid函数得到
    7 v& B  s2 Y, b4 z2 G1 y, ?9 z+ u! O# ~* `+ z, a6 P/ |
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    $ k) N) f5 O2 v6 G, R( E4 M1 J# u3 l0 \) U
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    - r% t8 m, W# a& Z' \2 F" R( E6 {, {7 G
    1 n  ~6 d, F7 O9 V  r1 N! C我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为  Z% a: V! Z6 ~: S3 o2 M! F

    8 K1 h  h# o2 m3 r3 H4 B! _: M损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2; {0 d/ _$ ]' X5 t: v
    % f% ]& K* `& x8 O- n/ U" j+ @
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    ) ?2 l( p. {7 y4 }+ y! Z& H! k# D1 S* I/ `5 \) H
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次8 g6 P, P% w- D- f- c6 H

    $ A& O$ |8 i0 M& M2 [学习率 (learning_rate 简写为 lr)我们设定为0.5$ L5 m& P" o: E7 O# Q4 y0 K1 j
    ( O  M* p+ P) u7 @" K
    依次求解代求参数) V2 M$ G% Q8 c, \1 a  G5 o
    5 v; l: A* z- H/ _
    w1~w8,以及b1,b28 G% Z+ g. v; P
    $ j  {2 |; P8 Z" f8 [. P
    / u. M+ Z9 W6 m4 S& y% C$ {* l8 f7 }

    : r/ G7 H4 d/ Q. u9 S损失值 (eo) 的偏导数
    8 w1 @; x& |" \6 A) J% ?& Q2 d/ E; K' r( H8 c
    再更新该参数,更新公式为! O/ }, p4 ~7 B, S

    / Y+ b7 H( C+ |9 |参数_new=参数-学习率*偏导(eo,参数)
    ! v/ ~& `: y. d随后进入下一轮学习
    7 X; n/ s% ^6 w0 H' H4 Y% k: f
    & U# i7 P; x% T4 d' x* k终止条件(满足其中一个即可停止训练)
    % e0 m' L4 {5 s  v
    - ^2 `* D# F% e1.学习次数达到上限1 I: `" C) W. ~2 w# R# ]& n/ R
    ) U5 d- P1 O9 J. Z' I
    2.损失值达到可容忍的范围( k! D, o0 `: X. i6 y2 O* c
    * D1 A$ J, a7 y! h9 I( X2 x$ h
    导数# x2 g2 K" I0 @% T- ~+ B6 N
    f(x)=1/(1+e^(-x))的导数是
    : j1 ?' y' y$ T8 [8 D/ A3 c6 ?# Jf'(x)=f(x)*(1-f(x))
    2 m3 E  G" ?% f2 o1 H6 N源码5 Y/ v  o* Y( Z
    import math
    3 l- y+ J9 [, j3 ~2 J4 S3 M4 `  e5 a0 v* u/ S
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】+ U+ Z" k) _$ f
    #网址中图片有误,请看我博文上的图片
    ! k6 u- U; y# R7 u& D3 X* B4 {+ C( w, z0 l3 o
    #输入层3 B0 Q/ ^6 U) ]+ V6 |3 s
    i1=0.05/ K' ]: q2 E- z. B' E
    i2=0.17 h* X. A8 r& z5 t
    #权值参数  P; f7 {% e+ f% m
    w1=0.150 k1 v8 G' K* u; \8 Q* F" I
    w2=0.2) i- C& R) E: J3 h# ~
    w3=0.25
    6 O$ L4 {* ]' l- c! fw4=0.3
    ! O" V- B; C6 Q; q/ a$ Ow5=0.4& \/ m& O! y. a+ e& ^
    w6=0.45
    3 O7 h& g/ T$ e1 w  r( i- Rw7=0.5
    4 d) z7 r2 n3 i) t( F# Ww8=0.55
    * N: G( R( P; o  X#输出层标记(即期望值)' j/ e3 a/ c8 k  y7 ~% O
    o1=0.01  A% }4 f* e8 ^/ x& w
    o2=0.99
    , n6 o5 V' D+ A; N#偏置项参数
    , D) `% H4 I. b( R; O- o2 W; qb1=0.354 h% C, q  f" X) Q& h) v
    b2=0.6
    ( t0 A  Y" L5 ]5 C! }. u! n! q+ B8 q* L) D
    #学习率" h$ A9 U, a2 o5 y( a: j5 n1 j: P: T
    lr=0.5
    0 Y. W- P! M8 y#学习周期
    " m/ f. [/ ~$ k) r( e; K: k6 }6 v) vlt=0: j* J- {( j5 \2 s2 u, f2 R8 r' E
    max_lt=10000% H, |/ [" y& R
    #允许误差! p7 r2 G. q% V/ D
    eo_allow=1e-5
    2 P  B. E: G4 p. b
    " L6 o) L& {5 C- n" H1 @0 V#线性转换
    - x, a7 J- k7 a( Z( cdef linear(w_one,w_two,i_one,i_two,b):
    : z5 j, i+ W+ W0 K; U8 }    return w_one*i_one+w_two*i_two+b3 I% T8 P, h1 R- w# H* b
    #非线性转换2 w+ F. _' B3 K; ~
    def none_linear(i):1 e7 h  g' x4 h9 Q' N
        return 1.0/(1+math.exp(-i))
    . U8 N1 {2 z+ L4 ^7 |2 B& V3 i4 P+ Q: q! S# X3 E6 w
    print("训练开始")0 i( E$ r1 _8 _; I
    #学习周期结束前一直学习
    ; Y- q# d, T9 D! l% @while lt<max_lt:/ ^( Q" s1 K& c7 Z' q
        lt+=1
    9 A+ o3 O; w6 i3 j' D3 `5 f' R8 q; J    #求h1和h2输入值
    ) e3 ?% K7 x7 d, i$ e8 t7 B0 z    hi1=linear(w1,w2,i1,i2,b1)
    5 Q/ g0 t" ^7 w7 @    hi2=linear(w3,w4,i1,i2,b1)2 G1 c- B, n  a2 S! z) p! K
        #求h1和h2输出值& v( e9 Z) U7 h( b# Q0 N4 v
        ho1=none_linear(hi1)
    1 _  ]% B% B! j' \) S! c    ho2=none_linear(hi2)0 k" w8 @: E& Z0 d
        #求o1和o2输入值
    $ J3 M/ k/ b* n" M2 y    oi1=linear(w5,w6,ho1,ho2,b2)6 Q  U8 B. H( N
        oi2=linear(w7,w8,ho1,ho2,b2)  L) ~  c) h( e( a
        #求o1和o2输出值
    2 t4 I; q2 x; C- f5 Z$ n: h    oo1=none_linear(oi1)
    ! @& R, E& n- S. U; a    oo2=none_linear(oi2)( a6 P9 X; X( c3 f5 n9 J  {

    : q$ W: g1 Q8 E    #求当前计算总误差  I# d! s- V' E+ x
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    1 N+ ~/ ~/ V, j; o5 V    print(f"第{lt}次训练,当前计算总误差={eo}")8 B2 l  s- R4 @7 K) D3 A. t$ r
        #误差已经在允许范围,退出训练+ s% K1 k! q$ p4 `5 G% o
        if eo<eo_allow:
    ) r3 L+ b1 `' w% C6 l        print("误差已经在允许范围,训练结束\n")/ h9 o! V2 Z" i. Z
            break
    : D5 \/ n. R1 I8 C* A% G. G  K    #偏导0 p0 s" J# p1 x2 w9 ?( D' B+ T$ r
        d_eo_oo1=oo1-o1% N8 O0 j! c9 [! z- f: v2 x
        d_eo_oo2=oo2-o2
    % @% f5 v: r3 Z    d_oo1_oi1=oo1*(1-oo1)7 X: J( l* o& `; ^
        d_oo2_oi2=oo2*(1-oo2)
    + v" R. U. x% Z    d_eo_oi1=d_eo_oo1*d_oo1_oi14 q1 i3 {* }( q! U; c; B
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    & U- m# [' {* {' F    #求w5_new
    2 N7 ~0 h: L4 s- u& d- x4 W    d_oi1_w5=ho1
    ) c& i* y8 `* w8 d+ l! N' k    d_eo_w5=d_eo_oi1*d_oi1_w5
    3 d1 E3 W; ?- }* V$ M    w5_new=w5-lr*d_eo_w5
    5 Y5 N& N8 X8 Z+ B5 E    #求w6_new0 _/ \, k9 L/ w6 Y; j& M8 S
        d_oi1_w6=ho2, t5 ~% {4 w, n! A7 c$ ~
        d_eo_w6=d_eo_oi1*d_oi1_w6
    5 I: E+ J1 D$ K7 U3 w  C    w6_new=w6-lr*d_eo_w6) [) M1 [" G" ?+ D5 o
        #求w7_new5 d" d) m: `) V! X' r
        d_oi2_w7=ho1
    1 K, u3 \, j9 N# L( v- y: U    d_eo_w7=d_eo_oi2*d_oi2_w7, H  w5 ?* g+ S' Q( ?# g+ M
        w7_new=w7-lr*d_eo_w7
    6 b! Z0 n# o. k0 [7 E7 l    #求w8_new9 A% S8 o" h& a# T
        d_oi2_w8=ho2( z5 |" b( j- j. {: \
        d_eo_w8=d_eo_oi2*d_oi2_w8& l$ m3 P6 l8 q. v$ M
        w8_new=w8-lr*d_eo_w8
    1 ~8 g+ B: c, J2 u& R: w2 B4 h    #求b2_new
    ' y2 Y: z3 e7 e( b9 y, ?    d_oi1_b2=1
    6 j% B5 r" @" i, s0 v    d_oi2_b2=1
    ) F7 r; F2 H/ D( M3 B5 C7 o    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2. e# I& f* s7 }- n$ C% G0 z
        b2_new=b2-lr*d_eo_b2
    & z1 [  m3 _$ L5 A7 k; E    d_oi1_ho1=w5
    2 p8 y4 t. ?3 [' A  K. H  V# L3 \    d_oi1_ho2=w6
    $ d4 o6 Z5 J: _    d_oi2_ho1=w7  @7 u2 f  {1 ?5 H7 z
        d_oi2_ho2=w8
    , W' X% H" s/ E( r( n* A% L    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1- x5 T6 C& \) H( E) b& a
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho22 b! X/ g6 E1 _) O
        d_ho1_hi1=ho1*(1-ho1)
    1 {, J0 N  _, V( M4 ?$ R    d_ho2_hi2=ho2*(1-ho2)
    8 U; G4 \" W! W# A    d_eo_hi1=d_eo_ho1*d_ho1_hi1) u6 |. i& O! \# w
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    5 v$ W  K9 M' A+ k    #求w1_new$ u# b" Y* B+ y- X
        d_hi1_w1=i1
    6 b) j6 |; G2 d  D( z    d_eo_w1=d_eo_hi1*d_hi1_w1
    / Y+ Y# Z- M1 U/ q8 D, T! s    w1_new=w1-lr*d_eo_w1
    6 s' u* `' P( i0 c9 A6 Y. A& C    #求w2_new# @+ P! E# G6 T. u. I! x" ]
        d_hi1_w2=i2
    # `  N# d, i4 }& p    d_eo_w2=d_eo_hi1*d_hi1_w2$ {2 B& l1 ^6 T, q% B. a' X# f
        w2_new=w2-lr*d_eo_w2
    9 ]8 L: t( x: F* _$ W" M: z0 h    #求w3_new
    4 Z8 G  L, t" r& L. f" J    d_hi2_w3=i1
    & @3 S' c0 P  @# j- T    d_eo_w3=d_eo_hi2*d_hi2_w3. V- d+ m/ G' I" G9 S* q
        w3_new=w3-lr*d_eo_w39 {# K. ]5 H3 q( g. F
        #求w4_new
    ) P2 D$ p; h# Y$ U: W' r/ U    d_hi2_w4=i2) c/ q. m" X6 Z- z7 {
        d_eo_w4=d_eo_hi2*d_hi2_w47 V0 u/ Z% m& T
        w4_new=w4-lr*d_eo_w4
    5 [# A" @; I' P1 y+ q    #求b1_new& m3 t) B4 `, b# B6 K
        d_hi1_b1=18 P6 g5 l  G. B( W6 O% u9 T
        d_hi2_b1=1" I. r0 R9 N5 r- h* b- N/ ~/ e# O
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1# u! {, A( [6 F5 j: m/ d6 _( k0 i8 w
        b1_new=b1-lr*d_eo_b1. S9 y5 {4 I5 {' ~/ z
        #更新反向传播
    3 c3 b  j2 A- h7 |! p9 R    w1=w1_new
    / q! N5 W& |+ F7 p$ a$ w2 y    w2=w2_new; m) @# g* |/ G0 ~) |+ e  B
        w3=w3_new* g9 Y" }, a  x% f% M0 q
        w4=w4_new
    ; F$ D: @9 c+ X" k- d/ [% V* a    b1=b1_new
    6 U  @6 `; u0 i& Y" Q    w5=w5_new
      s4 I2 V# N# f    w6=w6_new
    9 z+ Q9 {- m" u    w7=w7_new
    7 |4 h, _5 }9 ?    w8=w8_new* R, m3 t0 V, _, V1 ~$ _
        b2=b2_new
    + t& X5 m6 p4 T7 I6 Zprint(f"当前计算总误差={eo}")5 V. n' A7 Z" {6 V6 @! t8 @) ^
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    9 `  Y& g" Z8 z- ~, hprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! ^: Z; s' k7 _  _
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")! c- b# o# @# _5 m

    ; s2 Y: ]! l7 I5 w: F8 u; A结果
    * q( U% U) J* j, w0 p- w4 H0 c6 C8 k9 S8 ?& L/ e# e  {

    0 g" V* `1 O$ \结语
    ! V; {6 T$ o$ D/ p" _+ E可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    ; I7 d. T3 P4 D/ Z4 P
    7 V- M- S. t) q9 g补充
    5 Z3 p( M, N- |9 [. e程序中d_{a}_{b}格式的变量表示a对b偏导
    6 h: L) v  }9 d& H+ ]————————————————
    6 X& J2 W- o4 W9 _  ?, Y( d1 p: o版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - d1 ]8 N: y. B- Q% a( O, O$ G原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679544 T- J, f. O( V# i

    9 a8 H( g' L) u
    & ^2 o: p1 N* l0 Y* T2 z) J5 }
    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-7-30 20:36 , Processed in 0.493920 second(s), 50 queries .

    回顶部