QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3100|回复: 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实现)
    5 p3 }: r% R% R1 U7 B6 h
    . s8 d( J% V% _5 @背景1 ]3 g2 h/ J1 f
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下& ]( V) g' A1 C! A

    1 s5 c# v- r3 J2 M4 S4 E【神经网络分类算法原理详解】
    + X$ l4 d3 f9 m' I5 J. S, a& G' J
    注意2 i# f. K- I  [1 U6 m1 ~  b
    站长提供的图片有点小问题,我们更正如下
    ! z$ ?3 Y( n7 @. ~0 s% ]
    ' `, r; M- ^6 P; S' U8 c% D8 v; t: P) z+ W2 J1 U

    3 t* R+ k* C& v: N) s问题9 d' l2 `7 X0 m$ u. \
    根据上图所示,我们有已知
    : y1 |( F# {5 M, {; g/ s6 |% Q$ m" ?+ B
    #输入层
    4 W1 C! F+ H" ei1=0.05
    4 f! _# x2 e* |i2=0.1. l9 f& c% U) W# ^) S
    5 _' T- K) }7 S
    #输出层7 g% u; h$ d! q/ n- N4 u3 b
    o1=0.01
    " H1 I2 l8 Z  D0 P, B" Po2=0.99. e* A6 j6 |3 _+ y% ]
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    7 |2 {$ \6 g# @) G/ c3 ?! K) B- f$ r3 _% z  \; h( i
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1  N8 m. x0 f! q! e- ~

    2 D! }0 r" G$ ^* O1 g神经元h2的输入  (hi2)=w3*i1+w4*i2+b1# z. P: p' {! V- c! g/ F$ r

    , G2 Q, |( J7 E0 _. W8 k+ ~6 y神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出4 u6 W3 k, ?7 M
    9 i. r* a2 k3 u: `
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)), L5 r' q+ u1 S/ m" y
    5 b+ R' P+ l$ B0 G- ]: e
    同理
    & H' W6 i1 }0 |4 v; l" L; Z+ A. }4 W' ~$ Y) ^" A% T0 I
    神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))! N5 f; @$ }  O) N( x! }' n6 a

    * N7 B: u4 e% D: ^1 b: b0 w5 M接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    % b. s8 O% M) _# `$ _! q, j+ f- e2 O
    : w; l% q5 m: q神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    0 l, X9 D2 a1 B) {# a# v% |  [
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2' o5 a  f; l# l5 e  O% K9 p; g
    & S8 x  @! L+ N) a
    再经过非线性变换Sigmoid函数得到
    0 o- p2 o; B* C2 e) N# Z2 W* G
    1 m1 t1 z- ?0 t+ D神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))- o9 _1 G- ^% A) _& h, Q

    / i* d) R. n" l+ r9 L3 Q神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
    " \6 Z1 ^. C- z$ J( @1 T
    ' M, }) N  x( B  J4 Q9 \6 d# I  v我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    8 |$ c2 }7 a. B8 c4 D9 G" N" Q) n2 D2 i3 d8 e. B0 B+ k2 E
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2' O6 k0 O3 k, w9 E6 [0 }
    , r" J+ ^! z( M& U1 E% w& n9 T
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足. ]- L$ r4 j' b4 l8 @) Q

    3 L7 n2 Z" l4 y. w6 c' u$ ~学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    5 W3 [0 S0 C  V  U$ l: i7 Z. X
      ]2 Z; ?2 c4 N$ {- ~学习率 (learning_rate 简写为 lr)我们设定为0.5
    5 V9 `) o5 q6 T& h
    / Z/ \+ m" t8 E* U! A3 R依次求解代求参数. V6 S" H  _* q! E1 m
    " W. n& W8 C8 a6 O( I
    w1~w8,以及b1,b2
    ) @+ m- |+ V  ]; h5 s' ~" \$ q& `* ~( D9 G2 e  g) Z( O
    跟
    0 G8 F, g( H' c; e$ `
    2 G) {/ n: }# E3 W. k8 ~( M( h损失值 (eo) 的偏导数. p5 X8 l8 A% U, H# M- p; z$ a2 ?! s) u
    6 B% j0 V; B/ }6 W/ H
    再更新该参数,更新公式为9 g; G+ |9 k2 f. n
    " X" c# W+ S: {4 f" m: ?$ ?0 W# f
    参数_new=参数-学习率*偏导(eo,参数)
    6 \1 H  y* w- K, A* v随后进入下一轮学习
    : ]! J5 f) z- z" [# w% T- R1 h, c4 r( I* T0 u5 X% [6 I
    终止条件(满足其中一个即可停止训练)
      ], A# r% n% K% j) ~/ p  g  a; a% N: z
    1.学习次数达到上限/ b8 @9 y$ N" s( h* P
    ! |" Q: ~+ U" i. t4 R! c! @
    2.损失值达到可容忍的范围1 u1 Y% l$ ^6 }/ L8 a$ }% b0 X; r
    + F3 P* D2 ?% x7 Y9 b2 @
    导数. f: H( O9 \$ B1 ]+ M" P. Q
    f(x)=1/(1+e^(-x))的导数是& f0 p4 |1 [, _0 @) X7 y
    f'(x)=f(x)*(1-f(x))
    4 K; g8 |8 S) s, K源码2 ]2 Z- q( }* J) m5 ]
    import math
    : g- \$ k( g* s4 N. H1 }8 S8 l5 |& Z7 b- n) E
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】! `- J7 k; [' i% p1 }! m
    #网址中图片有误,请看我博文上的图片
    ! B) T0 y1 e* M( b9 q* O$ F3 `5 ?+ F  X
    #输入层; U: c2 d5 u; u5 s) k1 D: ^  a+ {) o/ n1 f
    i1=0.05
    . t4 L  X# [3 b, ji2=0.1
    $ n  k2 T) T( u9 P/ t4 N#权值参数
    9 N$ G: r8 Y* o- h' Gw1=0.15* K0 K% D2 |' S& v7 P1 z
    w2=0.2; d& Z2 F! u: v, Y8 ^& g9 O) Y% u- f
    w3=0.259 p% w) E3 M6 o
    w4=0.3
    : S. X& D# T- p2 a4 Sw5=0.43 r2 K4 |) }( g. x. }
    w6=0.455 ?" k% ]# N: U, u
    w7=0.5
    6 s& F5 w' [) f3 c# E! ~3 Hw8=0.557 h+ i, n5 h) @
    #输出层标记(即期望值)) |4 T! ]) b* H! h- x1 H2 P! h! b
    o1=0.01
    3 p9 \& w: M; s! x& uo2=0.99
    % Q' S2 p- @7 X' P  E#偏置项参数
    # ]$ t8 X3 G5 z* Jb1=0.350 b' Z: `& `/ x- |1 W
    b2=0.6' b" Y# Z) q$ f6 X' b' N

    * k5 c5 Z' D+ t; [1 h' Y! m4 Z#学习率
    6 V! I$ T1 V! H! G# Xlr=0.5
    2 w6 i: I& ?: n/ W4 j  y#学习周期4 w0 x" g$ |, c' z
    lt=0  Y4 m' }' M0 Z* M, g
    max_lt=10000
    & A2 S: r7 ~  l! r#允许误差$ \' @. X  ]0 {
    eo_allow=1e-5
      D$ J4 q4 y. ]- t! T3 B3 M) k- A/ t3 `
    #线性转换
    ' q5 q8 F- b& r* b" y+ jdef linear(w_one,w_two,i_one,i_two,b):
    ; f3 |9 M- P3 e8 D3 z    return w_one*i_one+w_two*i_two+b, b; `; V" o9 c) z4 t. P
    #非线性转换
    ; o+ m* F4 E# b" Adef none_linear(i):
    8 g1 r0 G( `7 j9 [# K0 R. A/ Z    return 1.0/(1+math.exp(-i))
    2 \1 K' r5 C2 N4 I; u/ L# L3 a% V) ?" u5 X$ h- |
    print("训练开始")+ N4 x. x+ v2 ~" H1 q' N6 k3 p* v
    #学习周期结束前一直学习+ o- |% V* n4 n% {) ?
    while lt<max_lt:0 S) E# I7 K& U* O( v: H
        lt+=1+ @8 ?3 {1 l& {' E* q/ s6 Q7 c
        #求h1和h2输入值
    : W4 ?. b0 ]( l    hi1=linear(w1,w2,i1,i2,b1): ]( w8 Q5 j2 J- Y  I
        hi2=linear(w3,w4,i1,i2,b1)3 D' x3 b) }/ i" s3 ^- X& t
        #求h1和h2输出值
    & p" ^0 x% U: H8 N7 p* V2 w    ho1=none_linear(hi1)
    % m3 W; F1 d) Y) c9 D: s    ho2=none_linear(hi2)) Q6 f6 q: w* L; p5 y5 A; i
        #求o1和o2输入值1 O4 s6 _$ k# I8 F2 V+ z+ B# h
        oi1=linear(w5,w6,ho1,ho2,b2)+ b, S. j9 t( T& \$ H, b: Q4 T" Q
        oi2=linear(w7,w8,ho1,ho2,b2)
    ; [  d! H. L* R& x! V    #求o1和o2输出值
    ) F: j) j1 I5 ]+ R& |! Q1 u# m    oo1=none_linear(oi1)4 ?5 \' F1 Q" p$ O& f# I. T
        oo2=none_linear(oi2)
    0 |4 `  g, o, N: W1 W# Z
    8 Q  P$ j1 _: M0 C( S' M" T' w    #求当前计算总误差
    ; M9 a  A5 v/ d( e& U    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    - L* w' F- a" j% X9 l    print(f"第{lt}次训练,当前计算总误差={eo}")9 r1 S/ K' D: j3 V
        #误差已经在允许范围,退出训练# M9 \2 J% {$ L  v% V
        if eo<eo_allow:
    - E: e6 f! b9 B        print("误差已经在允许范围,训练结束\n")
    ' R7 b3 J  `1 y9 _9 ]# N        break
    % l6 l1 Q  M1 _8 M) i2 v    #偏导
    . @4 G4 e, ]9 O. Y# Q/ B    d_eo_oo1=oo1-o1. {8 w0 O- e. W9 e
        d_eo_oo2=oo2-o2
    ( \7 B$ F: t1 P; [    d_oo1_oi1=oo1*(1-oo1)
    8 J  r" D# j) P3 M% F( {5 T8 b! e    d_oo2_oi2=oo2*(1-oo2). f6 P& d  O" q
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    ( S* {2 O' D* z0 h    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    ) `) E9 c. f& l7 }- w! q% ^# c) k    #求w5_new
    ( H' p  d7 Q0 S    d_oi1_w5=ho1" a3 t+ e; o9 d* F& u
        d_eo_w5=d_eo_oi1*d_oi1_w5
      |' D6 L4 y' w    w5_new=w5-lr*d_eo_w57 E* |+ O' b. P& a* `
        #求w6_new
    ; T$ r( ^* q# [* `7 s% E    d_oi1_w6=ho2; c1 }+ v- U$ V1 p
        d_eo_w6=d_eo_oi1*d_oi1_w6
    . W2 H" V) Z* K6 G9 k' K7 h* u' w7 J    w6_new=w6-lr*d_eo_w6
    ! H& B) K# o8 `0 E( r    #求w7_new
    2 v  y* |1 y6 X- U% h    d_oi2_w7=ho1. t+ V- r3 I% ^, q0 ~; F
        d_eo_w7=d_eo_oi2*d_oi2_w74 c& \- r, q9 ?& }; y. Y
        w7_new=w7-lr*d_eo_w7& Q5 _( Q% M) K: t5 h
        #求w8_new
    ) ~" r0 Z/ ?. @) e8 t( u" Z    d_oi2_w8=ho2
    0 e" X0 E+ @; M3 t    d_eo_w8=d_eo_oi2*d_oi2_w8
    # i, d0 J7 m; U1 Y. L4 w    w8_new=w8-lr*d_eo_w8
    0 |6 |* v9 B3 c0 N0 R: z    #求b2_new
    ( p" E  }1 ^. o    d_oi1_b2=17 q- f+ U% ]" ]
        d_oi2_b2=1& \; x3 H; r- s/ D
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b27 L( r7 z( ^5 l0 t) S
        b2_new=b2-lr*d_eo_b2
    0 `  X( l& U5 A7 e    d_oi1_ho1=w5
    + Y$ t1 _0 ^) D3 M& ^# r    d_oi1_ho2=w6( h3 Y( [+ u' A3 r& n. G
        d_oi2_ho1=w7
    $ J9 L: y+ H5 u& j  w. |    d_oi2_ho2=w8( C1 w3 o: \& y# x$ U. s  y) _
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho12 z* m$ @, \( `/ H" O& X
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho28 l1 n% v; b" e2 }5 B! p9 \+ o1 T5 K
        d_ho1_hi1=ho1*(1-ho1)
    1 t1 K) E3 }; [1 ?% F/ U3 }# U9 A  z    d_ho2_hi2=ho2*(1-ho2)
    $ w  V4 j' [5 b5 X    d_eo_hi1=d_eo_ho1*d_ho1_hi1
    ) g" E& u3 Z/ d- |; l7 a    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    % R( I, `4 i5 @% `1 B( p% f    #求w1_new
    * x. ?* N; q; J3 e8 y3 u    d_hi1_w1=i1
    1 r4 H; x+ V) \6 b& v/ w+ n/ y    d_eo_w1=d_eo_hi1*d_hi1_w1+ k) B- O; y% D+ g* Q8 t. n
        w1_new=w1-lr*d_eo_w10 h7 u% p& A9 |1 d7 S  e. L
        #求w2_new
    / x8 ]& \& o) w    d_hi1_w2=i2
    # m# {  H% g, n5 u  P    d_eo_w2=d_eo_hi1*d_hi1_w2. t; p( e. L' R3 x% s) `" o/ O
        w2_new=w2-lr*d_eo_w2
    . n# h, X" X) W& U/ \( N3 ?* z    #求w3_new
    : `6 j7 \& u8 d+ g; e6 t    d_hi2_w3=i1
    1 G) ^: @: b* p) U    d_eo_w3=d_eo_hi2*d_hi2_w3$ x# j/ C! U; O7 U8 G
        w3_new=w3-lr*d_eo_w35 ^) C; J! q, S- k. Q1 Y3 h+ _
        #求w4_new2 U9 e5 n' W% Z: ]/ i
        d_hi2_w4=i2
      c- [, K' Q: K    d_eo_w4=d_eo_hi2*d_hi2_w4
    , ~3 ^9 A  ~5 z* q/ ]( P    w4_new=w4-lr*d_eo_w47 {" Z8 e3 S) _- O, E5 e; p, J
        #求b1_new
    # U5 X" I; `2 j1 G+ Q% f    d_hi1_b1=1
    6 U1 Q# R. o( s4 }    d_hi2_b1=1
    # n' R4 S/ m* ~7 {3 f    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b15 J5 B6 ]4 a' l) \
        b1_new=b1-lr*d_eo_b10 c8 U$ N! p' O- o, [! t$ t
        #更新反向传播
    2 S5 \/ C! ?$ w" x* [2 k6 X    w1=w1_new
      |/ }, [$ j' R5 C4 Z    w2=w2_new9 B) R( V# [8 ^1 ^
        w3=w3_new9 I/ o+ k" b* a: N
        w4=w4_new
    6 R/ O  }* s" J& ^  O    b1=b1_new; x# A2 S% P  t/ w4 q, G
        w5=w5_new5 d  ^6 Z) _% n! ]
        w6=w6_new# m) d! r4 G/ l/ i7 S/ h
        w7=w7_new& W2 I7 {9 w% V! {1 s3 o; ]
        w8=w8_new
    0 f: H5 Z3 q1 t8 }    b2=b2_new5 t8 \& J, ^& {0 c& u9 v, z7 f7 n+ l
    print(f"当前计算总误差={eo}")! G, u8 i, T( D3 E0 P* u0 a- _8 ]
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    9 |% L8 E+ s8 q- Mprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    4 E' p# D: @( j' l- n4 f. n7 _9 E' zprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")# ^, I; Y' t. w* }9 M

    ) I7 {. O3 R% J9 N8 A8 w结果
    ' ?, ?( L( d( R( d; t# a5 t; a* T" [9 Q: f

    ! U1 F- s& ~2 {1 r结语0 r) _* q9 O# w* i: [
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。7 z& o$ B# C8 ~
    $ i& [8 A9 Z2 S0 W. t, }
    补充
    % N9 K8 V- U! h- W+ m; f& v  [2 M4 W程序中d_{a}_{b}格式的变量表示a对b偏导
    * M3 P& ^; q2 g/ l! Q" G————————————————# y: W  v' B$ u1 E4 k9 D( a
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    7 d6 v3 Z- B1 r, o# B, v# n原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679542 B! `* |- O* Z, ?0 O
    $ x; w) D4 v* }" T4 L( {" v6 I

    0 d( G5 Q- ]  ?$ ^( o' F! S+ \
    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-8 08:09 , Processed in 2.610886 second(s), 50 queries .

    回顶部