- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 567264 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175402
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)4 ]% ?. A/ [# J( u
+ Y/ S' R) f/ `. q背景
1 G$ R2 v4 h! F: f c初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
, {. v5 p& c; t( }3 r+ N! w: l. ~7 v R( D4 Y
【神经网络分类算法原理详解】7 p4 `! o1 q' ~
% I7 c& E9 A7 k; S' P注意1 L5 J- ^! O/ ^* k4 L. |" I
站长提供的图片有点小问题,我们更正如下1 W- G* [, S1 ]! u# l# U$ u ?. Z
* x0 x$ V1 ^0 n! w2 ?
; ^8 y8 q, t8 {+ {* G% G! g. L1 W
5 ?+ K H0 z5 x( ~8 k [问题. G) z% p x! h" I5 P9 t6 h
根据上图所示,我们有已知
2 M* W) g: e# A% \) E# Y7 O4 E& |, H u( L) f; x1 y
#输入层7 f0 M' P l8 V8 ^
i1=0.05
! @8 z" w8 o( V# k/ Si2=0.1( l5 ^# A$ d! }% r+ q8 t0 a7 D6 @
3 P7 r- W, G x% m
#输出层
+ H- E2 X: o1 w9 {, x- po1=0.01
$ Z( @( @3 p( o6 so2=0.99
6 R2 p* G/ \" Z7 ~* p这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的8 o2 |9 \# o2 U: y
6 }) |6 ?+ `$ B& H
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1+ P4 m) D% d& j5 J
% X7 G# w- W7 v/ L+ B* N
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
. N3 l6 C! u0 Z+ I
) O- N8 a' S0 r# G神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
+ q+ P. u% B( F& T2 P" Z- [! L# Y) d2 @9 e- }0 l- \+ M
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))- _% s8 K$ ~% j3 N" e% a# v5 @, t! |
; k/ }1 i' i. T( y同理# z+ g: p* M2 v$ \- N
' P" \! E( D, [- w* Y8 T) C神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))8 F: F8 J) Y! X
c+ v5 u) c5 c: m) v8 B1 B9 V
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
; N$ }5 |+ b6 J, d) w) ~4 l [
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
2 s( a9 h" S/ G' w; l; t$ u, i9 z; M6 b" D
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
3 H5 d8 E2 P; \) ?; u( I: ^6 B- t
6 y+ }. Q: d2 W$ C$ \$ n# O再经过非线性变换Sigmoid函数得到6 e9 `! _. w$ ^8 b! p9 c
0 k$ ^9 r5 |, x; ?# W; W1 }& ]+ u
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
+ T) I) r$ q8 u+ j! ]8 j `0 ?# g# I# P
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
1 z" j' x! P/ r: u" f! A4 I/ F
) B- ?' y, W8 O S我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
5 s6 t6 b) D. `4 l) \
$ A1 d& k' p7 L2 | t/ x损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
; y4 F. k: K+ D. _( G5 P+ t
5 A3 X4 L1 u: I0 ]由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足5 v( D4 z5 o1 X: S( `; o2 H
1 p' }1 I& P( t) i
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
3 H( r5 x& a( U8 H( Q" z6 S1 A7 \" m; }9 [2 ?& {
学习率 (learning_rate 简写为 lr)我们设定为0.5# q, m% J2 y4 s0 W; e6 m
, n8 E k1 x; n, q9 @依次求解代求参数
3 b3 s% ?" b/ e/ P4 Q
8 h/ A; z, b1 g. dw1~w8,以及b1,b2! G: T% a3 I9 I, e* X3 ~, A* Y
6 W% O; t6 N3 `2 K跟" _+ V( d3 m; N+ C; n9 s
6 `' W) T$ {% b' ?# _; b0 t
损失值 (eo) 的偏导数8 l9 Q" {; ~& }8 u
2 s. x. T0 `% o- ~
再更新该参数,更新公式为
+ q% Q7 ~0 I5 G @9 F, i" G N: E, i' ~
参数_new=参数-学习率*偏导(eo,参数)
3 n+ J j- Z" e ?3 i6 h' F- [6 r随后进入下一轮学习
! o0 t' D9 v8 o7 C- u: r' `1 a% k9 }/ ?/ L% P9 M. ^( l, t1 \1 S
终止条件(满足其中一个即可停止训练)
! S5 w! W6 D6 E% J$ ~
5 o) D9 n3 M4 z5 i2 C# f1.学习次数达到上限
" ~+ a h+ E# `" y* O Y
% B0 ?9 Z2 |& z) }8 m' _7 q! v. K3 a2.损失值达到可容忍的范围' {4 V- J4 H1 m8 _! r& G4 V& c
3 M, V$ _2 k5 m% V5 v5 Q( y导数
! E$ c. l/ N) [% q7 _" Jf(x)=1/(1+e^(-x))的导数是
* w6 W5 F6 ^8 o9 R* Xf'(x)=f(x)*(1-f(x))
# |2 A! p" J" j d- l5 K源码
# D1 k* m6 F5 N- O$ H# h9 Bimport math" M& J% Z$ V$ U* U9 ]
& r5 [) j' u+ H+ f- D2 o#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
8 \' z. @. f3 t+ B6 v2 C#网址中图片有误,请看我博文上的图片
$ L3 ?6 x6 \* m9 J+ x/ Z( t) c$ g, t; t. l8 g8 l1 Z$ O5 R
#输入层
) R v4 `; r: oi1=0.057 m$ N! ~) R+ l3 C5 }5 \" a( x
i2=0.1
; }" b/ l( c: }9 _+ S1 v#权值参数! f3 `- x% a0 |3 S* e" I
w1=0.15, n$ M( J# _+ G) X4 p! z/ s* ?' V
w2=0.2
$ M. E" y* \6 v" V" y+ l' j& l& nw3=0.25+ Q, [+ v( W1 l& R
w4=0.3
I' t) \2 `& E3 _w5=0.49 r2 h1 B- t( b2 g! d# d2 R2 }' n
w6=0.45
: i8 o& G* B0 I9 m, {8 J$ [: r4 Yw7=0.5, ^8 b# o) B: M/ d
w8=0.55
/ y; ]7 O0 z# I) j/ K, z#输出层标记(即期望值). q' @. b$ m$ H
o1=0.01
2 \; Y. j/ k' j" e5 J. `8 c0 Zo2=0.995 S \2 b' y, K
#偏置项参数3 r8 N+ L; J' H0 p n% D
b1=0.35+ t7 N& v. h3 {- t
b2=0.6
3 ?4 B9 g. _4 c7 V) m/ h' _; s/ L4 g# M; }& `7 |4 \; d9 R
#学习率0 i9 ~, s9 a! Q9 ]! m1 b& Z
lr=0.5
6 {& O- \' q! h Q#学习周期
% R+ E4 \, }1 {+ R3 B1 m0 Blt=00 H: J# ? e/ `6 W. M" r9 B- Q, e
max_lt=10000
' E* _) T" s- o+ K* [: r# F#允许误差6 b- Y( U5 q+ z4 \& J
eo_allow=1e-5- N# K- K- ?; K8 X2 `8 J
" a. U$ o( m% t" Z3 Y#线性转换3 k2 W8 n- | c. _# T2 Z: j
def linear(w_one,w_two,i_one,i_two,b):
- a. R. h( B1 [- g return w_one*i_one+w_two*i_two+b
# c* M" ]9 P% v#非线性转换
0 `! Q: _& `. o( pdef none_linear(i):: y* H8 _ T- g" H7 z1 ]
return 1.0/(1+math.exp(-i))
( i$ j4 r; ~9 N% n; f
) e; t$ n3 v; vprint("训练开始")
- l& K; N/ v" }) a# X, T. V# d7 M2 u#学习周期结束前一直学习% q" i4 Z9 y( c5 [
while lt<max_lt:7 E, G# L! `0 P$ d2 n! }8 X5 m7 N
lt+=1" C. Y% W* v7 x- P1 W) I
#求h1和h2输入值: j. B3 x1 q) d! t. a
hi1=linear(w1,w2,i1,i2,b1)3 A# }- d0 U" g- n- P
hi2=linear(w3,w4,i1,i2,b1)" K3 r( X( H1 A* A" ^/ C
#求h1和h2输出值' Z+ j% H9 R& @1 c0 T
ho1=none_linear(hi1)4 y- b( j6 ~" x# o% X. R+ e6 b* r
ho2=none_linear(hi2)
/ p& i ^% a2 H! L" ~) x #求o1和o2输入值( _7 Y4 G0 S9 ^% S5 ?9 P' f' K( h
oi1=linear(w5,w6,ho1,ho2,b2)
4 p, z3 l) L& h0 F* Z, R: a oi2=linear(w7,w8,ho1,ho2,b2)
4 U6 F) c" \/ P+ H6 @$ N #求o1和o2输出值. a9 v" B8 x0 m* ^
oo1=none_linear(oi1)
+ s7 ? ^. n7 y( `. |' M oo2=none_linear(oi2)
. F- q/ d% M0 [; t; @
+ O0 [3 g' Z/ a8 C+ m. } @ #求当前计算总误差
' X, v. u$ K4 e' B" b, a eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
" C+ v% R$ j$ @3 \+ f, |9 c1 b print(f"第{lt}次训练,当前计算总误差={eo}")5 @5 J8 p# b+ ^
#误差已经在允许范围,退出训练/ F; H6 ^- N* q: c/ z8 b- M
if eo<eo_allow:
; v' u1 h- u7 B* M& U- E( o& T print("误差已经在允许范围,训练结束\n")
9 n9 D( y& ?) N- l* ] break
1 O# c5 ?5 C$ v #偏导
/ B( |' r' C% `8 b; r1 { d_eo_oo1=oo1-o1
' }5 J. {; ^: }. E d_eo_oo2=oo2-o2 w2 o! e( y) N+ C+ B( Z5 H
d_oo1_oi1=oo1*(1-oo1)( i" e" i' U N
d_oo2_oi2=oo2*(1-oo2), B$ `2 q% {% i& `+ N
d_eo_oi1=d_eo_oo1*d_oo1_oi1& c- m* N5 z2 \5 C1 P
d_eo_oi2=d_eo_oo2*d_oo2_oi2/ @" ?. b, j. u4 Y4 b
#求w5_new
, i3 H3 @( D- B" I% r; Y7 h d_oi1_w5=ho1
6 C9 A0 a# }9 U6 m d_eo_w5=d_eo_oi1*d_oi1_w5
6 }6 B' o5 Y A w5_new=w5-lr*d_eo_w5
/ s" L8 V0 A; a9 m# { #求w6_new( e" _$ |& o$ `, o
d_oi1_w6=ho2! p. m" Y+ K0 |% D! A' \
d_eo_w6=d_eo_oi1*d_oi1_w6
c4 ^2 y+ z' I Q9 y& x w6_new=w6-lr*d_eo_w6+ `' W2 z9 `0 ~9 j7 T0 ~
#求w7_new/ K( ]) D1 y; e, u; o' M9 A
d_oi2_w7=ho1: n+ G$ Z: i6 B! P
d_eo_w7=d_eo_oi2*d_oi2_w7
0 P7 V Y3 R" J# U9 e w7_new=w7-lr*d_eo_w7+ j- q# D9 q6 S r' Z' u$ Z4 U
#求w8_new( c/ y( ^5 M: C
d_oi2_w8=ho2
3 @: [2 h8 w* P+ e7 v d_eo_w8=d_eo_oi2*d_oi2_w8
8 u/ \4 T; g6 G4 Z1 G1 o w8_new=w8-lr*d_eo_w8
H; r! j- ~* e( _ #求b2_new' v0 ^- r/ o5 H, h. V7 q. U. z
d_oi1_b2=1) |, z9 a* Q% A( @' d
d_oi2_b2=1/ |" c& K& |9 n5 q( i6 @
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2! Y4 x2 v; [7 [5 e
b2_new=b2-lr*d_eo_b2
5 y2 U* d, H8 ]3 j" {. Z; ~ p d_oi1_ho1=w5( P9 x* |- i# u
d_oi1_ho2=w6
5 W K& w( _* P; ]1 R d_oi2_ho1=w7- ]+ Z2 E1 G& b6 c" c+ ~" H
d_oi2_ho2=w8
. R8 {+ x0 \. k3 X5 B* T$ I0 O d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
$ j: g: m; x, i% e d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2+ o7 {/ R& v( i- X
d_ho1_hi1=ho1*(1-ho1)5 U& I! Y9 I& O2 F: j0 R
d_ho2_hi2=ho2*(1-ho2) n/ m; v8 p" Z8 P
d_eo_hi1=d_eo_ho1*d_ho1_hi1
" h. H$ k! ^9 v9 T6 p9 A1 u+ [ d_eo_hi2=d_eo_ho2*d_ho2_hi2
0 O: B. H- x! ~0 T# S, `" M7 Z #求w1_new
# Z7 [$ S6 }, U: \" p* [ d_hi1_w1=i1
6 k9 g8 K v( j9 d/ `' s& n d_eo_w1=d_eo_hi1*d_hi1_w1
# [- n) l. } X# n/ [3 H9 g w1_new=w1-lr*d_eo_w1
$ H+ D* J. E& W$ g #求w2_new
5 B9 g6 b4 n* u* L7 [) T5 T* v1 L d_hi1_w2=i2
% N' K) N+ b* c& R$ U. {" Q d_eo_w2=d_eo_hi1*d_hi1_w2
2 h3 p; C @5 t* D1 | w2_new=w2-lr*d_eo_w2
, d6 v1 s; U8 n) ] #求w3_new
- f9 N( v& K6 w3 D d_hi2_w3=i1
% o5 J1 u4 W) A2 Q d_eo_w3=d_eo_hi2*d_hi2_w31 y: k3 [4 K; y2 L8 @- d
w3_new=w3-lr*d_eo_w3( b$ Q- X$ Q5 T7 h* ~
#求w4_new
& v8 _" a |# w$ c' \$ j' ?4 ` d_hi2_w4=i2% ^- L* t! J) s- a# u& L4 O
d_eo_w4=d_eo_hi2*d_hi2_w4
; U1 R; ?( u4 I9 M# h* `/ p" D/ m w4_new=w4-lr*d_eo_w4
$ d5 U: ^ V4 b #求b1_new
, t d( C# \+ f, R4 t* o d_hi1_b1=15 ?6 P& {/ _2 F+ a* G7 p% ?
d_hi2_b1=1* e! [4 l9 a3 N6 G& U3 u: S, S
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
6 D; r% D- c6 }1 ?2 E b1_new=b1-lr*d_eo_b14 r) g8 ^: F* ?; C
#更新反向传播
2 f9 a/ e- @( n% W% r1 s w1=w1_new" A8 ?; F$ q. G% v9 n* n
w2=w2_new; d4 ]& Y5 D7 Z o! z: w6 N
w3=w3_new
+ b4 ?3 h2 c+ `) i9 a! }; B5 [' ] w4=w4_new
5 }- O4 f, T# C# o5 v$ c b1=b1_new5 c8 W. t h5 z8 s9 s+ ]
w5=w5_new
5 U2 A9 ?. F9 x& p w6=w6_new8 K3 L+ Y" h( Y3 G* m
w7=w7_new) m4 s* |2 q$ D6 p/ T* e
w8=w8_new
1 y) D1 `9 d2 j$ p9 n; j5 } b2=b2_new; c+ g' Q4 P$ K2 L1 G( v5 o
print(f"当前计算总误差={eo}")7 \7 L9 y. `/ y$ o6 K; B# Y7 l
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
2 W2 b* v" ]5 J+ Cprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
" o# ~& d U3 [' xprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]"), j& h7 ]9 Q8 @- C6 f
4 _* |7 [" l+ C( R
结果
: d: @9 J+ l) D" z8 y. L" n- `
; N( u8 ^. G w' h' g! j. g, j& P# S# s$ q- j! n' h
结语
* X& H5 L4 K- Y' L可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
) }' y0 f+ _3 f3 Y m5 N
: ^& P7 |+ x7 C: ^ n+ ^补充
1 e! \) K0 }% H2 [/ U" U程序中d_{a}_{b}格式的变量表示a对b偏导
" y, J# _6 l' ]+ \————————————————, e6 f$ q* {: L( u# Z7 F4 t; n
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 C8 S9 j3 c# G5 o8 g原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
, _% j3 I# [1 O. T; }' |/ `8 C5 L
4 e) p% L) g/ \, T# I
) V/ V1 J1 z2 W$ b! x2 e( L |
zan
|