QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3051|回复: 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实现)
    * i5 l7 V6 z$ q0 h8 @& ~: W3 g- N; u
    背景3 n4 k8 N; Q# b
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下: n8 `$ z- N9 @4 G

    $ |( T# N8 V  X& ^: y0 W【神经网络分类算法原理详解】
    - p* E$ u+ A! x( Q5 P1 s/ ~/ A
    ( ^7 p( }" {  s# J1 d注意
    : t" W  |8 `: m1 N% ?, R: b站长提供的图片有点小问题,我们更正如下$ g$ y: b0 v) n' ~. G' P+ }( @6 {- M

    6 G$ x3 c. }" G) V* H
    % U. k5 N, Y1 R+ R
    2 `1 q" i# r, g) G问题
    0 M" ]5 u+ }/ m4 {% L根据上图所示,我们有已知
    " L/ i* V4 h% b9 W# O2 {0 J$ S0 U# V: N3 R% y$ S0 {
    #输入层
    - J& M4 C( s/ {  ^/ Qi1=0.05! m3 @7 S; E3 R0 N
    i2=0.1
    # f% S) G  R! }. p, x& I9 S( E0 @+ L2 E1 R2 u
    #输出层
    7 n1 E! M" f2 V% |+ b- p& @! d4 Wo1=0.01% p. C& G; X9 J0 ]8 [9 G! z# \
    o2=0.99
    ; m* I& @' v2 `0 y" }这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    8 k; m) E. ]. k, b* n. x0 @  {7 `; R$ \* g! n* }2 D
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    3 _; B; O# l+ B, ~+ q, Y  b) a' ?7 Q# X( ~' D0 N9 w
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    ' \. a/ }; T) b, Q
    # G9 Y' K. o3 o8 q% p神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出/ c& n& |- {6 i6 u# {! N: h: \1 ~* ~

    3 A) x! R" q# e1 z+ u  G神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)); m- U/ s7 s- o/ l9 V/ G  T

    5 u8 O3 X6 }; P7 e4 p5 g同理% V, h' z, E1 {0 v1 _  h- F; A; H

    $ W) o( p5 y  A4 N神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    : o1 c& e$ V* ]2 v# \; ]# y1 Q+ E- U
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式8 W& ~" u6 f( |* M3 M5 ?1 L/ w. N
    " U  q6 b. \$ L8 B& H1 u- c; K
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    1 d. O7 z! `- V5 U* |! Q8 D; S
    7 v/ v+ {  k  s* j9 t! I0 C神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    3 T: }+ T1 d: N; Y0 ^1 B; ]) q
    ; A1 M( y4 n. ]再经过非线性变换Sigmoid函数得到/ X4 @% \! }  G5 u: U: e" q0 u( A

    * q8 a% P2 J% ?* @1 ~0 |4 Y神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), S0 U9 {! J) q; u. M8 U+ W

    " n4 E  b. v  j! S3 F8 M神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))! ^( u' @/ F: H8 D& g# z
    7 D% V* U; H2 t! E: F3 \' @( Y4 j7 {
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为4 q+ s. K+ i6 D+ T. L7 N- c3 ?

    ) z) S' r. x/ W) R1 _" n损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/27 x( o( W& S. [' I
    / J" p4 p) z: \
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    7 O% Z$ s% J  }/ W! v7 f3 C  ~6 n0 p& g2 r9 f
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次$ \) b: D4 n% {8 C

    $ {! ?  t# {2 D# G学习率 (learning_rate 简写为 lr)我们设定为0.5- c" P4 O0 v8 s

    0 |0 |( F0 l2 j' r- d依次求解代求参数$ M0 U; q8 t$ P
    8 k' F; [& J2 J0 P" w* \% ?! i
    w1~w8,以及b1,b2
    & p$ U1 H6 `# z: i, A: v
    " L) N" q7 m0 W9 F1 {% m* y+ p/ N7 Z8 m* N
    8 L1 v+ V0 P. @7 A5 \
    损失值 (eo) 的偏导数* c% z- D& a  I2 B
    . H/ }: m8 g5 C( x
    再更新该参数,更新公式为! Y" b/ v/ M# S/ c' p5 o0 |5 @
    9 D  l( H, a: O1 P/ [- ^
    参数_new=参数-学习率*偏导(eo,参数)9 j5 A$ J6 V6 t4 }
    随后进入下一轮学习: [' V; v- y" A) h" q
    , }! m2 E) o4 y7 J& h/ |! _7 I8 d  |
    终止条件(满足其中一个即可停止训练)! L( H% t! I# l$ r( X3 s; `: n9 S
    + y4 c2 Q" n0 `0 q, t- O
    1.学习次数达到上限. ^% {. y: M6 l2 z, m# j% c2 j

    + d* p! e0 ]+ k7 O" F7 I: Q2.损失值达到可容忍的范围, U6 ]  j/ n8 V/ g/ N8 P" x# J

    . Z9 U9 f9 a, l导数
    1 @2 Z; o& L/ A6 P. Kf(x)=1/(1+e^(-x))的导数是* B: l5 Y' k% W
    f'(x)=f(x)*(1-f(x))& Q0 d. r, ^5 x, X7 L+ q: f, H/ ^; J
    源码
    . _8 H9 G9 K# U( |4 G( n* O$ x* ]import math& v! O* t$ d1 O+ [

    ( D/ t" u; V9 N/ Y#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】9 ]& T3 P' n4 G8 }: |1 r; w
    #网址中图片有误,请看我博文上的图片
    # I' I! c# Q) K! z! @% k- h1 {" V# Y# p0 g% r( ~
    #输入层
    7 R& L9 Z# S- S7 v6 C1 j" ni1=0.05
    0 ]; @: a$ ~) F& _i2=0.1
    $ O. x3 f. ~3 ]# f; ~#权值参数
    ( i" v" t7 b5 i; gw1=0.15
    3 X5 v8 l) V  h5 z, m$ o/ jw2=0.2
    5 U6 a4 @) h, x, b  Fw3=0.25  z0 j8 x. }( t4 d/ y, ?( Y9 \. k
    w4=0.3
    3 [5 l& _7 @" w. ?0 Q4 C" U9 C; p$ D: n/ sw5=0.4+ r- k0 Q* F* O* K% l
    w6=0.45
    5 b) M, a# }) ww7=0.5
    9 f* b2 ^3 D  w: F) fw8=0.55: B- N5 |% w" f) g! ^- d0 S
    #输出层标记(即期望值)8 h) e9 z8 v$ v; e: ~5 B0 p( U
    o1=0.01
    " t6 b# a9 W  \- `+ w3 ^6 Q2 wo2=0.99
    $ d8 A! b, L2 I5 e9 g: S#偏置项参数
    # H  l) X+ _' S7 L" Wb1=0.352 _9 _+ C, c5 x% B' ~
    b2=0.6
    . N5 P7 q0 v6 V. ~! [$ t; F4 |! q3 d7 ?! o  `
    #学习率
    7 X1 L# k7 J& nlr=0.5
    ! e  v+ T# j( W#学习周期# R8 l; G0 ~7 M+ B
    lt=0
    3 x  b* J1 q! R8 H  Fmax_lt=10000
    1 t7 E& g& H3 W5 Q4 M#允许误差
    & {# E; a! ?: j+ feo_allow=1e-5
    " k& P8 H5 {- v, [- H" K+ {! j/ a& Z) [( @3 y
    #线性转换* i: Y& O/ @& C# K
    def linear(w_one,w_two,i_one,i_two,b):/ e' A5 r* B  {( O) Q$ X; P" d( D" r
        return w_one*i_one+w_two*i_two+b+ |7 E. V9 _" T
    #非线性转换& @( }. a% R2 `
    def none_linear(i):
    . M8 w; a9 {% X- @& t" L    return 1.0/(1+math.exp(-i))
    + [4 h- s( k0 e( R7 C1 |7 Q. L0 g' F0 V0 P. }
    print("训练开始")7 G1 w  m  y6 Q0 \7 a7 C0 u
    #学习周期结束前一直学习
    7 ^0 V8 w( N2 N: [- n* n1 t! D* F  {while lt<max_lt:' n* s) x  T! ]/ e1 [& z" j
        lt+=1
    % X* N' x5 a0 F8 d    #求h1和h2输入值
    $ F2 Y+ g, z. H" L5 O& q  T$ D    hi1=linear(w1,w2,i1,i2,b1)
    3 Q' P; C" r0 }    hi2=linear(w3,w4,i1,i2,b1)
    * ?" Q6 E  u  f3 W0 v    #求h1和h2输出值2 K% R  l8 y9 X; v, \! X
        ho1=none_linear(hi1)8 ^( ~8 n. p0 \2 A) z2 X
        ho2=none_linear(hi2)
    . A, F% [  Y1 M# n$ |: g6 q5 U+ r  E    #求o1和o2输入值/ `1 ^) [3 R& c: P) S
        oi1=linear(w5,w6,ho1,ho2,b2)7 x7 X' K0 G+ t6 ^7 R5 p' [5 S
        oi2=linear(w7,w8,ho1,ho2,b2)
    ( H7 J$ T- @1 ?! s5 o( V* _    #求o1和o2输出值
    , e1 b% r; \* U5 T    oo1=none_linear(oi1)* R7 [+ ]. r3 o  q: s, ]/ x* H
        oo2=none_linear(oi2)
    0 f* n5 m; ^9 G1 h4 v! Q) s, p9 `4 x' J8 t
        #求当前计算总误差3 y; U3 A3 O. f) X9 H( J
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/26 s1 x1 ?9 s3 w+ @) O
        print(f"第{lt}次训练,当前计算总误差={eo}")% K+ q  D& s! m
        #误差已经在允许范围,退出训练
    $ [" [9 O3 @- _2 J1 M) f; i    if eo<eo_allow:
    + }6 d6 W/ u" ~3 G1 j        print("误差已经在允许范围,训练结束\n")
    0 S& Y( V3 i6 p! ~/ i        break
    " l2 S- s! n5 Y9 \    #偏导
    - ~' K. x) V. N+ x    d_eo_oo1=oo1-o1, M8 |4 ~3 Q! F
        d_eo_oo2=oo2-o2) x/ g* [* E1 L! h% I$ A# V8 M6 x% K  B) F
        d_oo1_oi1=oo1*(1-oo1)
    $ R% r* U2 _4 Y8 d( m. k; C3 W    d_oo2_oi2=oo2*(1-oo2)
    8 a7 E( [' b& o0 Y- I    d_eo_oi1=d_eo_oo1*d_oo1_oi1
    8 z2 |. g2 |6 l2 V    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    + Q$ x8 K7 ^) h9 t4 r) `    #求w5_new
    % m  d; R' D) i, C: u5 E" Z    d_oi1_w5=ho1: ^5 W; c+ K0 f* N& f" }% r! z' `. C; Q, k
        d_eo_w5=d_eo_oi1*d_oi1_w5
    1 \9 o$ Z; \7 U2 t$ |8 D8 ]  o    w5_new=w5-lr*d_eo_w5
    8 j, |1 }7 U1 ]) H; u$ c    #求w6_new
    0 B& y# O& y! A& O* G0 K  y    d_oi1_w6=ho2. l2 D  F" x9 I; j
        d_eo_w6=d_eo_oi1*d_oi1_w69 r. x$ j0 \0 W8 ?1 [
        w6_new=w6-lr*d_eo_w63 h2 D: B; V2 c
        #求w7_new
    % X  {2 J3 C+ O/ W6 o/ N6 E    d_oi2_w7=ho1
    ( F+ ]. Z  m, W    d_eo_w7=d_eo_oi2*d_oi2_w7  g1 Z* u6 s2 o8 t& U& N9 M" D
        w7_new=w7-lr*d_eo_w7
    6 [) n% O4 o/ b' x# H& k7 v' V    #求w8_new6 ^; K5 p+ g0 H+ z8 G% n
        d_oi2_w8=ho2
    $ h$ q$ C9 B2 S& S* @, m3 U    d_eo_w8=d_eo_oi2*d_oi2_w8
    - Y" Q/ U$ j, z! V" n/ b5 J    w8_new=w8-lr*d_eo_w83 m7 ^& k3 E1 r/ b
        #求b2_new6 h$ ~8 A5 Y) P$ A$ D  O
        d_oi1_b2=15 L3 _) D: M; Z$ z# k2 [4 V4 d
        d_oi2_b2=1
    7 k9 c' q+ V; G/ p  r( C2 f, t    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
    % _8 d- c. _5 i; I( a0 y    b2_new=b2-lr*d_eo_b2# V* A6 F7 x" Q2 ]3 Z  A- G) ^
        d_oi1_ho1=w5' _/ R- X# f# W
        d_oi1_ho2=w6
    & i8 s4 V" d+ m- {    d_oi2_ho1=w7; l3 J( u0 h: m6 Q, I
        d_oi2_ho2=w8
    1 l; p6 b3 n5 @, Y    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1! b0 b. v) p8 o. L* V& O4 G
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    # `7 S$ C  h% p! k! l. T    d_ho1_hi1=ho1*(1-ho1); l1 f$ L. }2 j# a9 q7 L
        d_ho2_hi2=ho2*(1-ho2); A9 p  G* o5 ^# I- S, j
        d_eo_hi1=d_eo_ho1*d_ho1_hi1" j# x2 i9 J. O
        d_eo_hi2=d_eo_ho2*d_ho2_hi2
    ; I3 ^3 [" t! l! b( @% ?7 L6 t    #求w1_new
    5 o6 ~: G+ K2 v5 J! [% `    d_hi1_w1=i1
    " x7 c1 x) w1 ]6 L7 v: ^    d_eo_w1=d_eo_hi1*d_hi1_w1
    ! T; A& F1 Z: Z    w1_new=w1-lr*d_eo_w1
    5 q- @2 O5 F- I  f% ^7 A! r    #求w2_new
    ( I, E3 X8 l7 M( S, S- V) l8 e. V    d_hi1_w2=i2" H$ I2 w$ _% v! J9 J8 N
        d_eo_w2=d_eo_hi1*d_hi1_w2
    * K5 [! l  {/ x& i6 V5 u0 h) V" J; p    w2_new=w2-lr*d_eo_w2
    4 L1 M# d7 i7 x, Y; }    #求w3_new" e+ M+ M' U  p2 n$ o: l" @
        d_hi2_w3=i1
    0 L, Z7 u* r: {    d_eo_w3=d_eo_hi2*d_hi2_w3) x0 Y% a2 z7 j
        w3_new=w3-lr*d_eo_w3
    9 s! I: k, v+ D, o" O. Y; M    #求w4_new
      \/ ?% y8 R! e5 R  p1 l. _& G    d_hi2_w4=i2
    , K7 Z2 v% X: R6 h( |+ s9 d4 h$ r( i    d_eo_w4=d_eo_hi2*d_hi2_w4
    ( |. q- d% Q* P% @; k    w4_new=w4-lr*d_eo_w4
    ) p2 [3 ~! e3 |; j    #求b1_new4 }. K* ^, _' E
        d_hi1_b1=1# b; _; ~! C# f
        d_hi2_b1=15 i6 X9 J; H! x+ E; F2 m5 v% R- Q2 k+ j
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    ' p1 u, H2 V- U# [3 j  A0 X    b1_new=b1-lr*d_eo_b12 }& O; J* Y, z% p  h) j2 R' T
        #更新反向传播
    ; q5 o$ Z: g6 j) Y- T: M& M) q    w1=w1_new& n! Q( J; c" i1 x
        w2=w2_new  P" E/ v( P$ T  l. t% S
        w3=w3_new& Z. {, ^4 T8 ~  W% z0 l
        w4=w4_new
    ) {4 I* J  K# J9 Z4 d* y    b1=b1_new* |/ C* M0 w) }, Y4 L  q7 p8 l
        w5=w5_new
    ; B- L0 D# z+ K: ]* G# d' {0 D    w6=w6_new+ P  M3 r6 K' ?7 {; j* T& Z
        w7=w7_new) u. d; X7 ^2 f- l2 M) c5 I! E3 h2 ~+ v
        w8=w8_new8 w8 z5 y2 u$ L5 I
        b2=b2_new
    * f$ U0 I' v- A' r5 w* Y7 Yprint(f"当前计算总误差={eo}")
    * }0 J0 x3 }* Yprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")! z3 |: _/ ?* R% e
    print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")) k! w0 p  U) Q; Z/ y
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    ! H& e8 S: e3 I4 F) X( H5 w
    + ]7 k. B# w. v5 a0 x2 H结果' L" j7 b5 K1 ~- E5 u4 O/ X! x8 k

    : j" S, }7 g# E& T3 X' I
    ' z: Y5 `: u  }# B, }3 m结语, |/ H7 O! O# v7 E  |# E* \. y% H5 J- S5 r
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 e% C/ C. ?( G0 s4 D/ ^
    6 i9 B3 a" O/ \9 H! j
    补充
    / I7 y3 s' F9 F: `程序中d_{a}_{b}格式的变量表示a对b偏导# n. W4 ^+ S7 {
    ————————————————# c- Y) A" V+ t6 @; Q& `
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 G: m2 e6 x) _# K+ l0 s- e( X原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    0 f7 ]1 {) ]4 _8 L- P6 X# p, T- c$ W, j4 n( u- U, ^9 G' y

    . c4 N, m1 Z7 Y5 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-7-28 22:02 , Processed in 0.391754 second(s), 51 queries .

    回顶部