- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565164 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174772
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
7 |* K; l% ?( a k, }3 _
2 ], d- G6 O; p# T/ C1 p0 q背景* O7 A' R& ^/ v4 ?
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
* }7 p! C1 T& T8 s# N$ P0 r
1 ?4 T" i5 q: e6 U' {$ l【神经网络分类算法原理详解】6 s9 K% a/ C) W6 Z
0 g! d+ U) Z# V. N3 \注意
6 Y9 y2 s0 m8 [- v$ ^站长提供的图片有点小问题,我们更正如下
$ J0 O- E6 a$ c; F) N( q. \
7 h; B% |- j) u* h% ]3 h3 r8 F6 h7 j5 U& @# u
$ c. [3 L; J$ h( W; J* g问题0 o1 J3 N* W5 Z; k" l
根据上图所示,我们有已知
! c: S, I( ?: l0 N/ R
2 U$ ^& U9 U( j2 B5 P' J#输入层* e! y9 n3 {, k- T$ r& }9 w$ |5 ?
i1=0.05' P! [/ [# t. m( N/ U" |
i2=0.1
; N( m" X' J3 F) ?$ p# y& g9 f3 T8 y1 `/ r+ j. ~" q/ T' @
#输出层, P- A% U( T! F3 [6 S
o1=0.013 V. i' t/ y$ L% L% t) L$ r
o2=0.993 V) F- D, t1 S
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
) ?' v* W- B) j8 C9 ~
, ? B$ N7 X& \7 D神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1# N7 u# S4 A4 {0 x6 K
) G+ G# D0 H- [ L
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
' t6 H- A6 v" n# p0 x8 U( G1 z8 s" j! H( ?
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
( I! K% [ R9 _, W$ `
n7 }) n* ], I8 L: v! [* C# {神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))6 s% ^: @$ c6 B$ z5 K( L( Z; c6 y3 q
" h# q; f8 P$ @9 k
同理
$ X8 v& M% ~0 ^$ k& b# |
4 W5 f- `. E' m0 r) I) Q神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))$ |9 G F. P; B. j0 ~$ `" A. O4 p
$ C! G C. U% U+ H% i; \% m) E8 R
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
$ H6 X( |9 V- P& ?+ o
$ b, Q- ]; N1 `' D# w) j神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2% k( |& _- K9 C
8 L) V' F, b/ e7 R& t; K
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2! c, u5 v- O' \/ }
, n! a( t% d! f& p& p# `
再经过非线性变换Sigmoid函数得到
+ V9 a+ S2 P! h8 D G) w$ }1 X& g% t1 l4 d8 E- a( M
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
$ t0 x2 a; t" \4 G* b7 G* Y5 W
5 _* k1 a6 ]) E8 u, ]: k4 [神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
# K9 G! F7 V, D. d. ~! K% H. h, d
3 I, \, c+ K8 j我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
; t9 d6 O* k& S& d
3 F$ l5 |+ i/ i& o损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
6 o/ C# X8 ]4 o
' I8 g: J* @( M% o由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
3 _5 n6 s( k% b' s ]+ N3 E
& R) v" R" H2 u7 y学习次数 (learning_time 简写为 lt)我们限定最大为10000次
$ w }/ e3 t: Q/ \: H7 I7 ~: X! B& r. [; J H$ q6 }
学习率 (learning_rate 简写为 lr)我们设定为0.55 y" Q4 ]$ Q# ^* x. z2 {# D
) V+ o/ Z) x! }+ S依次求解代求参数1 {3 i! ]2 r: Y. g7 f4 m6 v2 r# B
$ w& ]* F! V+ J" _8 @w1~w8,以及b1,b2
( M: i* S; b- a1 x' p3 @
6 I) r$ k+ G: [* n2 ~$ V跟
% ~3 N6 s8 S& Q9 A$ T1 f
( J5 w- o. ]( g" W损失值 (eo) 的偏导数
% E, F L' J: \ x4 B( B
2 B. j* ]7 |4 ]. _ q2 C5 H+ y+ s再更新该参数,更新公式为5 C! m2 Z+ A4 k; I2 J
( a* Y1 d- N6 V$ {2 A参数_new=参数-学习率*偏导(eo,参数)( h! D# B- q+ ]9 v0 z
随后进入下一轮学习
% ?& x& y( t# w } E% l( a1 n( n- {' n
终止条件(满足其中一个即可停止训练)- C! B2 c) A7 j& X
3 d7 t7 o3 [$ M: G, j" H2 ?" _/ i1.学习次数达到上限2 N' e# b* E- r0 W) Y8 f
: T9 m+ v& `, \% ^2.损失值达到可容忍的范围9 z/ e% @. u# T* C5 t
4 ]/ }# ^% R* m- Z& U6 y- G导数; U- x& v% i" @" m3 i8 V# h5 D0 {
f(x)=1/(1+e^(-x))的导数是3 `4 O2 L" I' ]6 s$ K2 j. J1 D7 u
f'(x)=f(x)*(1-f(x))/ O/ }8 E1 S: |
源码/ _( K, z; }( |& z3 @" l2 x7 P
import math+ ?( u# f% ?5 F/ i, X
^' M5 C+ m0 Y) H: a8 C' ~3 M: X8 |#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】" Z" K% Y; f$ c, o0 R4 y
#网址中图片有误,请看我博文上的图片! Z( m% q% b. `6 u. @
0 |& V; j8 |8 q, R2 x
#输入层5 F3 }( {* J/ @" Z3 `! w9 `
i1=0.05. Y+ N* E* x8 z. J# H
i2=0.12 K( s2 V3 h- [2 Y7 Z; n% |
#权值参数
8 o a* s! z9 t: d* t* S% H7 `2 Cw1=0.15
( L1 ?! W, G$ u" G1 h Ww2=0.2/ k8 u4 m6 q# ]! ~
w3=0.25
' r4 j- D0 S! ?! sw4=0.36 h2 ~6 S% ^1 O2 S. C8 p
w5=0.4
9 y' O+ E) u3 Q6 ]9 O" c% P3 p8 Gw6=0.45
9 ?( M1 Y! n$ R6 P* \w7=0.54 q2 d, x$ w! |. z
w8=0.55
5 U/ ~4 [ i% o/ x8 B3 D#输出层标记(即期望值)* K- S' c8 l4 V
o1=0.01& c* K- H2 v* U) Z! Y
o2=0.99# |. n1 [" \0 k( W3 X5 H
#偏置项参数
z+ ^6 D4 q3 w+ `8 _: xb1=0.35
, q7 y( |' ~3 j* i3 S" gb2=0.65 }7 f8 w, R5 J; X; w0 Y7 s4 w3 F
: l! B. a! E, y4 o- x
#学习率5 C2 n% ^; V: f M! ]7 I
lr=0.5) ^8 \+ f: {% ?. H4 j& u
#学习周期& d1 f- d& _/ \& i
lt=0
9 G" D! b+ d2 W. _$ x! Nmax_lt=10000
, \5 N, ]" }+ [! `1 u3 O#允许误差
* F0 @0 I, `+ N( Feo_allow=1e-5
3 h [: J5 ~; n- J& T* Y
1 _2 v, y+ i3 }+ O8 |. w$ Q#线性转换; e* i; Q B. Q2 `; u" X( m
def linear(w_one,w_two,i_one,i_two,b):( B$ L0 P+ r# ~# h3 Y" M. J* I
return w_one*i_one+w_two*i_two+b% G' t( Z+ c0 ?) E9 H3 ~6 p
#非线性转换
8 Q+ w$ _3 }2 udef none_linear(i):
; a$ A3 p K5 r& x return 1.0/(1+math.exp(-i))! C7 w0 C& h2 s/ n% R
2 h0 H# p1 i0 o/ Q
print("训练开始")' H( Y! `( X0 m2 i% O
#学习周期结束前一直学习
6 W1 Q( E$ O* N U6 `5 Xwhile lt<max_lt:- q+ u9 `2 X( c
lt+=1; ?! D2 O" B; t7 r( T$ o
#求h1和h2输入值
: B% O8 w7 S+ J% j+ H hi1=linear(w1,w2,i1,i2,b1)& c) k( Y/ o4 [: G- E$ V) A
hi2=linear(w3,w4,i1,i2,b1)3 R3 H0 p; K. F: u. v: [! q7 f5 W( P
#求h1和h2输出值- L+ s) S$ G4 f- K
ho1=none_linear(hi1)% W0 P- X- E6 [3 |) E
ho2=none_linear(hi2)
, h0 }' V7 N8 u. ?1 Y/ z #求o1和o2输入值: r \5 d* J1 W( o" c- m$ ^
oi1=linear(w5,w6,ho1,ho2,b2); S- |+ [3 s y- B
oi2=linear(w7,w8,ho1,ho2,b2)6 z8 g+ I$ `2 C: ?* q
#求o1和o2输出值
9 {6 T% }/ C8 M7 o9 s1 U oo1=none_linear(oi1)
4 r4 d" H. ~- o j1 r$ y& j) @ oo2=none_linear(oi2) [9 I% t/ }* b' i2 c
7 S$ b- ^; u. F0 A; H0 W0 C9 s #求当前计算总误差
/ m% c: o& R! G2 J1 c. D eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 |9 P9 R# b1 H4 L
print(f"第{lt}次训练,当前计算总误差={eo}")* @: r' c$ G# N* [- f- X- X
#误差已经在允许范围,退出训练
9 X% K" S" C" T% p) T2 T if eo<eo_allow:3 f8 Q" ^; z) K0 \: Q/ d- ?1 M
print("误差已经在允许范围,训练结束\n"); Y h1 t& T# v4 g
break/ E, ?- P8 m+ b5 [
#偏导2 @$ v, H4 J* v' Y
d_eo_oo1=oo1-o1) J4 j8 Z; J' J: y0 Z( J
d_eo_oo2=oo2-o2; v. M' o# A# U1 O+ D |
d_oo1_oi1=oo1*(1-oo1)
/ O( E* c( s; s. Q5 s# h/ Y d_oo2_oi2=oo2*(1-oo2), I& X3 `- K0 R. `" `% E2 P* \ Y% Y
d_eo_oi1=d_eo_oo1*d_oo1_oi1' B& W6 Z' h) O( ~% z1 a
d_eo_oi2=d_eo_oo2*d_oo2_oi2. c4 E. f) a$ O! j5 S
#求w5_new
4 j: e+ T4 E0 [: c d_oi1_w5=ho1
: }9 B& b4 ]7 |+ |0 E4 H# m$ { d_eo_w5=d_eo_oi1*d_oi1_w5% a- m6 T! ]4 ^* d
w5_new=w5-lr*d_eo_w59 l' o% y. D3 g8 l! @0 X
#求w6_new
* e, u; {7 D& w# t+ L# T d_oi1_w6=ho2/ [, b" Y% k' Y2 G
d_eo_w6=d_eo_oi1*d_oi1_w6. B/ g$ U( a9 ^- j' g% s/ B
w6_new=w6-lr*d_eo_w6( M2 j# _+ I; [4 C9 _# x
#求w7_new& X* a- V5 P5 l( N: P3 Z6 ^* O4 U
d_oi2_w7=ho1$ K5 p" t3 S0 ~$ ?
d_eo_w7=d_eo_oi2*d_oi2_w78 m3 j0 J8 K& y" H7 U, F! O5 h6 [
w7_new=w7-lr*d_eo_w7
0 B7 E9 T: P3 s$ c2 S9 D$ I& x #求w8_new
5 M9 B0 q5 g t+ q% w d_oi2_w8=ho2
( A# A. y* O& G; R% Y' Q d_eo_w8=d_eo_oi2*d_oi2_w8
0 V3 w5 F$ i+ W* a3 J* K w8_new=w8-lr*d_eo_w8$ X9 U2 ?; L% j6 ~+ x
#求b2_new, @% P& W8 V- l9 O; a
d_oi1_b2=1
! E3 H( V/ \7 r8 r( ^0 ]* L, o d_oi2_b2=1
9 B7 k9 G8 n/ Y+ c' X S& ~/ M8 ^ d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b23 ?2 M/ }) Q4 |" F! p! o/ ^$ ]
b2_new=b2-lr*d_eo_b2( y5 B9 ?& {. {: _5 T. Q* }+ V
d_oi1_ho1=w5
* G$ D; O! F" P9 m9 ]7 f' h; E' S/ U d_oi1_ho2=w6
l$ V8 X3 c f& f# T) z" P X d_oi2_ho1=w75 |: I- s3 H# j2 F
d_oi2_ho2=w8
0 E! v: m: j6 S" u4 P d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
* F% w9 Q/ G8 z2 [7 `2 b$ D d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho20 P* J6 t$ m# k6 W# }! y4 H; g
d_ho1_hi1=ho1*(1-ho1)
7 N' W" L4 \1 f% ^8 \ d_ho2_hi2=ho2*(1-ho2)8 K& p( U/ D! h4 i
d_eo_hi1=d_eo_ho1*d_ho1_hi1, B8 A* p5 M, {5 P- k1 J+ m
d_eo_hi2=d_eo_ho2*d_ho2_hi2& m8 g* |/ }- b4 }! B6 [! f! m
#求w1_new/ R! E, I! \4 T; ?0 {4 W% i
d_hi1_w1=i1: F6 S' u" c- X; g
d_eo_w1=d_eo_hi1*d_hi1_w14 i. _2 z6 b/ R5 P9 [
w1_new=w1-lr*d_eo_w1
- m% f, ?, [9 G3 A9 ?6 r #求w2_new9 U* M4 i) r: B( t0 T! F( y
d_hi1_w2=i2& g, T4 I u7 u# z
d_eo_w2=d_eo_hi1*d_hi1_w24 ^: M' J9 \) _. S3 U: o6 y
w2_new=w2-lr*d_eo_w24 M( N" K; I J4 h/ y2 T
#求w3_new
7 a" q' t9 p0 U }* S d_hi2_w3=i1
# G- x' R/ J- l7 @0 R, H5 Y( ] d_eo_w3=d_eo_hi2*d_hi2_w3
8 T/ _8 D& D. F5 q. K w3_new=w3-lr*d_eo_w3) T# Q3 P: Z' Q; h: Z
#求w4_new
6 [. m5 }8 ]9 O6 F R d_hi2_w4=i2% _# ~4 r5 {3 w; Q6 ~ W: [7 m
d_eo_w4=d_eo_hi2*d_hi2_w4
) q6 K- A( ?; w w4_new=w4-lr*d_eo_w4 r& o; c" ?' M4 Y1 d5 g# ]
#求b1_new
# D" q: {" ~6 L% I1 _+ V) ^; }' O9 Y d_hi1_b1=15 u d+ X+ O( H: r* u
d_hi2_b1=1- s9 E' J; b- ?6 _' X$ z2 p
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
+ }; S7 [4 q- v4 h9 k- Y$ \ b1_new=b1-lr*d_eo_b13 N, ^* E, M1 S& I. s
#更新反向传播
4 ^ g- T3 N+ v" u. Y w1=w1_new
2 {5 m7 p. ]$ B9 X( Q w2=w2_new, N" u1 I8 l/ d; J
w3=w3_new
- x' }9 ~% c# ~ w4=w4_new: M9 T% v% p4 c. C
b1=b1_new" r) [( @) u5 O/ v5 d
w5=w5_new
) F/ W) ^+ h0 I! m8 Z- H+ O4 b* n& O w6=w6_new- y1 p1 u/ e# ?3 o# Q8 d
w7=w7_new
4 x# k* n* K7 a0 s. x0 m. \+ J w8=w8_new6 J4 }5 r% I7 ~& U2 O0 l# E# F
b2=b2_new
" P, ]. j- X4 ]8 \1 @print(f"当前计算总误差={eo}")+ L" z$ A, f2 O X; ?3 ]2 |# t
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")8 i. N5 P( {$ ^+ q, x
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
9 z) @5 x; F( \) yprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) \. r0 [1 u, T- {
3 R" q7 c3 F$ |) U# _& D6 T
结果
, A* P$ S7 `0 Y' I8 U$ q+ v$ ? T
7 Q; a% m3 ^/ ]8 w, Q
/ n. v( a4 ?, c% ]结语" e% P+ C z* ?- m5 X5 U. m7 t# \# g2 Z
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。% d; ]5 M |' K+ S, I: }* U) w
4 l2 V' Y" K+ r( n' ^8 O补充
4 p( @ N8 \+ y" ]6 J, P2 ?程序中d_{a}_{b}格式的变量表示a对b偏导
& ?: ?1 q# H. X& N$ M0 Z3 O1 U————————————————# S! e4 Q, w" m" m9 }: s) _0 b
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 h2 C6 D# R3 P. v* X6 _4 R3 p原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
5 M; i" o( ]! u$ c7 Y: Y& c" ]$ E2 [: t+ e; J
1 b; ^- A6 m1 g) e+ t; n+ P |
zan
|