- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 554595 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 171751
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
) R) J0 s( `/ S& ]
1 b4 `; i; Q" @/ J0 Y0 g背景5 o/ ?2 S7 a' t$ B
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
. ~$ p6 i: t% f/ w: a
& V, S7 p; Y- `( }! o【神经网络分类算法原理详解】+ m" _+ S# ?; h9 W2 Y; J. F( V
9 Z, N, r* {- s& y, c' M+ [
注意
" i4 z0 w# g& e; y1 H4 N/ p站长提供的图片有点小问题,我们更正如下& O. k# i! \, p) ?9 k/ X0 }
* d6 A S1 e: ?" v3 }5 @" e4 W
( S9 M4 b% H3 C3 Y$ ?. Y
6 `4 i9 @7 U1 I问题% Y$ v) s& R5 p9 B/ b$ F" f6 T7 ^
根据上图所示,我们有已知! H& B% @0 R* G7 U4 `- O6 q" b
# n H7 o/ X1 u" w
#输入层* f$ U3 N8 R0 B" c* p: m
i1=0.05, @7 D w7 o$ M. U) m! p7 o
i2=0.1
# p2 D2 t' r1 ^" O8 |& Z2 q, O; w7 F! h( k4 A& U c
#输出层
0 t* E3 g8 H9 r# o( ?2 S0 `9 l3 eo1=0.01
3 c( S& h: W+ D: |) v; y+ To2=0.99
" ~, p: V, N/ t9 Y这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
8 K2 N! w1 A& ^! H
4 i# B3 D- w* B7 U神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1, A% Q. Q5 L$ U) b
2 H; r2 k9 v8 T0 e' k: A神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
5 S% ]& y: W- ^, Z
1 H% \, \0 P6 R$ T1 a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出% j4 F- I1 y' k- ]+ O
. |) g( ^4 E5 V2 L/ y y神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))7 m0 k" c" X2 ~ h: ?! g3 a/ u
4 j! a8 D+ }3 x9 }8 e6 ?同理
4 H. {+ l$ s$ o% I9 f) l" g w8 q% G
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)); J2 v: [, @% f# F
7 {5 \( w8 `5 z- F
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式! J: ?( j Z, f1 t. H o6 f
9 C0 B8 V r+ H3 G/ u; y神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b29 m4 S9 b3 I! r; p3 O% ]' d: \
5 o X" O; A1 q5 W' y0 `
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" g3 B3 k* ^* z* } C
/ i M- Y6 C3 ^3 v; B; S i
再经过非线性变换Sigmoid函数得到
0 x2 l* e) F6 X. `# r" ?1 \! M+ }; c) v x
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))5 S/ _6 z e2 ~. f! H" H; L- p
7 K$ b( Z* [" V& E9 f5 f0 ^& V神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2)): N1 ]/ M4 S1 X6 e1 i: E5 Z
9 s5 D5 x2 z. w我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
& ]) B9 @4 M) u# C* f
3 j$ X0 B) T4 ~ q" t7 ?, q损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
; V8 N) X3 H% a5 i0 j0 X( [2 l, Y- z! R" j1 ~
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足3 q& P z" y/ j& ]
7 [# _2 @# X9 U$ m: B; _2 U G5 b学习次数 (learning_time 简写为 lt)我们限定最大为10000次
- s9 H2 I+ h4 u" \5 h* Z9 w% ]9 F2 S
学习率 (learning_rate 简写为 lr)我们设定为0.5
* v# l; I! Q2 ?( [' P8 F) N6 Y, D) x9 ]) r& d9 E- ^8 U
依次求解代求参数. |; W2 R) x% U: [% @0 y
$ S8 D, B, X4 S' }
w1~w8,以及b1,b2' J$ L7 _9 W1 F
" c6 N. R$ Y6 Q" h$ j跟
: D; P p" C# k: b1 B1 E# c) ^- {. I2 \. \: h- N
损失值 (eo) 的偏导数
J0 S/ r/ A; V2 o
$ L8 @, @# s3 E# s5 R8 R再更新该参数,更新公式为$ |3 s" k, u8 h7 }4 T, p5 F
6 X1 Q, h/ W% p7 r& y+ g参数_new=参数-学习率*偏导(eo,参数)0 L. o. f6 G" E% f* y& ^4 n M
随后进入下一轮学习* u. T6 H$ t$ R8 \
$ K2 m/ K! W% z3 ^. j终止条件(满足其中一个即可停止训练)
7 |# Y6 ?# ]% z3 ^2 q( V w* z
1.学习次数达到上限9 |4 v0 B9 t- }% d% j* V
$ }/ @( {" n" W3 W4 W4 p* y. X% C2.损失值达到可容忍的范围
; p! L$ L6 L0 w/ A6 c
0 z- k6 N% q0 l) l导数
% m- O* E* l6 P: k& qf(x)=1/(1+e^(-x))的导数是
7 T+ I& C6 ?) O& \+ jf'(x)=f(x)*(1-f(x))
4 d Q" F5 V* ~' B2 \( k源码
- P6 o% K) Y0 B' c8 C8 {/ ?5 [import math, I8 x, Y; t5 C5 r' p9 k# }
) E3 k; T( p- p1 i) f6 p( v: N; V
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
$ {5 U0 O2 m, ?: H" q# J: J C#网址中图片有误,请看我博文上的图片
- a7 D2 F8 A4 z' X# }) U2 D+ J" `, b/ i1 y- v& K. X' ~: q
#输入层
* G4 k7 |: S6 q/ g( h+ k: x- q/ wi1=0.05
1 t I ?7 l% y2 a8 }. K) U; ]i2=0.1
8 i5 y* R+ ^: {" O4 W. S#权值参数
; s7 ?6 n& } P% Rw1=0.15* i0 x6 A3 f, T% w
w2=0.2) F- ]' S X" L/ m9 \% B; X
w3=0.25* x& D# Y& Z: i+ u
w4=0.3( o& C0 A" @+ [. w, L6 K7 g4 A
w5=0.4
+ y1 R8 }1 E8 T# xw6=0.45; w* ^$ Q7 \# w, ^3 _
w7=0.5) P4 S! m4 c# [* K! g2 r8 i
w8=0.55; ]( Z+ ? S. D4 O
#输出层标记(即期望值)+ G! C3 I( g4 G. c7 [
o1=0.01
# S/ G# `7 Y/ Go2=0.99; p- ^( N& i3 F, s
#偏置项参数
+ b+ {, @% B4 J6 z0 Zb1=0.35
; c% O( J! S- O( I7 X5 j; Pb2=0.6
. L0 a( T: ]2 S" s* W
7 B+ l& U( M. k" P$ e6 t! u3 C2 f9 v#学习率$ C0 u, \, J3 h2 k& E. T
lr=0.59 ^. [! C2 O5 n9 L4 G3 O6 g9 l
#学习周期1 x6 H- @8 o8 e' j8 P
lt=02 M4 Y d$ ?9 t4 h5 r4 R- V5 q
max_lt=10000
$ y+ a" Y: F9 U# t#允许误差& k7 M6 P0 ]; g3 m" P
eo_allow=1e-5+ `' I: }* q, \0 n: F
- Q* M0 r1 K: [' _, ^) [
#线性转换) b" ^% J( Y0 ~$ R) ^1 L8 o$ u3 |
def linear(w_one,w_two,i_one,i_two,b):
* p; F1 m ^9 H% y: H return w_one*i_one+w_two*i_two+b$ l8 [7 o" g! O) ^
#非线性转换0 e# s! H# u- q' @/ g: N/ Y
def none_linear(i):
# i% v6 i2 R( _6 L. Y6 x. M return 1.0/(1+math.exp(-i))4 {- t0 h5 O. j* |1 P; w
* G5 I" }2 {6 Oprint("训练开始")& i7 L3 |! G) x/ l
#学习周期结束前一直学习0 g" l( ~( { _* \6 J
while lt<max_lt:2 |: S6 D4 g5 T) j- d
lt+=1
/ z; c7 C6 e2 J+ a4 n: \1 e. e5 ~ #求h1和h2输入值1 \2 w' w( O* p6 n) `$ f9 |1 i
hi1=linear(w1,w2,i1,i2,b1)# \- w: R9 o) m0 j" d
hi2=linear(w3,w4,i1,i2,b1)
. v/ y2 p& J. j #求h1和h2输出值% a; p) K4 c/ `: h
ho1=none_linear(hi1)/ a4 V& z) F& H9 q
ho2=none_linear(hi2)
3 R0 h) q4 @9 {% B1 Y" T2 R1 h: f #求o1和o2输入值7 R# s y8 y8 X& ^2 }1 j. s9 w1 ?4 [
oi1=linear(w5,w6,ho1,ho2,b2)" e+ G1 v6 q) y w! U& o* a* P
oi2=linear(w7,w8,ho1,ho2,b2)6 Z6 w2 ]- W2 ~) b5 J+ l
#求o1和o2输出值) z* m. e0 o* E4 Z
oo1=none_linear(oi1)
6 R9 F$ H n2 N5 @! e: f oo2=none_linear(oi2)
" z' Y4 M# V. f0 p H, q. K
! O+ b0 l% M# N, c/ p. Q #求当前计算总误差 r) G w) `1 k
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2) A0 Q" ]! j" U( I/ J
print(f"第{lt}次训练,当前计算总误差={eo}")1 N, w: {* n% f H" ^( b
#误差已经在允许范围,退出训练9 j5 ?; s) } P/ P. M/ Z# P4 I
if eo<eo_allow:2 a: R. l8 R8 n+ {4 W
print("误差已经在允许范围,训练结束\n")
" }0 H0 B& l1 V" H V break
t U1 l9 R9 Y; j5 y- n #偏导7 B* x& x% u$ _2 e6 k
d_eo_oo1=oo1-o15 V( N7 [7 |) ~& V% F
d_eo_oo2=oo2-o2
5 U9 b7 r# ]6 V& z, [ d_oo1_oi1=oo1*(1-oo1)+ T! c% U* z$ t3 g
d_oo2_oi2=oo2*(1-oo2)/ V5 O. r7 z) u, k' `
d_eo_oi1=d_eo_oo1*d_oo1_oi1$ V$ |) ] U7 d, ]3 g Y
d_eo_oi2=d_eo_oo2*d_oo2_oi20 B# q1 z0 V* P: j
#求w5_new
$ X' Q F. C2 C( C d_oi1_w5=ho1* j* i0 v0 S$ }" |0 M
d_eo_w5=d_eo_oi1*d_oi1_w5
% j/ V; z/ {9 U6 g; e1 O w5_new=w5-lr*d_eo_w59 y9 e. ]& S, ]& R% w) D
#求w6_new
, U% |7 T0 ]9 i9 P d_oi1_w6=ho2% Z {: s7 H* W
d_eo_w6=d_eo_oi1*d_oi1_w6. c, J3 N6 X( R% J
w6_new=w6-lr*d_eo_w6" K! X7 j- j! j3 Z/ i& [/ q& J
#求w7_new
1 m E B1 n: h% {, f' J1 I3 q d_oi2_w7=ho1
% ]7 z. l' I) S" g5 w( o d_eo_w7=d_eo_oi2*d_oi2_w7
; C' |) A6 Y/ P w7_new=w7-lr*d_eo_w76 g9 s6 U( _& K" b9 ?" P0 ^4 M
#求w8_new
$ l- [9 b6 Y$ ]) S# V2 e& N d_oi2_w8=ho2; X+ _9 x8 [" A. t* P
d_eo_w8=d_eo_oi2*d_oi2_w8$ [; i8 @8 M% I2 J6 a2 g: ~( D5 I
w8_new=w8-lr*d_eo_w8
" Z# c7 q6 C7 e; E( S #求b2_new3 T' X6 A/ u% y, H8 F
d_oi1_b2=1
/ H0 d& s; S% P+ q7 W d_oi2_b2=1
( |0 D8 C- d$ }& C d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
% P5 l; X' T/ P3 H7 {+ t/ c6 B b2_new=b2-lr*d_eo_b2
w1 d5 b: r% d d_oi1_ho1=w5+ ^6 {5 i; O Y9 V4 _
d_oi1_ho2=w6
X4 O* X* j7 Y* h$ o d_oi2_ho1=w7
# U# p9 }8 H$ _3 _ d_oi2_ho2=w8
* y8 f! V% n; ]6 x! S, O* e9 ]/ m d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
, S* j% N" O! q; N$ R d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
- ^ G a/ H* L/ J d_ho1_hi1=ho1*(1-ho1)
; x; @; ~' [; m6 ?4 P9 A$ p* j d_ho2_hi2=ho2*(1-ho2)
/ \" O3 u- u' Q d_eo_hi1=d_eo_ho1*d_ho1_hi1% d: U* o- X+ s. @1 z4 [
d_eo_hi2=d_eo_ho2*d_ho2_hi2( Q* k* Z% r. h4 q# \, m
#求w1_new8 F# ^& D8 t; p
d_hi1_w1=i1
/ g/ ~+ r: V Y; E# }0 [8 {* ? d_eo_w1=d_eo_hi1*d_hi1_w1
) n+ ~1 U; }3 ] w1_new=w1-lr*d_eo_w1
, D6 ^" ^" d: e: T& D #求w2_new
$ k$ Q" b5 P0 R( U2 w% C$ | d_hi1_w2=i2( s J' W) W- v* R+ E1 h6 m+ X2 H
d_eo_w2=d_eo_hi1*d_hi1_w2
! f7 s# _) U4 l# v6 n, a- A w2_new=w2-lr*d_eo_w2% d2 V7 Z' t9 T# C/ {4 X
#求w3_new
6 J2 ^( L9 V- s$ z6 M/ ? d_hi2_w3=i1+ X5 k8 f" b9 r- w! u1 [1 s _
d_eo_w3=d_eo_hi2*d_hi2_w31 {8 j+ Z5 k* ^2 \3 ~5 A
w3_new=w3-lr*d_eo_w3
; ]( k a4 ^+ @9 t8 ^$ `7 V #求w4_new W2 e# P& c0 i1 ]1 Y
d_hi2_w4=i2
& Q- J9 I2 J/ X& G+ x) H d_eo_w4=d_eo_hi2*d_hi2_w4! V6 s1 L5 N' F: G9 K: ]5 m; L
w4_new=w4-lr*d_eo_w4- t8 p2 Q9 u& t9 N2 n6 Y; t
#求b1_new
3 T ^1 ?- O2 I4 z d_hi1_b1=1+ k3 h- ^. b+ G; K. r
d_hi2_b1=16 x& `0 Q7 B0 p
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1/ o! V6 L8 x# O8 N: C( l
b1_new=b1-lr*d_eo_b1
) G+ u% g* n0 k: @ #更新反向传播+ {+ i0 Z8 t7 A9 s' A: p
w1=w1_new
. g: `% d& A- l w2=w2_new; {1 o( C% n& z% C8 Z
w3=w3_new
) ~9 D% H% o, ?: t9 @% ~3 p( s w4=w4_new+ P8 H$ y4 w! ]3 ~ |
b1=b1_new
9 @/ d( X! r5 F+ G) y1 E% _ w5=w5_new6 Y9 ~- T; q5 z" ^3 t
w6=w6_new
0 R8 o d C9 Q$ B% g: K w7=w7_new
. f) h* Y2 t. c5 a6 X& b$ v1 G w8=w8_new. L! [4 c$ B- d8 n* x7 [7 R: a8 p
b2=b2_new1 b! C" A4 j9 Q5 w3 u" c9 a" Z1 ]
print(f"当前计算总误差={eo}")% V/ `- v- N! u1 k
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")$ j3 K+ j" [) F9 s" s) j
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
3 @$ u; O0 ^5 m( j3 R1 Gprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
# Z% I% \4 _* a5 q/ ?
! J7 B) E! N _. j结果
4 |) q+ ?0 f7 P5 `9 x3 z3 K+ ~
! [) V! [" u2 F3 `" Q6 V7 r, B3 i1 k3 Y5 o9 |
结语, R, z8 D9 A% b6 F s
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。$ S8 x, U8 p3 L& c2 `
/ j- c/ x- q7 r, m k6 j" L
补充3 ^6 G! |8 G' K
程序中d_{a}_{b}格式的变量表示a对b偏导
& O3 N9 Z; \( v0 N4 Z————————————————
4 m7 v- W& E! A% E4 H4 `版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% t; }5 S9 z, ], F# W1 x9 n原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
8 Q$ ]. U) p1 K
/ f) I: n& O" c5 ?1 g+ A9 R9 {% m+ E5 o! z! d3 P) g
|
zan
|