QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3054|回复: 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实现)# N8 x" Y- {  Z5 O

    ' f; g6 r% i+ u, w7 L4 g6 P, i# ]背景
    / X- C0 A+ S: L* g; ]初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
      I0 a! W7 M" J* `# U, L1 p
    * q$ l" L$ b1 L2 p9 ^+ Q6 }【神经网络分类算法原理详解】5 U* m5 S& o2 T' I
    9 T0 j7 t6 b: f6 n# i( |
    注意
    8 L4 }) Q: c/ [6 g! x3 h! S- E. V站长提供的图片有点小问题,我们更正如下
    7 E0 y- n% L' N, f; ^2 `2 }6 b5 s7 O! d) e

    8 R/ e; _" z7 I" m, q' h7 h; l# L+ {$ g$ n0 [6 w
    问题; j& s7 y' `! b- U
    根据上图所示,我们有已知
    , |4 s, P, z8 M0 V: Y7 O
    ! R4 {& m8 n2 I+ i+ r% M#输入层; Y% c3 c  D6 B- o" y
    i1=0.05, |& A2 Z9 U0 d: r, Z8 z
    i2=0.1
    2 u* R/ k/ }# G( a
    ; N- E$ x3 f; f# a$ I#输出层" g. V. ~8 z( M7 r
    o1=0.01
    9 \# c2 e$ q4 Eo2=0.99
    9 c+ m( ]% ^. }8 V" N* ?+ _: d这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
    # x2 S; u2 n5 H1 q1 Q2 X9 e: q& m2 e% S  ^% Z7 D/ [! `
    神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1) T! V/ R2 {, L& ?8 d
    8 z, `! [7 ^7 N" N" ?6 R! ~. j
    神经元h2的输入  (hi2)=w3*i1+w4*i2+b1  E. `# o* l5 G; e/ |) c9 G
    ( ]& O- D  h  g! m5 @
    神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出+ W" B3 o& X$ G  H5 R, k
    & j8 J& }* C+ p- j1 c" ~* e
    神经元h1的输出  (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
    2 A0 Y) Z4 |' e. C2 X% M) i& W% I) z% }: V
    同理0 d4 o% G8 K# @3 y

    ' \# K" y) T" A, I' u( q神经元h2的输出  (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))+ P: v/ g  c$ Q% n

    ( \6 J/ U' z8 d接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式: S5 ?; h9 ]- [8 {3 ]; t

    ) H3 Q3 ^, F6 \2 ?: A8 ]神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
    5 `8 r/ X5 f7 X  r1 P4 o( b3 X4 N% @. u% z0 O9 c# [
    神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
    + Y8 |+ ?) [: R2 g" E
    / Y5 X9 A3 `+ x" [. S6 g再经过非线性变换Sigmoid函数得到
    . N6 e3 d" a! d1 \" l, i2 r4 t, z  X! F- g& s9 R
    神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
    5 a' r0 \2 U$ r/ |2 R) M5 A1 \: }# j) n
    神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))9 N3 O* F9 f- ^. E

    9 {/ G2 E) `; B% q5 p& e我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
    3 V4 B- X, T& B6 W. m1 Q. |9 _4 D% G2 g5 r9 F! _( s
    损失值  ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
    # d9 L* b3 m  N! c2 N3 h- |7 c1 ^) |: j( `$ I
    由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足6 ^( a6 Q: m4 C7 ~3 E4 T
    4 k( s6 `# R' k7 X' c% e
    学习次数 (learning_time 简写为 lt)我们限定最大为10000次
    1 z4 S. n' U. }- k/ m
    ; ?2 F7 ?% d$ {8 Y学习率 (learning_rate 简写为 lr)我们设定为0.5% C& i* z0 T$ M7 |

    . C; }& p+ D1 N5 ]依次求解代求参数
    ) v/ M3 X4 S0 U, X( I" Y2 c6 Y+ p6 E# u0 x2 ?8 l( s
    w1~w8,以及b1,b2
    5 |) }% [  S' N! v( K' u
    ( O; W8 D; J% k' f8 ]0 q7 J
    . {1 {8 C& N7 H- l2 o% m% h& Y
    损失值 (eo) 的偏导数
    , T+ e* N$ R8 H% j4 h# v. D9 }1 U, ?1 z% Q2 J, D' X
    再更新该参数,更新公式为
    6 ~: M5 G& A$ X6 Q) d% k# q% R2 `0 C  X
    参数_new=参数-学习率*偏导(eo,参数)
    ) y. K' ~( R) o, Q+ e随后进入下一轮学习
    9 ]7 p+ ?4 a( w
    1 o$ `7 n: J  j- Y9 i终止条件(满足其中一个即可停止训练)
    8 i/ H6 M# J8 C7 c8 D1 T3 z/ s9 h9 ^+ \1 x  D) v( U3 g* _
    1.学习次数达到上限
    4 Y3 m! z, o# W0 e7 O
    / t: A& Q+ L0 e$ f. m0 a$ E: d2.损失值达到可容忍的范围
    & v8 p+ h2 [$ Y# E4 L+ Q; _2 e6 V, N$ q# t4 g  w% t/ {
    导数( F4 X, h. k! H0 E$ b6 E$ w" s
    f(x)=1/(1+e^(-x))的导数是
    1 C, V5 R% @- E3 O. ff'(x)=f(x)*(1-f(x))1 Q7 b+ r5 E4 I& Q
    源码
    : y! X& N0 v. J4 X6 E% qimport math7 G2 t# K$ H( Z4 u& Z- C
    , A/ \& ]+ U3 m' g& g' R) p' s
    #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】$ e& p7 ]: k; \' n! {* s
    #网址中图片有误,请看我博文上的图片# O$ }) v% w( B( L
    ) ^  d: Y! F+ Z% }# T% e
    #输入层" J) F% i5 t! h
    i1=0.05
    1 @6 H( W* \/ q3 \8 ji2=0.1
    9 ?5 g5 L1 b: [4 u# ]3 D) p#权值参数6 h$ p- o3 B  P: [3 X' O
    w1=0.15- }* ^3 v! h9 y# W* h) Y" i
    w2=0.2
    3 o# Q* t3 @& U! T! W: W3 Hw3=0.25
    + A9 x+ ]9 \6 k3 _8 V1 K8 ^8 mw4=0.39 K2 R8 {6 ?0 }- c( v
    w5=0.4
    ( R% @% n+ z( I% Qw6=0.45
    / A; V1 n" @9 m2 x) P; |w7=0.5
    6 y# w# ?9 w0 f) U2 L: I0 y4 b* R# Rw8=0.55
    & ]! L$ Z% u/ e; i* ?( H#输出层标记(即期望值)
    / z7 n, o- p, J5 ?/ P0 Uo1=0.01
    $ i- [" x: J# t/ ?8 w# No2=0.99# w" e- t- }: B2 j6 U8 f/ G
    #偏置项参数, ~# d6 S& o" [
    b1=0.355 d' w$ i  ?8 c/ N/ u; r
    b2=0.69 S: u* x8 k8 D
    - X) n7 B5 l* \% @" e
    #学习率( G+ x' B+ H& A* Y
    lr=0.5
    ( T9 T# L; N4 @8 P' W! K4 j8 v4 [$ a#学习周期4 e0 `7 [; D  V- k+ h1 X$ W
    lt=0
    / W' z; v. m6 Qmax_lt=10000
    ; K4 U) K4 L$ N/ [$ h3 F2 c5 \/ J2 h! G#允许误差" u. Z2 E9 [& n$ B2 H/ E8 i; K
    eo_allow=1e-56 J- Y0 I2 W( }( ^
    8 \8 j7 [8 v( j1 p3 v
    #线性转换6 R/ \  Z% y' D* Z+ ^( T& o+ W6 H6 D
    def linear(w_one,w_two,i_one,i_two,b):
    6 Z" L3 y4 ?. s( I7 m    return w_one*i_one+w_two*i_two+b
    . ]. i$ L; t5 J. }#非线性转换% W  y8 p2 s; ]3 A3 z5 P+ g
    def none_linear(i):
    5 F/ Q. L: k  q6 _4 R" H2 Y$ t2 X    return 1.0/(1+math.exp(-i))# a, y  |$ Y; ~  c: M* z0 U$ H
    + Y: m0 e8 m; t3 l- ^7 g/ m! V% j) {
    print("训练开始")
      H: ]! r! z2 p, _) _2 ~#学习周期结束前一直学习2 t# }6 T/ p0 j* i& k* e' Y
    while lt<max_lt:" L: [9 K* s% P8 w. P
        lt+=1
    + W3 m7 Y! B9 l) P3 B5 o: u4 K( r    #求h1和h2输入值
    5 R# w1 x: E) v    hi1=linear(w1,w2,i1,i2,b1)
    % n3 U; m  H, X4 _( K" e    hi2=linear(w3,w4,i1,i2,b1)
    5 ~5 l; Q3 I! c; I9 J8 e: C5 c5 i* T    #求h1和h2输出值; Z0 a/ U9 n1 ^' \* J# E
        ho1=none_linear(hi1)) L! `" m5 p* |5 q+ f. W
        ho2=none_linear(hi2)7 a6 |+ N/ H6 f4 X! I5 s5 x0 C2 _$ f
        #求o1和o2输入值
    - X0 z1 r0 z  b' |6 q    oi1=linear(w5,w6,ho1,ho2,b2)
    " K/ ?& j$ N4 h, A* f, O    oi2=linear(w7,w8,ho1,ho2,b2)
    " P3 B. i. i! J) c- E- ]    #求o1和o2输出值% [- G* V0 m, |9 \3 {. g
        oo1=none_linear(oi1)3 ~6 h( B+ ~  W; ~) m# {
        oo2=none_linear(oi2)
    - R% {4 N2 @. Q6 W0 k
    ; H: N4 t& V  u& {- E& j    #求当前计算总误差! W) n; m6 L/ k
        eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
    - j, z$ E& I+ |$ E# \    print(f"第{lt}次训练,当前计算总误差={eo}")1 v! f4 t7 }# K3 ^8 B  C1 P# M
        #误差已经在允许范围,退出训练6 V/ O: [/ x5 x
        if eo<eo_allow:) a% _, ]+ J& ]: p, g- W6 n) T7 {
            print("误差已经在允许范围,训练结束\n")& d; _3 y; D& ]* q$ h$ Y
            break9 ?! h5 X  b9 @/ D8 b3 K! E" G
        #偏导
    0 u0 v5 v7 T+ M/ O& L/ \    d_eo_oo1=oo1-o15 X$ {" E9 n) S* \2 l
        d_eo_oo2=oo2-o2
    : F+ x5 b% M& @* {6 ^    d_oo1_oi1=oo1*(1-oo1)/ h+ A# Z6 O8 d, S
        d_oo2_oi2=oo2*(1-oo2)" p* M% J0 [/ G# b( X* o
        d_eo_oi1=d_eo_oo1*d_oo1_oi1: Q) v& h6 \4 E1 m- Z4 H
        d_eo_oi2=d_eo_oo2*d_oo2_oi2
    0 j+ C7 p- L& K5 G( f" E    #求w5_new& d! i9 t' g, K" ?
        d_oi1_w5=ho10 H+ p4 B% C0 T- u) H' a& |  t
        d_eo_w5=d_eo_oi1*d_oi1_w5
    * N. s6 l, G1 s, @# a- ?) m    w5_new=w5-lr*d_eo_w5/ l1 p; C+ M, M9 G* G
        #求w6_new2 @- I2 y0 h. I1 D) S# o
        d_oi1_w6=ho21 o8 B+ `0 x/ ?
        d_eo_w6=d_eo_oi1*d_oi1_w6
    8 @" C$ B: X/ [  O8 K- ^/ ^    w6_new=w6-lr*d_eo_w62 Q5 y; f1 i5 V" s( f
        #求w7_new. k. s, t8 l* V
        d_oi2_w7=ho1
    ( c. J" L/ ?6 W    d_eo_w7=d_eo_oi2*d_oi2_w7
    8 k) I/ I+ L, n- P    w7_new=w7-lr*d_eo_w7: z( f% G+ v7 {" R' ?# x& \9 H$ V* Q
        #求w8_new
    . d, {  f" q6 o, V; Z# t    d_oi2_w8=ho25 C) M: P& [0 \# B8 r9 E* S4 m' X
        d_eo_w8=d_eo_oi2*d_oi2_w8( |5 d$ y+ U4 {7 Z, s- W5 g
        w8_new=w8-lr*d_eo_w8
    ) k& j/ `7 j1 t4 {7 }* S7 h9 p, z    #求b2_new0 {/ D" h. ~& ]% Z+ b
        d_oi1_b2=1: w. Z2 p8 j( V7 A4 V4 K! [
        d_oi2_b2=11 l4 |& {' Y$ x/ D' g; R
        d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2$ B" B  ~$ `3 G* l% A
        b2_new=b2-lr*d_eo_b2
    6 m# \" U* D5 A; s    d_oi1_ho1=w5  W4 j, V) j9 |4 k0 A2 a
        d_oi1_ho2=w6
    ( k, y) G% d; y% a: K) k    d_oi2_ho1=w7  X- _8 [; Q5 t0 B/ n
        d_oi2_ho2=w8
    + Z( A( m  d% n0 V& j! T    d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1% B6 Q- R5 ?- d4 H& \
        d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
    ) g4 Q. V- q6 M  S# _7 d    d_ho1_hi1=ho1*(1-ho1)
    ( P$ Y. ~# s- I3 ^8 W    d_ho2_hi2=ho2*(1-ho2)7 A( V2 |3 W. Y& u
        d_eo_hi1=d_eo_ho1*d_ho1_hi1
    9 {2 o7 Z  V5 C% c/ X    d_eo_hi2=d_eo_ho2*d_ho2_hi2
    % L9 P+ a( b2 _8 J& s- L6 n    #求w1_new
    - I1 a+ |3 [: |5 Z4 ]6 S# l1 u    d_hi1_w1=i11 M5 @" Q+ l9 M' I0 ]  g" {
        d_eo_w1=d_eo_hi1*d_hi1_w1
    5 s+ U% r! X8 d2 O4 n  \1 R    w1_new=w1-lr*d_eo_w1
    $ Q4 ~1 t2 q6 ^/ Y0 a    #求w2_new
    5 e; ~1 }. N6 O9 i+ I    d_hi1_w2=i2$ n( }! U% _% i8 H( O
        d_eo_w2=d_eo_hi1*d_hi1_w2
    3 B* R# M, \9 x/ c( w4 [    w2_new=w2-lr*d_eo_w26 ^) l* J# v6 R$ y. W+ P5 s, N
        #求w3_new0 ~) `7 T: W$ R! S5 l  I
        d_hi2_w3=i12 V' x) e6 z6 v, |& F2 v
        d_eo_w3=d_eo_hi2*d_hi2_w36 ]$ H2 k3 V- A; d! e# G: z
        w3_new=w3-lr*d_eo_w3. ^  o* w7 ^( M2 Z
        #求w4_new8 e( A1 t  U9 k! Y. k  B  c
        d_hi2_w4=i2
    6 P) y0 [3 }% S. ^7 K8 T    d_eo_w4=d_eo_hi2*d_hi2_w4# _1 w* l; s0 d9 ~+ t. [
        w4_new=w4-lr*d_eo_w4
    $ T1 }- T4 o1 f& E) {6 M    #求b1_new
    ! L, B& n+ {' ^. G9 R- ~    d_hi1_b1=1$ p+ e. N3 I( I: n: P1 |4 s
        d_hi2_b1=1
    5 ]& F0 c: G. R! z  S* h( }- Y% T9 k    d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1! s( r! ?2 i' A/ Z$ l5 x
        b1_new=b1-lr*d_eo_b17 `6 g. x8 j/ l3 h6 s- P* ^
        #更新反向传播- `9 A( r0 [" R8 b+ J- |
        w1=w1_new
    / c4 Z1 Z; G' ?0 S. o" a( ]* y! q8 B    w2=w2_new
    & Y: {( J& H" \9 P4 [6 s    w3=w3_new/ R& \% Z7 T( `4 p+ U
        w4=w4_new
    # y* k1 G, {+ q0 E1 W) c    b1=b1_new
    : C9 V8 x) i3 ~" D* D& L    w5=w5_new8 v6 R- r+ \8 y9 \/ @: v
        w6=w6_new4 x! J" b  C, h; ]( ?$ j
        w7=w7_new3 A$ p, o& f. ^9 d
        w8=w8_new
    9 \& J; {, w. s    b2=b2_new$ O" w, D3 E+ q; W& {7 W/ }# U
    print(f"当前计算总误差={eo}")& w9 s& b$ o+ f0 l
    print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
    9 S& ~( P; |1 T. f4 `' Rprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
    % K0 ~! J1 d' b( tprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
    / N1 [, S: _( r% i0 i7 P0 M* L, e# H& y7 u
    结果; J; t4 C! r4 D; m  V

    6 Z9 b9 b1 O2 I( N! P8 k& L: T! W* R  y/ [. Z' N
    结语1 Y1 {( z# m; H6 a: e- {9 |
    可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
    1 e- \' T5 p+ V6 O$ f4 X# K+ f
    补充7 |7 o% `! `: G8 M/ o5 b
    程序中d_{a}_{b}格式的变量表示a对b偏导! |- d' ^* ^- x6 o1 S  |+ c, J
    ————————————————
    7 I- ]3 |# _- O9 P2 i版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 w0 J( w4 @1 e/ A9 `5 p4 |
    原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954" ~! B- u7 H. p2 ]
    % F1 k$ L5 F  x

    3 n- k- ]+ f" a4 U( y
    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-31 01:38 , Processed in 0.295008 second(s), 51 queries .

    回顶部