- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569711 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176136
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
2 P3 h2 Z1 m( e3 J. G2 v9 Q- f( x7 S! A1 ]1 F% ]
背景
' s j' c- R: g* P7 \" a初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
3 T3 T5 n) z* w/ V) O
* w% d/ x, B& H【神经网络分类算法原理详解】
3 k1 F! s1 S m
% q+ V# M& |. X j3 \% S注意) u6 g, v# K# ?7 y! H
站长提供的图片有点小问题,我们更正如下
5 h$ L! B1 R' l. z3 }2 @4 [7 c' ^; h3 _# X8 A
- G1 \9 u, J0 _; h ]2 |
% N9 B2 p- ?+ B4 E# O: M4 _3 i问题2 N; x$ |# Z8 f6 T4 A
根据上图所示,我们有已知2 ]; O; H. G+ j6 K& O
4 ]2 y; J( J) |* g6 w4 W
#输入层
4 S; i# |1 O/ v$ l) z5 k0 x2 Xi1=0.05; e r' [4 }0 J6 x
i2=0.1
( w1 c8 d" f( s/ F
' S7 j+ w# @" W9 E' ]#输出层6 N0 ^0 g( K! S" f' `& |8 C# I4 \2 N$ N
o1=0.01
4 e2 W; ^+ M. x; S% [o2=0.99
& Q0 a. b, U3 @4 }! W这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
. h' j$ q2 M0 I% {, I1 X, U+ ~1 `; h7 J+ _9 ?
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1* q! b4 |8 S; g: k9 W
. L }. z0 ^2 r S; v
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
, d0 N; l' Y( J A6 A) q# s* p+ m+ Z* Z
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出6 ^6 Y; M( {/ k( i) @$ e
" [) J6 K! U0 s9 L5 W6 h* S
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)): U3 P+ U1 O0 z
5 [ W# Y) k Q8 H; A
同理
( a. L: j1 m) q
3 @ R" @7 R* ?4 g: ]神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))9 v; S8 Z9 P0 p' X
$ u- G3 K# k" H n9 a! p接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
: g0 w4 b' D; O/ L" m! {
4 m7 T1 a# t. _, {神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b23 _$ J8 ^( K& [( U0 _# }
* a+ Z$ Y2 w6 T% p; z神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2$ U+ J: V7 A% Y$ ]7 k8 h
- v: d" i5 h* P. V再经过非线性变换Sigmoid函数得到! ?4 V( r0 k0 H0 {( m* T# m
J) F( Q+ \8 e6 J
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
) S; o' X$ P- G; X! P7 o& m" A5 l6 b( ~. f& X% M8 ?- t8 J
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
6 ^- a7 F2 N& O
- D' I" O1 d+ ~4 {+ e: Q/ d我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为3 o. l# y0 m |9 k0 d/ ?- V
6 U' z- s( V5 r. |0 b损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2: S {; h) s0 B( h3 F$ ~
2 e9 T$ P4 Q% q U
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
, B, a* T/ o6 a3 ?, |' I' C3 Y6 G* g9 c) t
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
! p. s/ |9 _% U) r) B
; J5 l) d" W( D4 {) O学习率 (learning_rate 简写为 lr)我们设定为0.5. v7 P& e0 [$ Y
2 x3 s' d2 U1 D. M. F0 e
依次求解代求参数4 u/ ~! W4 n# Y4 d% F0 N8 R
9 n9 z& I# C4 v# {! q- cw1~w8,以及b1,b2
) y8 q' R$ r, g% K+ V; w1 ~) @) G. y0 a- \: A6 Q$ [* {" m
跟2 t" C: |0 v# y- P, t
9 H8 R* z u( h- O- q
损失值 (eo) 的偏导数! r# S9 F' M2 ^
; h8 M% k0 [& \# J( ?7 `# `再更新该参数,更新公式为4 x! `+ b5 \" Y+ D2 [5 w3 f
2 I* m' v; N, @9 y7 @6 u2 |( \
参数_new=参数-学习率*偏导(eo,参数)
" Q! X& P8 w+ g随后进入下一轮学习
8 l9 s1 ?2 S5 V( M, D8 N& P
) i; f0 c$ l& W8 D F$ ?# ` O+ V终止条件(满足其中一个即可停止训练)- N8 S, V' f, b. `1 O
k: u# E5 {/ i5 B f6 O: d; l1.学习次数达到上限 t' J+ |& \0 `& C* ~
3 l. x( t" z; [ M2.损失值达到可容忍的范围
' x; }& W2 K$ r, n) z1 J# q$ v8 N5 q- d0 @/ S$ i8 W- N) O
导数
( q' n9 Y) a4 P' r# T& V: ef(x)=1/(1+e^(-x))的导数是
5 e5 e5 p# v- @$ C y+ Tf'(x)=f(x)*(1-f(x))
& \8 U' b/ K- J0 Z8 ?源码+ L6 B9 v" ]; D
import math! }* @$ y- R+ y1 F: z& z Z
/ k; B4 L# z5 K$ q" a- J#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】# @ Q* j4 j1 S+ P% [3 l) L7 w
#网址中图片有误,请看我博文上的图片
' e T4 H! m4 G: L7 P, `, y0 N% O- q" D( l! {+ M% w+ `
#输入层
6 P! B7 n* ~0 d! B Ci1=0.055 A; u0 ?9 w" A# z! C" n& G
i2=0.1
. ]- S( w m/ w, e' G0 A#权值参数; |6 S2 R" `$ H
w1=0.15: }( h1 }! \* o1 t- v
w2=0.29 V( b! V9 U) N+ W0 O) u G$ n
w3=0.25
/ h$ F( D* U3 Q; Ww4=0.3
: R ^1 l& X7 [, g- vw5=0.4
: |1 I- Q: ` Y. hw6=0.45
$ J9 Z8 ~# s7 i3 r3 d1 Mw7=0.5
" w: M8 o3 o( [( {w8=0.552 g5 X. g Y5 h3 J' P
#输出层标记(即期望值)
4 [! r/ M7 T# K' o, fo1=0.01+ A- }$ w( e6 `/ m4 b$ p4 e" m% v* W5 N0 Q
o2=0.99
5 d3 j$ I" h0 q; k4 M! H8 Y#偏置项参数8 z/ _5 \9 K/ i P) ~+ h1 E, q
b1=0.35
+ A% w, h& X0 X g; d) ib2=0.6: g' o+ L7 K! m; G1 J8 q3 S
' B. m( Z9 Z6 z
#学习率% n: n" B9 H+ i4 H" [
lr=0.5
& N3 Q2 X; E& T9 Y/ V' v2 w#学习周期
) P5 u8 J# f( U! n- Q" z9 Q! R5 Flt=0
j6 w# d1 m% P0 L3 S9 cmax_lt=10000
: T, T" f5 \# A#允许误差* R- L A ?$ B% m& ]# G
eo_allow=1e-5' M# Y/ z* Y7 ]( J
! `: d# u' {8 V. K7 D
#线性转换) d, i4 T0 X+ y9 A! {; ?- F
def linear(w_one,w_two,i_one,i_two,b):. B% U: t, b5 O2 ?; X2 ]9 R
return w_one*i_one+w_two*i_two+b, Y6 {, G8 m8 v' [
#非线性转换
! v: P( Q3 ^3 J6 _7 `" R1 {- O4 pdef none_linear(i):
1 |9 K: @+ X) l1 } return 1.0/(1+math.exp(-i))' i% p9 b, z% B1 O) |( _
% ]6 B0 F8 d" m) e
print("训练开始")0 z& p1 O) x# P1 `6 d; k
#学习周期结束前一直学习
. \0 L8 X8 m- @while lt<max_lt:
; o) \/ u2 m3 P lt+=1! s4 I9 i f0 }) `
#求h1和h2输入值
% y7 x9 ~1 ^4 Q: c; Q9 ], a/ m hi1=linear(w1,w2,i1,i2,b1)
% }* h+ B) a, v3 B( G hi2=linear(w3,w4,i1,i2,b1)
4 Y! @% c& P' `( m: S #求h1和h2输出值) L4 A5 y. D1 J* H
ho1=none_linear(hi1)9 S% A. G. _) f# u
ho2=none_linear(hi2)3 {/ @: w& ~2 h8 G x" q, D' m
#求o1和o2输入值
* O& W: O( e% A0 W2 L oi1=linear(w5,w6,ho1,ho2,b2)( t- F( _: N% z6 V" n3 U$ t
oi2=linear(w7,w8,ho1,ho2,b2)0 ]/ A; D) s6 I% D8 s/ n
#求o1和o2输出值
! \0 ?6 `3 @2 y oo1=none_linear(oi1)! s: q( `" z' O2 w* w5 x% F
oo2=none_linear(oi2)
5 h+ D1 P3 O/ Z& q- k$ c
. _8 O2 U3 L$ R: _$ v0 ` #求当前计算总误差- F9 g5 J$ p4 i% z
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
" n* L) G! D6 ~8 @! e5 `3 k( T print(f"第{lt}次训练,当前计算总误差={eo}")
" u; I) t6 z' @/ a #误差已经在允许范围,退出训练2 o, z. f1 j/ l; R
if eo<eo_allow:
3 r5 z+ Q8 @. N3 [( M% m4 N print("误差已经在允许范围,训练结束\n")8 h2 ?& n4 @% q5 s3 @
break9 B/ q8 i5 r. K5 O: w6 c* c
#偏导
7 i# h z/ N9 @. t9 @0 n d_eo_oo1=oo1-o1
& c) M! H6 q: z; Q) r d_eo_oo2=oo2-o2$ M+ R0 O; d9 T! `1 I
d_oo1_oi1=oo1*(1-oo1)
1 `, V5 `) H' |$ U+ Y d_oo2_oi2=oo2*(1-oo2)
) o3 K) B( D4 |, n! J d_eo_oi1=d_eo_oo1*d_oo1_oi1& k# V" m1 Y2 f" n$ _- p5 z+ t! s# @
d_eo_oi2=d_eo_oo2*d_oo2_oi2% w2 c s) i: l `/ a
#求w5_new) b% O, t4 G4 f- _
d_oi1_w5=ho17 n/ y, J. u/ G/ m& o! _( ]
d_eo_w5=d_eo_oi1*d_oi1_w5+ E: t# z4 U7 N
w5_new=w5-lr*d_eo_w5/ j0 k% U& w4 z2 m$ X5 M& E
#求w6_new
. E- a4 d) e. F1 O( } d_oi1_w6=ho29 S! K% Y- @ H, j3 F
d_eo_w6=d_eo_oi1*d_oi1_w6
8 I( |& Y, J* G1 N" H) K; z w6_new=w6-lr*d_eo_w61 x9 ~$ V/ N, v" s. s3 z
#求w7_new" S- `( z' S8 u2 Y* _# r# B1 y+ n
d_oi2_w7=ho1
, b/ v6 C) u: L9 o$ x$ Q d_eo_w7=d_eo_oi2*d_oi2_w7
# ~, h& \0 H9 r* T& P! x# V. z w7_new=w7-lr*d_eo_w7- O& r# }) X& U1 f- T! m# M
#求w8_new
1 F1 S7 |2 |% H l) ]% J$ @+ X M* u& d d_oi2_w8=ho2
. y# O% k1 `- R: p; n$ ], L$ i d_eo_w8=d_eo_oi2*d_oi2_w8# k' |5 A( z/ k* D7 C2 n; B2 l3 k+ ^
w8_new=w8-lr*d_eo_w8
( n) B$ b6 S" [# S #求b2_new
0 l8 ]6 K+ M, s0 J) s8 ?1 d d_oi1_b2=18 G( k6 u2 {) X C
d_oi2_b2=19 ?+ G# G% ~$ r, e
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2. o& D G6 m, p/ K& A. h
b2_new=b2-lr*d_eo_b2; C. \- M4 E' r/ P* K: x+ J
d_oi1_ho1=w5% }2 T" v; h: s# X
d_oi1_ho2=w67 C1 [% y& }6 X$ W2 j+ w: u" Q
d_oi2_ho1=w7
3 f4 @7 u2 G) N; [/ B: } d_oi2_ho2=w8
: a' `3 n+ U) g% B1 s d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1& H# H b% _9 e# o! f9 l6 g" J& c0 w2 V
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
) W) \. w$ i: C! o d_ho1_hi1=ho1*(1-ho1)
$ N! J' x( L/ c8 b d_ho2_hi2=ho2*(1-ho2): L' B! v: ?. H7 Z
d_eo_hi1=d_eo_ho1*d_ho1_hi1
* [+ i3 T5 x7 C0 S: w. @ d_eo_hi2=d_eo_ho2*d_ho2_hi27 E2 B+ {% W1 D; H" z
#求w1_new* `0 q5 a1 L9 d% {# _
d_hi1_w1=i1
/ H" J) \ I7 [9 | d_eo_w1=d_eo_hi1*d_hi1_w1
6 @" u) J* n2 w2 f7 w7 z1 g2 X7 g w1_new=w1-lr*d_eo_w1
* F0 K, G6 N" B% y( V2 Q9 D #求w2_new; [, F! W. G# ^0 X/ k: {2 ?1 ~" t3 E
d_hi1_w2=i2
! k+ d& v2 x1 \6 ], Z d_eo_w2=d_eo_hi1*d_hi1_w2) {& s4 p. E; J5 i
w2_new=w2-lr*d_eo_w2
( B8 n% Z, Z7 H% R6 e #求w3_new9 q* i3 w6 |8 O
d_hi2_w3=i1 b$ L6 g8 \! ]5 ^$ T" R# r) k1 I
d_eo_w3=d_eo_hi2*d_hi2_w3
' \1 n5 H N: \* r @: \ w3_new=w3-lr*d_eo_w3
( y7 @) h2 A3 `! e! y# G( H4 F" W #求w4_new/ _' l" W+ B! i) P
d_hi2_w4=i2
, d' L+ ]- G1 g d_eo_w4=d_eo_hi2*d_hi2_w42 \! _% F; W) X2 t+ t
w4_new=w4-lr*d_eo_w4+ q3 R/ ^# M# `: b1 N O
#求b1_new3 E* e# _' _0 ~1 x% A6 g6 F: `
d_hi1_b1=1
6 m( F% y& I7 U2 u+ W0 I a d_hi2_b1=1
4 e! y6 K) w, I# b$ U" z' g d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1" x, `' O8 D2 G2 J. m
b1_new=b1-lr*d_eo_b1
. [- X ^ W7 j; g0 w6 [ #更新反向传播1 _$ |+ {: M- L8 y6 @ w
w1=w1_new. ^9 Q' Q( _: S# ^- Y
w2=w2_new5 I0 S; Y9 X6 r9 z T6 M. s
w3=w3_new
% h8 Y( J w. x) D3 _/ \ w4=w4_new
2 v/ ^- @! \2 e* e5 V+ G k5 i6 n b1=b1_new" H& K+ K' V7 f% \" \6 ?3 Z
w5=w5_new
; g; A! Q, ]6 ?% r1 `/ I# m2 H( D w6=w6_new
7 x0 S* v+ c, d$ p+ C9 c1 U- n% o w7=w7_new
# a% Q& e: l! W" l w8=w8_new0 S* X* ^' k* F9 S5 O: I- V6 S
b2=b2_new* C) Y* D9 K9 j0 O) b. d: m
print(f"当前计算总误差={eo}")4 x2 n% G2 m7 U/ k i; u: a
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
6 d0 c* W; c( O% _print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
* r3 q9 ?$ `* R9 a. K' Uprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")4 O0 ~$ c6 N L# d; M
1 ^. S( c. l8 f. E4 ~8 d6 A3 D- G结果& k! Y& m' g8 t: h0 I9 f4 z: b
# w' W: s. b" r2 w' Z4 r5 f
, O) o$ D5 d# Y8 Y8 i
结语3 E: A7 c! |8 u+ o) i$ V
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 J7 X& z" @- b3 V
9 _6 p' d1 I3 Y8 p# _( ]4 t: S补充' w% c1 F) C. L4 q9 [' K* s( ]
程序中d_{a}_{b}格式的变量表示a对b偏导
$ {$ m' K2 N. H————————————————7 c: U( @7 @. G& m, y2 h6 p5 N( v7 H; ?
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 s j. ?% e8 ^+ R5 A9 m
原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679543 A0 k8 ~3 ~1 T7 S$ C5 W
$ O& ]' Y4 l! j* M# Z! O$ h6 I* ~9 v" J8 _+ Q7 E
|
zan
|