QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3060|回复: 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实现)  }' @, N2 a% |0 s$ R
    6 U, M" r- y' f. g
    背景6 y( s" i, G- o
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下5 J5 x1 W* e; I. Z0 S
    7 C1 T5 X* ]* N% A4 {+ Z
    【神经网络分类算法原理详解】
    ; ]2 _& _5 k: C, m8 \" \. N7 X5 C- o4 Z, M  u. l( a) ~' Z
    注意8 [# f! t$ D" {
    站长提供的图片有点小问题,我们更正如下
    8 I" W/ k5 H# K' l) ^* v/ S
    6 b& i. ~1 k; U9 [4 F" Y2 j  i4 T

    & S) V+ O1 Y1 f" n: Q问题
    $ e/ |$ O: k* p5 B% g根据上图所示,我们有已知  g) @0 ]  \: P; ?1 F1 ^! ?
    ! l% c3 i5 X! Z# E
    #输入层
    5 J* b9 E* {1 Hi1=0.05
    % @3 k0 U: ~' H# Z  B/ R6 Ai2=0.1
    - t2 m/ \; g4 C8 l3 Z1 z4 T" d
    # y1 L- E' i+ g1 l0 M8 }#输出层/ @; A5 \2 a2 e$ U, K
    o1=0.010 X6 D, ]6 I* h- E* V
    o2=0.99
    7 m4 K" E- w' a; c这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的  U' W! Z4 `, n

    # @" Q; ~: P" t/ ?0 H7 I2 w神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
    6 B5 M* N3 P7 I/ k1 U0 S" {- E& J5 O9 x7 f! h# G) C* ^- s2 \
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b14 E; X- y) g% W- {

    5 y. I1 S( C2 A2 N神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
    ( Y2 Q$ m( V6 W; i/ O* Y) ~
    ) L2 k  i  U; Y, W4 d神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    - H+ ]2 R9 f% F. @5 b* }& I# }8 a1 W! s) t6 t  I
    同理
    - \$ Y+ z  D' P  l7 d
      C# Z) |' d$ ~. L: X4 k( U神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
    - @* E5 ?( I! ~2 u5 I$ N
    ) R/ o7 G+ j5 W5 w接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    , D+ W% z2 j8 f. p+ E: d* b2 L7 o  h% `: g- Z9 J
    神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2% ~" Y6 v# ^9 J1 V3 ~4 E
    . x4 d9 m+ b4 v8 \" C4 |
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2* u3 W& |! y+ C6 X1 E1 ]$ C( r1 C

    ' J! L8 c4 t. z+ U6 O再经过非线性变换Sigmoid函数得到
    4 C" c2 N2 `: {% a! P/ A: Z% S: W( a0 w' D7 D% x4 O" e
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))0 o1 L3 }( `" ?

    : N; q* Z4 z6 n% R* n$ X7 C3 W神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    0 b4 c- {- }# B, v' n' }$ [3 k7 v  `: ?
    我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为* w9 k4 g5 ^2 W8 u* `
    ' i/ q  p- J5 D
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    - J+ q* E% c$ [9 G; N+ p$ j
    $ T; }0 `+ j4 l6 l* G! l由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足; f. h/ Y! A4 }. l8 X5 i; g
    6 t( B! a  @  H+ o+ L
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
      u* e& ?- X' ?1 S" r# D3 d  M! W1 e- u
    学习率 (learning_rate 简写为 lr)我们设定为0.5( ]$ L. L1 R0 ~. x9 o
    1 y3 s# U2 B! ^+ @, I& d3 [
    依次求解代求参数  `9 }7 l$ i2 e0 O7 s

    / @- p" U8 M+ U: q* n* dw1~w8,以及b1,b2
    5 w- |, I! M. |" n  t: n9 s( c
    + n# H$ G: r+ @; O
      o. N9 j8 M# L1 |3 B& |, A
    损失值 (eo) 的偏导数
    # E/ Z# `7 e( [1 \' U( Q" s! A7 m! f* ?, k* m  A/ x$ j
    再更新该参数,更新公式为+ Y5 I% a  S) D; B! E4 {+ b

    0 j$ R1 Z( T9 N: a% }3 X6 X; g参数_new=参数-学习率*偏导(eo,参数)7 k9 S3 u! r9 t6 k  e$ |5 l2 X$ ^
    随后进入下一轮学习' @% ^: W  E9 A$ |+ M) d4 R
    5 L  t3 P9 ~& V4 W/ {+ K8 C! F  c" _& s
    终止条件(满足其中一个即可停止训练)
    % `8 q) l4 w* I; _% k, T) W' x9 b" P( v
    1.学习次数达到上限
    / o2 C3 L: u. Y+ m* \$ K
    , e0 m' o& N0 R8 u+ R& _) D; Y2 |3 t2.损失值达到可容忍的范围
    ' ]2 t! c# x) ^. q3 `3 a& K+ D
    : f. v& C8 @* v0 p导数! v. W: n; e& `4 C3 q( \7 T. g
    f(x)=1/(1+e^(-x))的导数是
      \# ?2 m  i" v. Af'(x)=f(x)*(1-f(x))
    - Y- X' W! q8 k! A* f) W4 @源码, q* p, _; o( m3 S9 X' x* o
    import math
    . J/ f1 [" `+ Y4 w7 Q4 i! K" |7 h! Y4 o# o" V
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
    1 ~( n3 [) p0 p; B#网址中图片有误,请看我博文上的图片. H8 o' L* s( K1 x
    ( h& u$ _' w! \0 b0 K+ W( b2 U% D
    #输入层% z- A2 Y4 h6 E5 n. J, Q# i
    i1=0.05
    ' u8 k& ]; n8 I7 k" k5 Qi2=0.10 _. |: {/ s9 F" L5 b$ l( x
    #权值参数7 f9 r/ k1 y. `" w
    w1=0.154 j8 \, w5 _& p
    w2=0.2
      w) g6 }4 e0 B+ s. aw3=0.250 B8 _/ q2 z5 D* K5 [! n9 @% w. z
    w4=0.3
    1 K( ^2 g) d+ Q' v+ Pw5=0.4* I1 t0 f8 z; v% P
    w6=0.45
    / a& l4 N3 K8 Iw7=0.5
    " J3 \8 k0 P$ n+ S" a% W7 Aw8=0.555 L0 v& o6 D) _& E
    #输出层标记(即期望值)  J4 K5 r  c+ b
    o1=0.013 w% x2 _- {' f4 b7 P  l# }! j
    o2=0.99  C) V. y2 `! v9 t3 w
    #偏置项参数7 T$ ]- L0 p) M  f: F) m. I
    b1=0.355 W' ~# _* i# O% J5 b( h
    b2=0.6
    ! ?3 Z- C. f0 S4 W+ e; y; r5 p6 ^; I7 w/ J* G/ o( b, `1 |* E
    #学习率
    5 J- A2 R' m4 E3 f& q+ Y: o+ L9 Klr=0.5
    * _; {* ~6 a1 \. T6 j6 z#学习周期
    ( ^. y/ w/ o0 [! tlt=08 s7 O  D. t# [. Q4 ]1 O
    max_lt=10000
    , V$ N4 Q6 |' @& T9 p9 B#允许误差
    5 l/ f* i$ |  I- n. w* aeo_allow=1e-5
    / z& b" Z: c1 O) z" [" \- ^- D' @! A6 Y# ?; w
    #线性转换
    1 Z/ I: C" U* Hdef linear(w_one,w_two,i_one,i_two,b):5 @- T  B  o9 }) O/ n& A9 s
        return w_one*i_one+w_two*i_two+b4 e) D1 x: k) _. f2 u8 o
    #非线性转换
    * X% R  s# Z6 }4 ddef none_linear(i):$ _9 _7 P9 z: A, q& x
        return 1.0/(1+math.exp(-i))
    2 f; U# \3 L8 F+ }+ C' |: e) }* {' W0 I0 i9 e, S6 z- E; e
    print("训练开始")
    , I' F( q* @  L. P# \#学习周期结束前一直学习
    ! t; g3 \9 t- T6 R- |& [while lt<max_lt:2 k8 ^9 F$ T0 w5 C/ T* O
        lt+=1
    + b2 A. m0 U  V9 S! S    #求h1和h2输入值
    2 P8 E( `; l4 C2 \8 N    hi1=linear(w1,w2,i1,i2,b1)
    8 F! k7 V2 u% q3 ~3 }, H! R    hi2=linear(w3,w4,i1,i2,b1)  o# w* m5 G: H
        #求h1和h2输出值, M" _& m! W: z4 b4 L% \4 A* k
        ho1=none_linear(hi1)
    % w9 {' p+ }8 m2 @, A) f& _    ho2=none_linear(hi2)
    ) [! Q! v6 s1 g: v    #求o1和o2输入值( W; R; |0 F8 {$ `, e
        oi1=linear(w5,w6,ho1,ho2,b2)' C5 y- Y# l8 ~1 |- b4 X( T
        oi2=linear(w7,w8,ho1,ho2,b2)
    : I# P: l1 a/ p" b+ g& N    #求o1和o2输出值2 [. E1 a3 f; C' U; ]2 [. e: r
        oo1=none_linear(oi1)9 f1 ^5 Z* U7 p2 w& j
        oo2=none_linear(oi2)
    ( }/ B) E, i3 _2 F5 C
    ) \3 y# @, Y0 Y' ]. _    #求当前计算总误差: b2 i7 w! D1 R# u; T) d& u6 y
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    2 Z0 m) T, w6 C2 }4 p    print(f"第{lt}次训练,当前计算总误差={eo}")
    0 T5 }) l' U8 Y1 z  E# S4 J    #误差已经在允许范围,退出训练. p- `; W0 q8 L9 L& T# {
        if eo<eo_allow:5 `; k: ]2 c+ g7 f( {* V4 g$ b& v
            print("误差已经在允许范围,训练结束\n")3 k$ x2 F8 |& D' e& v9 K- \0 ?; E
            break/ [. ?3 j) b8 ^' |' S8 l/ j
        #偏导
    3 U" ]' I8 ~2 y6 b4 M1 a( X  q    d_eo_oo1=oo1-o1
    + G/ E7 D" \. j& i# ^3 g    d_eo_oo2=oo2-o2
    " o2 d* H# d% w; I    d_oo1_oi1=oo1*(1-oo1)+ y; t5 F/ T# D/ o2 z) x
        d_oo2_oi2=oo2*(1-oo2)
    : z5 t- {$ s5 r4 B% d6 c6 l    d_eo_oi1=d_eo_oo1*d_oo1_oi1: t, s! r" C' G7 m
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    - d8 @+ Q: j8 C    #求w5_new
    ) }) s1 [0 Z9 [3 I. W    d_oi1_w5=ho1
    2 Q$ F) `( c$ W; q7 {/ _( X: O    d_eo_w5=d_eo_oi1*d_oi1_w5
    . z! [7 h, \6 o! S    w5_new=w5-lr*d_eo_w58 f' C; b2 Z, k9 a7 c3 T. }
        #求w6_new
    ; }5 |9 G, T* j# J3 m( V6 g    d_oi1_w6=ho2
    / S1 J" g1 x+ ]6 j    d_eo_w6=d_eo_oi1*d_oi1_w6
    6 l6 T& \3 r) R1 U" H7 `/ @; `7 s    w6_new=w6-lr*d_eo_w6! I* D/ C4 @6 n0 `
        #求w7_new
    ; q4 I3 L3 g( F- }6 m, a$ ~0 ]    d_oi2_w7=ho1
    ( f8 z1 {3 V# T' Z# X" V    d_eo_w7=d_eo_oi2*d_oi2_w75 ?- C3 u4 c1 f1 c5 [
        w7_new=w7-lr*d_eo_w76 A0 S& d1 H4 B, s% |% M
        #求w8_new
    5 w+ ?# _, A$ k    d_oi2_w8=ho2
    0 p8 ]: U! |. J: A" y/ n    d_eo_w8=d_eo_oi2*d_oi2_w8
    7 ?. F4 i9 r4 {    w8_new=w8-lr*d_eo_w8
    * b6 P% W; u: q' F* O    #求b2_new, r' `$ Q& r' p4 z0 X$ }
        d_oi1_b2=15 ^; _7 r' K. K
        d_oi2_b2=17 ?0 n+ l9 C7 @$ p3 I* D- M& Y3 l9 o
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2- J' k* o( [6 k
        b2_new=b2-lr*d_eo_b2
    7 J* j8 K$ [7 |5 {, S: D$ f    d_oi1_ho1=w53 I( \; {/ M; c
        d_oi1_ho2=w66 j+ y  J- K/ K
        d_oi2_ho1=w7
    9 C) e/ |7 V5 X; Z    d_oi2_ho2=w8
    $ O; E6 Z; I/ x/ B- z+ U6 d4 ~    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
    6 ^) M1 Y" K3 [& V* [    d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2* H, y2 d1 ]( ^: \% `5 G
        d_ho1_hi1=ho1*(1-ho1)5 I- p0 r+ s# b6 X& L
        d_ho2_hi2=ho2*(1-ho2)
    # u# O) j& E5 @4 n5 _    d_eo_hi1=d_eo_ho1*d_ho1_hi1
    # {' p( B" l. y, @" U9 ?$ Q/ {6 o# x    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    3 R6 c' ^/ d' z. O% C! {    #求w1_new! E, j% `, j/ ~7 U+ z
        d_hi1_w1=i1- l  r; r$ n* U8 ^3 x4 V" }
        d_eo_w1=d_eo_hi1*d_hi1_w1( x7 e# @$ J# n
        w1_new=w1-lr*d_eo_w1
    ! W! C- ~& N! N2 n) V! c+ W    #求w2_new
      q  v9 g" r# H" C; q0 h    d_hi1_w2=i2
    0 x! R7 }' H/ F  z1 T    d_eo_w2=d_eo_hi1*d_hi1_w2( ~; V  y; R+ d9 g& X9 y5 E' s
        w2_new=w2-lr*d_eo_w2) L6 H! {. f9 a$ L/ i. L- X
        #求w3_new
    , p' g6 X! A( m    d_hi2_w3=i1
    ! x* `$ @. Q" A" j' M% u    d_eo_w3=d_eo_hi2*d_hi2_w3
    0 r( M+ u7 K# c9 Q0 \' s- Z    w3_new=w3-lr*d_eo_w3
    : p+ c- n9 d! c1 @* h    #求w4_new7 G8 X1 Z. d$ v( B% a
        d_hi2_w4=i2
    3 V; Y  Y9 M: c- C6 P- y    d_eo_w4=d_eo_hi2*d_hi2_w4+ g2 U3 y, K0 S
        w4_new=w4-lr*d_eo_w4
    5 A: D, q3 w2 ?+ |5 f    #求b1_new( t! p7 T. }4 r* k/ G
        d_hi1_b1=18 v4 G2 r/ q$ h+ s( _- h. A6 [2 w
        d_hi2_b1=16 |% ^$ z. A) S( e% n/ }$ c1 c
        d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    + {% u* j/ Q5 w' H; K    b1_new=b1-lr*d_eo_b1
    ! I  `1 O% M5 S2 N    #更新反向传播& J( c1 q* ]+ D. w  K; x: S' l
        w1=w1_new
    ; i! \$ P7 Q2 R  _    w2=w2_new% D0 O% w+ N4 ~# h6 C
        w3=w3_new
    % m$ i9 s) p8 S. H    w4=w4_new
    8 a; D' O1 |0 P" X1 y    b1=b1_new
    6 M7 A, Y+ |/ ~    w5=w5_new' T; `# f* w( C
        w6=w6_new( a4 [; n- s+ [# q  \8 o* Q2 L
        w7=w7_new
    + V% J! j# G0 _9 U. z    w8=w8_new
    6 q( [' _5 R  H& O9 U    b2=b2_new
      d, q) H4 d# A! J6 iprint(f"当前计算总误差={eo}")% r8 ]% N* E! |- v. h# Q
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    9 D  w" p5 p$ Sprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")4 v9 E; `0 ]  n4 F8 p/ h
    print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    9 d9 O# j. `& {+ H4 W9 @; U
    6 g  ~8 g  W) K" j5 }" X3 ~结果
    ' |; B1 i) L/ e' l; @8 G+ G7 k9 V1 Y4 k3 [
    9 v, I- t/ l, h$ f/ J9 |$ X
    结语% O; v: m  H7 {% u7 [8 @
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    + v. z( {) y7 ~, i( T3 O4 y4 M' ?8 D  I' Q# _
    补充
    & y6 R- B0 {- D, j5 h' ]% g* Z程序中d_{a}_{b}格式的变量表示a对b偏导
    3 C1 P- k9 \: w$ C. M+ t————————————————. M: r' N5 H( l8 k, P
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 T2 C2 l0 a6 G! I3 T  c原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954. ?% I" `2 `, g) V

    * i, e: F9 L. w* U! x" I2 t
    ; N8 H. p/ Z5 Y3 G" d" c% h
    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-8-1 05:58 , Processed in 0.406983 second(s), 51 queries .

    回顶部