QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3003|回复: 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实现)
    4 o% ^# p: {4 L3 s% \$ d, V! M3 F
    背景, q) p# O% f5 P# ~
    初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下* f* B' W. n$ R' n/ k& ~( r' e
    & {( d# [9 }' v4 [% A
    【神经网络分类算法原理详解】% j6 t: r* C$ L2 f* f
    2 W, V8 `4 B# e7 I
    注意
    8 v2 ]: C2 D* R' }' ^9 L站长提供的图片有点小问题,我们更正如下
    ' Z+ H% i0 c8 n; Z
    9 D% T  h: J" q' g( K  Z  j
    8 Q9 U/ }. T' I+ ~6 ^3 ^2 }  Y8 v8 K: z) X0 M/ h$ z
    问题
    7 w( B4 h" z" g$ Y根据上图所示,我们有已知
    ! ~$ w+ j1 C- G  y
    : K# E* p" s! O3 V" A9 u7 S; x4 V#输入层
    " J+ @# [* {/ [i1=0.05  d( a/ ~; O+ D) b& n4 s2 L
    i2=0.1
    7 h% X: ]( g; M2 F
    - N* F. T! H# |8 {9 W8 W3 _#输出层
    + A* r9 F. ?8 d+ X2 }o1=0.018 s7 ]9 [/ `- O  I
    o2=0.990 C8 j. ^, M9 ^* e% f
    这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的3 ~# H5 }: }# N) w3 r
    * d4 v. `2 I  z
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b15 d; B. o* z% g5 ~- k+ z
    ! U6 }% N, p% n) G/ {# y: `4 x& n
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1
    % w0 k) p1 U$ |/ ?" [
    7 D1 E3 F6 R/ {$ L/ S9 f: e. a( V神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出+ h# r7 R2 ~# V/ f5 R  r4 g
      C4 }4 D0 Z1 B- w8 I* {1 W3 C- z9 d
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    3 E2 H! e' Q% M' n& j$ X9 B( \* s! O  x1 v, r- M: H0 O
    同理
    + H' F% W$ n6 l' N1 n6 `) @
    2 ~1 |* @7 [1 D0 h神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)): ?- h4 P$ M" U3 m3 D2 d
    - R: b0 Y; I9 h5 L  c
    接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
    9 S& A# P6 ~/ E- v6 j- A5 S& ?
      q5 j+ q' ~4 W( U; D神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2" w4 j1 h6 S) Y$ X+ U  S+ {0 p  M
    2 d8 r0 x- e! z+ y- {" t0 ?
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2: r7 @4 j- u7 V+ s9 N' E& R: f' ~- D! G

    " j) J) N) S6 G, K& q) S再经过非线性变换Sigmoid函数得到3 ^7 l1 T- M! R) J/ W; c
    . o3 G5 @2 C6 ]9 v# w& i
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    # |# H) B: y" O% L; v- A  H( T" V# P, Z1 M( P6 n, f
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2)). y& r1 F" w; R2 R% q* ?5 {

    2 J0 l. I* P  N  Q我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    7 Z. n9 h, v: j6 L: d! T  w+ x! k9 R6 c# Y% N" H
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2+ q8 ~, e3 Q9 t/ L

    1 G" _5 _1 A/ l' w; t由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
    ' x* y+ N- W3 Y4 ~3 [2 f# E
    ( y8 T5 [# b) g% S0 V( {+ X3 {1 X学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    + J+ G9 }8 }9 d/ W" p4 V  `- I4 C) W/ T5 W6 D" b4 |
    学习率 (learning_rate 简写为 lr)我们设定为0.5
    # A; U$ y. ~3 O% M
    : w! G% n; w4 N依次求解代求参数
    1 s! ~( p; |6 L: ~# {% i# X, a
    6 B$ n; K' \& d5 \  `w1~w8,以及b1,b2
    * f( j6 N. h; C( _( D' p$ R" H7 H
    8 g: Z; ~/ X4 M. K1 C3 \
    * R+ @7 f6 `/ A# _0 S2 F) f6 u  y4 |2 K( G7 K
    损失值 (eo) 的偏导数
    - L& B" B) G& q! s; [
    4 C( K0 h2 r/ E' {' E( ^) a/ H% V# j再更新该参数,更新公式为
    1 H7 e+ b& c& }" E
    0 N2 L+ p2 o6 ~2 h1 v参数_new=参数-学习率*偏导(eo,参数)2 E/ x8 O8 X  E; p; K: d5 Q3 E% X
    随后进入下一轮学习  y' \" h0 g3 m) f, C% h: S

    , U* J3 w8 r1 i; g8 @  F- }0 l终止条件(满足其中一个即可停止训练)3 R$ x. B* E1 s
      g% J$ a1 l8 s+ D7 W# D7 |6 ?
    1.学习次数达到上限6 V8 O  e; ]" m1 F( c

    / H# K/ \) [. t; J4 Y6 ^* S: N1 @. H2.损失值达到可容忍的范围
    2 m# n0 L+ p8 ^. E3 A5 p8 g( S, H; T" v6 B
    导数
    2 l$ A6 }+ g1 Y% b- h2 o% m- }f(x)=1/(1+e^(-x))的导数是
    & m$ O8 Z) ~6 if'(x)=f(x)*(1-f(x))
    " l. x- Z6 j' T9 ?源码/ T' p1 r, O4 r% i  h
    import math' e0 `9 }1 [- [- Y% f1 r! R
    . u' K& c  I+ `( R
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】2 g7 o5 S& @, ?) B
    #网址中图片有误,请看我博文上的图片
    ; B- e( x' ?8 a  C, F% }
    - e8 H0 G- ]9 I, }#输入层# o. B& h4 a# a( g
    i1=0.05  w% B% e9 F- D' l& D
    i2=0.15 V* S# {) U8 |# I- d$ E  a6 D4 X
    #权值参数
    7 Y  X8 {% v7 K0 yw1=0.15
    & g( h3 M  k+ P8 x8 \* {( ?w2=0.2
    / Q( p) L( M! Z+ B: z1 vw3=0.251 N1 d' v& y) c% O
    w4=0.3
    " v8 i- t- V+ ]2 Q$ ~0 H. T/ q) Kw5=0.4
    ( N( e8 O# C5 M. b; t! ^! Cw6=0.45
    / K8 V) m5 \5 |4 m0 {2 Lw7=0.5
    1 H$ q8 |, l3 Iw8=0.55
    1 p6 ^; C+ |& x5 }#输出层标记(即期望值)$ `0 l* h% ?8 I( I* u
    o1=0.01, }, e/ C) K5 q" c7 F3 {
    o2=0.99
    & F: ~9 O0 v" J3 ^: x3 H7 G#偏置项参数
    4 [1 k% q- M" K2 p) Z7 [b1=0.35; q+ b3 O, v- _' c5 m
    b2=0.6( X4 m4 N  Y% `: N0 k; m1 _

    6 f6 Z1 R5 d) w3 y#学习率6 J& m- d; k+ t2 ?# _/ [
    lr=0.5
    : e/ _5 N! l% M/ |#学习周期
    4 y9 L0 \. F  A8 llt=0
    & g5 U) Q+ G  v; cmax_lt=10000
    & K. Q: A# q, L8 P2 W#允许误差
    ( M/ i% x$ y" g& ^5 I! [' Z3 Xeo_allow=1e-5
    " V- x6 C& e3 u9 ]9 u7 _1 _0 L4 k  T1 E- R3 q
    #线性转换, _7 w9 i) @- O" f! y( s! l
    def linear(w_one,w_two,i_one,i_two,b):* [6 X9 L7 b% h# ]; D
        return w_one*i_one+w_two*i_two+b
    3 V" y3 ?- g; z# k% y# d! N#非线性转换" F0 f/ j7 }6 R# e9 p" M
    def none_linear(i):
    ! ?1 h' }% h: H, \. j6 j0 y& ]/ Y    return 1.0/(1+math.exp(-i))
    * K+ z. |8 ]9 q4 g7 t1 Q+ `9 P6 `% m/ y7 d4 f
    print("训练开始")" {9 q; e2 Z: i) p
    #学习周期结束前一直学习1 w+ u' ^% X! }- f0 D$ G0 P
    while lt<max_lt:7 m$ E( G2 F! f, B4 D
        lt+=1
    % z" w% S$ Z( ]  z    #求h1和h2输入值; _- ^) g1 @2 H2 F+ y  l
        hi1=linear(w1,w2,i1,i2,b1); L$ z3 M) _9 U  D
        hi2=linear(w3,w4,i1,i2,b1)- n% Q$ C/ M  K/ ^( s% G
        #求h1和h2输出值
    0 Q* C5 T9 z+ T0 ~# A0 `0 ?    ho1=none_linear(hi1)9 `; h. Z9 t' s- g# T) p
        ho2=none_linear(hi2)
    : `) r' d$ L- C2 ~- ~$ A+ \6 _    #求o1和o2输入值! L4 k) A9 D% ?- N( ^! }1 q5 l
        oi1=linear(w5,w6,ho1,ho2,b2)
    4 _- \/ V- U' y6 @& a2 I, T; w    oi2=linear(w7,w8,ho1,ho2,b2)
    4 a9 v* o4 H: C5 ]# ^( \    #求o1和o2输出值( k5 {( r! `, e) k( m3 C6 Z' Q
        oo1=none_linear(oi1)
    0 d- h( S" J" {/ Z) Q    oo2=none_linear(oi2)1 s4 m9 E: Q1 E) }# W3 i- M6 C
    - O( y6 a' u6 q: b) j: v8 s# y
        #求当前计算总误差
    ' V9 j# v/ D3 ~8 n. G/ w+ R- H    eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2: H5 H* I) p/ ^
        print(f"第{lt}次训练,当前计算总误差={eo}")
    4 t. }# [, @) H: y    #误差已经在允许范围,退出训练
    " ?  g/ C; {! K6 ~    if eo<eo_allow:
    # X$ H5 V3 v1 Z* p# G        print("误差已经在允许范围,训练结束\n")
    8 b7 N( [6 E: A1 P. g# A6 w        break# N- h* r/ X5 R2 C. }
        #偏导) N/ e1 ~# X( R
        d_eo_oo1=oo1-o1
    4 [& G' k( h7 y5 n; i4 P# ~    d_eo_oo2=oo2-o2( \6 P. g, b3 r- M
        d_oo1_oi1=oo1*(1-oo1)4 u( }3 o' N) L! h
        d_oo2_oi2=oo2*(1-oo2)4 A( h. T5 s' P$ F( V! N& e
        d_eo_oi1=d_eo_oo1*d_oo1_oi1
    , w6 W. v" p$ }    d_eo_oi2=d_eo_oo2*d_oo2_oi2
    4 n# m9 L/ L' b' Y' U    #求w5_new
    # R. _1 ?7 P0 z( L* P; c    d_oi1_w5=ho1
      ^& Y) O, C1 ^* t- n    d_eo_w5=d_eo_oi1*d_oi1_w5* ^$ X9 L$ t- K4 `
        w5_new=w5-lr*d_eo_w5) Y# ]# a# Y. Q$ ?' ~& T* M! N1 Y
        #求w6_new! O" B- k& x0 U; S
        d_oi1_w6=ho21 Z7 E, d* L$ h  S
        d_eo_w6=d_eo_oi1*d_oi1_w67 ?: |* @& \# B
        w6_new=w6-lr*d_eo_w6) o% o! M2 C( p: X4 `
        #求w7_new
    5 q+ Q3 g3 x. \9 H0 Y    d_oi2_w7=ho1
    * l1 f1 J( @: P5 P! p    d_eo_w7=d_eo_oi2*d_oi2_w78 k  Z% @" z: ~, A, e: L, a
        w7_new=w7-lr*d_eo_w7
    * w/ R. `. T6 L  n1 A; O8 Q( F    #求w8_new* p- g& ~  ]1 A+ a1 a
        d_oi2_w8=ho2
      J& V: s( j: O3 `8 U, B& V# K# t$ o+ l! w    d_eo_w8=d_eo_oi2*d_oi2_w8! U. n' z5 A0 Z0 M" D& y
        w8_new=w8-lr*d_eo_w82 u6 j# o3 e3 z3 O6 i
        #求b2_new+ Q" `, u- R" o5 z" R+ M
        d_oi1_b2=1
    1 }8 R$ j/ k) u% J    d_oi2_b2=1
    ! V& f" M2 A9 U, _8 I    d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b24 w) s7 J& a) S
        b2_new=b2-lr*d_eo_b2: s- j1 w' }7 \' o8 S( t+ Z
        d_oi1_ho1=w58 M) M. ]8 e" r7 Z1 x% U! O( t# Y
        d_oi1_ho2=w6( _/ H* c; {. Z+ w7 x
        d_oi2_ho1=w7, [( B5 s! d1 |" R
        d_oi2_ho2=w86 J3 ~8 W# `' |/ H
        d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1* [1 p6 e; V2 C! ]! V" x
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2* T4 Y' `5 Y$ M. n8 W7 d8 \
        d_ho1_hi1=ho1*(1-ho1)
    6 K; _* F$ G! z8 \+ a3 p8 @. l    d_ho2_hi2=ho2*(1-ho2)
    & q* I1 y) N6 |: s# {    d_eo_hi1=d_eo_ho1*d_ho1_hi1
    # s4 w# B8 R$ e- _7 y    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    " c2 Y2 U# v) u% A' I* u    #求w1_new
    - N7 m) G, e+ D% h7 @1 Z& p. S    d_hi1_w1=i1
    5 C1 G. d! x7 o6 W- W! G    d_eo_w1=d_eo_hi1*d_hi1_w14 o& T5 v/ Z4 z3 \: n. n- H
        w1_new=w1-lr*d_eo_w1
    * L6 h, r. s& X6 E    #求w2_new
    3 z6 j4 P3 X! Q% [    d_hi1_w2=i27 }) q2 |. a$ M3 ^8 X6 c3 _+ j
        d_eo_w2=d_eo_hi1*d_hi1_w2
    0 B4 s( f# n+ R2 {4 e5 A3 ^    w2_new=w2-lr*d_eo_w2
    . ?. z9 ~7 R0 `8 B+ E. j6 |5 T    #求w3_new+ q1 N, e1 @- _# X* `% V9 G
        d_hi2_w3=i1" i5 |* d, y& Y/ X" Z
        d_eo_w3=d_eo_hi2*d_hi2_w3  y5 I. X  a1 c8 G) M0 n& c
        w3_new=w3-lr*d_eo_w3  I$ I+ Q' j. d5 y. e+ E, R- ]
        #求w4_new) N0 W8 e; _$ k
        d_hi2_w4=i2
    $ ~3 o) S: r. a! q# }    d_eo_w4=d_eo_hi2*d_hi2_w4* B+ X+ [. V% k
        w4_new=w4-lr*d_eo_w4
    4 _! i0 O  h' L7 `    #求b1_new/ \! }) ]6 m0 k
        d_hi1_b1=1% |* a# p% F; z2 ^- ]* g
        d_hi2_b1=1
    / p* ?* o7 z! R    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
    : w& j# T' F4 b  S/ V    b1_new=b1-lr*d_eo_b1/ g* h1 n# m; X" \6 v5 D
        #更新反向传播9 W2 w! z- A/ e; D, C7 }7 @
        w1=w1_new: x4 s0 U9 E& \7 D) s4 G
        w2=w2_new3 A2 ^- F- V2 y0 D5 N/ q5 ?
        w3=w3_new/ u" O! T% g, Q$ e) Q
        w4=w4_new  L5 @% Y& G) v* ], p9 |
        b1=b1_new- Z. X1 M6 V  o% m6 o
        w5=w5_new, h$ M- O0 ]" V3 O% J9 m* Z* K2 u
        w6=w6_new
    / \" x9 P/ ~* ]& W* N2 ~% V7 e& g    w7=w7_new5 Q! b- |; x1 x+ j2 E; m
        w8=w8_new
    ' m) c. A  g/ y1 U2 L8 q/ b    b2=b2_new
      K$ ^- Y) F9 Q- P1 m: X* t8 e' W5 {print(f"当前计算总误差={eo}")
    ! _! v! w$ _# Fprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    6 Q/ E  v; w$ Y* q; y) j& h& D8 Fprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    - v0 H+ E# S% r- M6 D- Uprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) r3 R1 C8 [+ {, e. a& w9 F% U# Z4 w( |
    ; V9 p8 L3 P: \+ {4 y+ U* v
    结果0 H0 q8 v/ w  O
    , Q4 e- k" {# c- p$ C8 X

    + \, f7 z/ V5 }3 O3 n6 v, O" c) P结语
    - z& K" m9 u: [可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    - X5 ?8 s/ L7 Z' G6 n+ _
    9 m3 }& S: s; `, ~4 G2 D' F+ e补充
    8 v- l* K& i7 S2 [- E程序中d_{a}_{b}格式的变量表示a对b偏导, Y) s& u' f/ P6 P3 z5 x& p! ?0 l- ]
    ————————————————4 ?3 b. z+ ?8 i
    版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  Y$ p& G4 ~3 e7 P% Y+ z
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
    1 H! F. j4 C# J2 e' h7 {1 f$ s& c, f7 }2 I4 Q& B9 I8 f+ w

    4 w" q7 S* G$ v$ f: [- [
    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-4-16 00:03 , Processed in 0.284160 second(s), 50 queries .

    回顶部