- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564694 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174631
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)/ T' V3 b n0 t
& D5 s# D: ~+ c2 F! U
背景8 P) }+ @ F/ n# M) h) W; ^
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下0 N- B T" Y/ O3 g8 P
$ g! u2 H7 s3 \" w7 A% m【神经网络分类算法原理详解】
4 n0 S3 R0 u- k; \. p* P6 h( i1 ?4 {1 f6 q! m8 I
注意
5 V8 X# H3 j0 x- f站长提供的图片有点小问题,我们更正如下
$ z0 ^( n( F6 m$ s+ o' F; A, U: k N6 U7 B
8 I' [, j. {- ?: {! A4 P+ f; T+ d5 v q( ]; S
问题( b6 q# D* |/ |; m1 `
根据上图所示,我们有已知4 [( ?$ b0 f$ x. W' J/ ~" a4 e
- P8 c1 g3 v E K, A# A3 f0 }' ]#输入层
1 D& H1 {0 g# c' J' c' m' Ui1=0.05- T5 u; j! h& c8 ^
i2=0.1
- x6 }9 e* h# U1 A- ~
4 {) J" u2 r ~#输出层
4 d6 L0 Z; x3 bo1=0.01. P; E: T' G" L' J) W+ r
o2=0.99
8 o3 @6 i! @5 u9 w# k这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
: |2 s9 N2 n( `; _( W; X2 y6 t! e3 m
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
* b0 i* g' d3 L: m+ q* V: I( Q( v: _+ _6 K+ G1 K. ]5 i- \
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
" A/ S3 x- c! `5 p7 C+ }5 u$ F& }* L0 I0 i4 r7 c
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出; g c9 [0 s1 z1 N5 r7 [' U2 h; E
$ h8 ^$ C4 Y+ K5 N( b( h; E9 X
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
/ p" A- ^) F- V& v4 t8 o$ `: O8 ?8 j) X/ E
同理$ X# H' ^; A" L1 m8 k% B( i
) I: d) f! W) f- u7 p: n
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))& `' {: m3 K+ q$ J: f3 M. G8 u7 Q. M
7 n1 J; J$ j, C$ q
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式, j# t5 _! ]# \1 }) H
" E% _4 h0 Q3 y/ P# R# O m神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
# \2 E4 J7 ]/ ^
& O. p" I+ ]: ^3 `* z# {+ E神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2- a: G& e+ t1 E
8 r! r1 z D1 C( i: Y- p8 w再经过非线性变换Sigmoid函数得到
9 R. s. ?- Y/ M$ ?/ X- W1 R* O- E+ i" l
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), w. K- }" o4 Z( S8 |8 C, j) [4 U
) w. E& o2 g B$ z
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))4 g, z! z% p- Y; r0 ?
6 g$ k# r) x: X& Q' P) _我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为& L; ]; p8 ]5 e" p1 I4 E& N
0 a! T9 {2 M1 }
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/23 V5 L+ o7 U0 P( l' ^
6 T7 a, p! p/ h; n- d4 x X: z
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足' u" W% p7 ^* I, _, E8 a5 `
3 e$ ^" B2 _( v( Y/ \9 L
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
- j5 k# Q3 R( q& {' e( f" |5 D: q r) y% B! j
学习率 (learning_rate 简写为 lr)我们设定为0.5
6 ~# |, i- X. i9 s9 L% h6 X$ ~6 \# S9 P0 Z# y( @0 a& M
依次求解代求参数4 W; O/ J- U' _4 F1 s8 c9 C* H; O
6 C! H6 t; I$ L6 d- n6 ew1~w8,以及b1,b2
1 r3 j: l" F/ r+ o) v3 y% ~2 `' |0 q/ a' u2 l5 n% O/ P
跟
4 Y# e0 l# r0 C2 `
1 z9 N4 t" w7 n损失值 (eo) 的偏导数( d7 q0 \6 T+ @. R q" w
9 W e3 X+ b% W9 V6 l
再更新该参数,更新公式为+ \' ]; t" A5 k
! B) W F5 o! P6 q, W
参数_new=参数-学习率*偏导(eo,参数)# P$ |4 H0 f: {+ M" @% _' J, j
随后进入下一轮学习- ?8 L& ?* n; i8 D; c/ D5 k
) M1 i0 S0 `, \
终止条件(满足其中一个即可停止训练). ~$ E' F- y Q! O% B6 F4 k0 _: P
! W" v6 A, D( w, t$ r* _
1.学习次数达到上限
4 t* ~/ `( N' j+ n _+ d6 j& k4 ]) j4 u& O
2.损失值达到可容忍的范围9 J' _3 x+ F8 Q! q; L# N
' L; A8 h9 ^) W9 o, d导数
7 M+ K; h! |9 O: ~9 J$ \f(x)=1/(1+e^(-x))的导数是
- Y$ [$ z( Y; ?' Tf'(x)=f(x)*(1-f(x))# H3 o0 `% d- g% r( [+ T s1 C/ Z
源码. ]0 \9 v$ V5 `; A' l! h
import math
/ R5 |/ W1 o8 f, r9 B( S- c$ y0 t" ?& L0 ]) D2 B" x, t
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
1 D; c( ~* w3 X. o& }) }5 w+ r$ k#网址中图片有误,请看我博文上的图片
' c8 O! `( `1 T. e
/ s+ o% ^ g; ^' Z& N) y#输入层5 u. I$ n. f: z. q7 M5 F5 M
i1=0.055 ?4 a2 ]4 O# D2 o& d0 ]1 o
i2=0.1
: j0 U3 U# N1 E* ^; D% l8 R6 T! X1 ^: p#权值参数$ e0 r7 h. \/ A( O* U( U8 n! @
w1=0.152 L& R% z0 H3 {. d8 J4 A7 N: o
w2=0.21 Z# Q6 x! T8 q
w3=0.25* U# E) _8 H! v0 H/ @
w4=0.3
4 R# r/ Y- W+ U9 M* r& Bw5=0.4
4 _, A6 h; M. Q; \1 vw6=0.45
5 B/ C/ K! T2 A% L) I. B7 U6 nw7=0.5$ r) m% o" ]; d& I
w8=0.55( S, m7 o E/ W' ]5 Q
#输出层标记(即期望值)/ n9 @+ I$ S( Z) a4 t' T' \ Y% o! ^
o1=0.01
0 j7 q9 I# v- ?' _o2=0.99
2 Q( N5 k4 _& T k#偏置项参数
2 E1 T( A% ?' }- L& |. kb1=0.35
1 W* _$ [* P( R& Jb2=0.6
3 E5 i- H- y/ Q1 j8 e* y7 q4 P; I9 @& @7 K
#学习率
/ s& E8 V, Q: S% u) V0 X: ~ Alr=0.5
0 n. g: C2 R" D* }/ B& y. h3 ^+ _8 W#学习周期
) X3 N* D2 V) K; b% alt=09 }( r3 E. h8 B1 V) F3 n' R& \
max_lt=10000! E' m& r0 b* x9 P4 J h
#允许误差, W* |# b& v2 D
eo_allow=1e-58 Z1 A& M- J5 q) B! z: o
" X+ r$ ]1 _/ S5 ^#线性转换3 m" c/ o: o5 k U6 O
def linear(w_one,w_two,i_one,i_two,b):
. `0 A" k; `/ K9 U7 p% e4 c0 r) u return w_one*i_one+w_two*i_two+b
8 _( X; O4 P6 S9 H' D9 j* n6 z0 T#非线性转换. V' l6 Z7 B. ~7 }$ h. c9 G, W
def none_linear(i):: {, t2 E, y, L, w7 R) V
return 1.0/(1+math.exp(-i))3 i. |7 U l4 d! z7 ~$ E
) a6 _$ q9 p# b5 G; A- k
print("训练开始")8 P# O4 U9 |; l f* A
#学习周期结束前一直学习1 ~7 S- C. j7 k2 H$ n" }
while lt<max_lt:
3 X1 [) J) d/ l$ t* {# d2 ~) x+ i; J3 I lt+=1
: F2 K" J8 B, t) [ #求h1和h2输入值
8 E3 Y% H P+ A" C hi1=linear(w1,w2,i1,i2,b1)
9 _, }! H: {( [ hi2=linear(w3,w4,i1,i2,b1)
; |& E+ J$ C0 S9 a& u% o #求h1和h2输出值
; U) b0 Q% u5 \! [% l/ d ho1=none_linear(hi1)
2 y& E: r+ g& e6 Z ho2=none_linear(hi2)
8 [& u' l; @2 p/ } #求o1和o2输入值
; K H* |% H' } oi1=linear(w5,w6,ho1,ho2,b2)
6 f4 @8 I! O0 a R u2 U, p oi2=linear(w7,w8,ho1,ho2,b2)
& Y$ U t$ f( s" `5 n0 }) Y. B2 c ?) h #求o1和o2输出值
, T `' r1 \3 E oo1=none_linear(oi1)/ i" }7 a( `- _9 q- a
oo2=none_linear(oi2)
1 c$ _3 I2 |% t6 a y$ y. k' w
; l8 O( d/ _ A2 w0 A! d #求当前计算总误差
6 ?7 Q0 T0 x, {! q eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
9 W5 Z+ j3 j" H& `9 ?$ b print(f"第{lt}次训练,当前计算总误差={eo}")) ~$ l3 [2 q+ P R0 }5 O3 i7 [
#误差已经在允许范围,退出训练
. y/ s4 k/ U# q! M, A; ] if eo<eo_allow:
+ l" f9 R$ b: b7 } V& ~ print("误差已经在允许范围,训练结束\n") R% O: g) c0 D5 \ Y' F
break
; C) `* q' f! x" ] #偏导
* W3 N1 Q7 u/ P: ` d_eo_oo1=oo1-o17 Q. L. l) ^. J" V$ `
d_eo_oo2=oo2-o2# `' o1 T2 ^9 x( W3 z$ |
d_oo1_oi1=oo1*(1-oo1) R9 r( H0 @. X# Z# w4 Y
d_oo2_oi2=oo2*(1-oo2)* Q L( S2 }% n+ e2 C8 e! n; [6 c
d_eo_oi1=d_eo_oo1*d_oo1_oi1: i8 D' G& F6 n
d_eo_oi2=d_eo_oo2*d_oo2_oi2
2 c. s9 e2 W; Q7 } #求w5_new2 u+ e& x& n T2 j6 x
d_oi1_w5=ho18 s8 ~9 {, w% l0 e) ^( e
d_eo_w5=d_eo_oi1*d_oi1_w5
; H& l5 U. P9 F% O+ n$ u- y w5_new=w5-lr*d_eo_w5
( C2 c& e5 l" E4 O. f #求w6_new
3 f; q9 M! J. O d_oi1_w6=ho24 G0 k" ^6 T i. ?! w( z/ E$ J, s
d_eo_w6=d_eo_oi1*d_oi1_w6
2 V" A* U5 E8 z+ U- ^ w6_new=w6-lr*d_eo_w6$ L& x( h7 K+ S: L% w i7 }! G
#求w7_new. H& g) z4 j" q. c
d_oi2_w7=ho1
4 L0 f# G& w5 I: O2 v8 O d_eo_w7=d_eo_oi2*d_oi2_w7
/ R7 @4 H0 P* \+ v& v w7_new=w7-lr*d_eo_w7
v3 C" m* n, {+ }. W #求w8_new
, h" ^! V# m4 X C d_oi2_w8=ho2! c' O* y* ^6 d7 P$ H( ^
d_eo_w8=d_eo_oi2*d_oi2_w8: ?5 R2 T/ S/ A1 R
w8_new=w8-lr*d_eo_w8
5 F* ?' c! e, Q- R ^% r V* j: E #求b2_new' F/ c3 _2 N6 S( F$ Y6 V$ n
d_oi1_b2=1
9 U, \6 D' h8 s( D2 I. {5 s d_oi2_b2=1
. N: ]) \2 V! _/ g! v d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
: w: y5 b% r" U6 P% S8 [ b2_new=b2-lr*d_eo_b2+ a. c- s: W) s% i/ N
d_oi1_ho1=w5
) p6 j+ X. \$ \) ~ d_oi1_ho2=w6
$ _, Y$ G( ^. L$ | d_oi2_ho1=w79 `: N- T6 b# q6 w) u$ w/ u/ H
d_oi2_ho2=w84 H% O* Q$ {+ P) q& p, w! k
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
0 U& I5 [ ]8 ?$ g3 R* W d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. K6 w, e/ ~" }
d_ho1_hi1=ho1*(1-ho1)
; @8 _8 p! z. L# h" D4 k$ Y: A d_ho2_hi2=ho2*(1-ho2)2 s! I6 }9 n2 k- d- _) U
d_eo_hi1=d_eo_ho1*d_ho1_hi1
8 }: [ j/ f( m/ O d_eo_hi2=d_eo_ho2*d_ho2_hi20 A5 F& L8 |, C( i
#求w1_new
/ k& P, ]( y2 P$ H. t7 p7 g% l. | d_hi1_w1=i1
0 [" T# A( l& I. Z d_eo_w1=d_eo_hi1*d_hi1_w1. C' `5 K- P+ s9 G4 j. n% E0 I
w1_new=w1-lr*d_eo_w1$ g; k8 _. O: v; F- \
#求w2_new: n# _: Q W! L6 J5 j* X
d_hi1_w2=i2* |1 g5 ]( x- x) C N; H2 P% P0 k
d_eo_w2=d_eo_hi1*d_hi1_w2
: A4 R) D- Y* w) ] w2_new=w2-lr*d_eo_w2: `* `* s' x9 Y9 H$ b0 X
#求w3_new4 z$ a. T" A/ O- H( E) F3 `
d_hi2_w3=i1
" h* c% [0 \) J! C9 i0 c: T; n d_eo_w3=d_eo_hi2*d_hi2_w3
# o2 P) T$ [( d! _) x. l" T w3_new=w3-lr*d_eo_w3
4 H( X( ^/ D2 Y( P #求w4_new% }/ g8 Q; H4 X8 U$ \3 O* I9 F Z
d_hi2_w4=i29 ^7 d- m. t; m8 `! s% b4 T( p
d_eo_w4=d_eo_hi2*d_hi2_w49 w4 O- z9 I6 b* T* _
w4_new=w4-lr*d_eo_w4# f6 B# R- X! i4 u/ N0 s. Z8 G
#求b1_new( m+ u: H, O" J5 I' s! ?1 o" K
d_hi1_b1=11 `2 m8 r, I* t& Q4 s+ N, b; C V
d_hi2_b1=1
& [, {! M* Z: W d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
1 q" A; G; V/ p- F/ u; {! g, r b1_new=b1-lr*d_eo_b1. T9 b" V. |. G/ K- y
#更新反向传播2 X( B+ U# {1 x% I1 y4 ^& W! f
w1=w1_new6 [3 Y# F1 G4 T: \
w2=w2_new' \! a* ? ^* }. k
w3=w3_new4 c8 P8 S9 _" a; D8 x. h+ L8 v
w4=w4_new# N% X! W, C* k: G: U5 l9 k P
b1=b1_new
6 Q$ n, r0 V+ \8 Y5 w$ a w5=w5_new5 g: i- b7 H0 H1 Z
w6=w6_new
$ R& o4 f2 `8 a w7=w7_new
+ I0 O$ P$ l) g j3 o( E v w8=w8_new
3 K8 @0 S8 M. w8 r, o+ B b2=b2_new
8 \/ U# m9 n8 P& Wprint(f"当前计算总误差={eo}")) {. L, I$ _( @+ z9 {
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
$ u* s9 m) ~! U9 |, u9 q) qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
* H% [5 A( m4 @; f3 n: }- t0 T' Pprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
& u5 c; p% u8 T1 X4 o! Y4 L, ]1 x. M: B, \% j f. T' p9 _: r# x( a0 Y
结果' T; I0 j- f4 ?( J6 L3 r# P
8 s4 Z- [3 y; J- j
# m3 W6 @+ ]* P r' i7 o9 c结语- o- z5 ]" S: c. s8 N( ~# v
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
3 ?3 @0 I; l; ]1 N/ M; N* Z
2 s/ p% M3 F+ r& h& T补充1 F% c" z# Z3 j/ V. ^4 ]; T2 s# r
程序中d_{a}_{b}格式的变量表示a对b偏导4 _& N. Y- y, u# G: K3 S3 V o
———————————————— q9 a0 v3 e! l9 V
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|8 a: J6 Y4 ^原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
. j" d+ I0 U: r+ [5 T$ g0 ^
7 k" `' L- H, o- i. P# l1 }8 Q+ m2 ]% _7 B7 h" T4 J
|
zan
|