- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563311 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174216
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
+ {6 z2 d, r. C( { n& F
m1 {* c8 v& B! H4 J, x7 [( E背景
9 X' l) B% ]' f1 l初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
4 W! l9 d/ U. |" b' y& q
! I- E+ G# H: H. H7 G【神经网络分类算法原理详解】6 Z, I# @4 n! \2 |/ k. `' T
5 v2 m# P# r8 d4 ~' C+ |
注意
% _: K# {, @5 z& f4 M站长提供的图片有点小问题,我们更正如下3 U# C% |( O- c; L& l
* X# @7 D( ]) t% |) n8 L- c! o+ P' b1 |9 F$ f
4 F o4 H, Q- T: C @9 S问题
8 ?1 N8 j: O5 O# a根据上图所示,我们有已知
; O9 A$ {6 R+ m' u" _; ^' D0 K- Y- y, ?' m; M& l, ^4 E
#输入层
6 ~4 ~: D4 c# r. h9 N7 N/ si1=0.059 Y. m4 c; Q6 c& d
i2=0.1
2 T9 H: a% k( W7 ~: T9 U3 f, k$ y4 q+ x! d. L
#输出层' x+ h `7 \) u) _* e1 w# G
o1=0.013 M; y# m. W, V8 O! A+ f
o2=0.99; j, C) Q) l2 M
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的/ Z/ _/ z. f' x# u8 |
0 ], Q. |6 U$ ^4 q( T
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
3 |( k' F7 V& U3 ?; ]1 `* v- I1 V
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
: i4 q# V: P+ W5 W* ]- k: X8 [: D$ ]
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出: S% E) g6 k: W6 e, r9 `
. W3 ]* F! B( [, g) B- x5 n神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))3 X) o8 N# f/ s" L6 K$ [% y9 Z
; L$ W$ g# C9 |0 r" ^ P同理
: O- t j% E! u6 f6 a4 G/ m. a3 P: k
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))! r$ f, T6 ~& C& Z7 k
* D$ `3 r5 v0 |3 }& t0 B4 p3 ?2 B接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式 Z9 h* p4 @. ?$ O9 p, X
" t! m% Q5 ]3 P/ s) @$ B
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
0 C# R4 \9 N4 k9 L. C2 m% D2 G! J9 O, x Y# @
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2 ~7 b. c. E! o+ P$ [
) w- d9 n$ x" ^# b& f
再经过非线性变换Sigmoid函数得到
) `/ s1 V" F& e5 U) |- |/ K( z+ E% b5 I
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
# m6 }$ H* u$ P2 s) S8 e h; P: L0 U; l+ R( J
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))) [1 ^+ Z, J8 `3 }9 [
0 Z$ Q' @! w \+ t6 o
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
3 J% V$ l: ?/ @* F1 R! |& h9 C
0 b5 _! o8 l2 Q损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2- n( @1 [) [# ~7 m/ ^
: Q& C1 c3 v$ ]% E( U由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足0 I: \8 P4 |3 e
7 W0 G w. c. u3 m$ C学习次数 (learning_time 简写为 lt)我们限定最大为10000次+ I8 u, c7 O% X9 X6 j# v
" m+ L8 G5 [( M学习率 (learning_rate 简写为 lr)我们设定为0.5
& G+ {5 Y8 b# O2 T2 k) k& b3 @
0 b5 Z v* `8 z1 @6 `7 p9 x# u( O依次求解代求参数
5 Y% `# `* u2 s; ]9 e- b! F: x7 i7 `- R9 H# w3 ^8 N4 ^
w1~w8,以及b1,b2
( c6 w. ?6 P6 E' o: E- z
5 t7 e# t4 _" E! _2 k: J$ v* p跟5 ]2 U6 `* N5 C) Q @- C+ u
1 h+ \5 \. I& u4 p% w% ?0 ~/ B
损失值 (eo) 的偏导数
& G8 |; O9 ~ G- Q6 l" H! y* i# {, K9 o* s% m) E7 o
再更新该参数,更新公式为8 m$ i" L1 M% M9 ^
* z' a& ?' L. @( v; g
参数_new=参数-学习率*偏导(eo,参数) F- R1 Q' Z( c$ A% }; U# U8 O8 g9 W; @
随后进入下一轮学习) B3 U2 W* X" a0 O+ T
% C9 f/ D% w, |3 G终止条件(满足其中一个即可停止训练)
2 m' F1 n# Z% R/ [
3 h$ c& {/ Q+ b4 Q7 r1.学习次数达到上限
& a3 M2 B3 f9 @3 G$ U! t, C1 C2 ]( m% [* q4 m: c
2.损失值达到可容忍的范围, a8 B% v; d/ L) r m9 v
7 z: M, G9 j6 s% K5 \' f导数9 r4 ?$ M( X3 u
f(x)=1/(1+e^(-x))的导数是' O* p7 P( {/ R. Y5 W
f'(x)=f(x)*(1-f(x))
1 P4 ]9 H: y) n7 K" H4 C" o源码, P1 I6 v( r4 c% a
import math
& T. Z; N5 P$ i4 b: K+ }. ?3 D8 V8 m
* m1 K% K4 E2 N1 a#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
$ H! ?4 y6 ~7 m+ U$ b#网址中图片有误,请看我博文上的图片) A$ z, C5 i% g2 M+ z
, b5 ~' ~4 B6 U; m" A
#输入层
+ T! c1 {8 T; {, ]1 ji1=0.05: I$ h+ w5 H+ }: V' y% a }
i2=0.1
$ Q7 E2 O" \% x4 j; ?0 X#权值参数
) D1 E) c# f9 q7 k+ Q% \- i0 p. H; Yw1=0.15) Q" f- G1 |7 O+ N! r, \3 r3 W
w2=0.2: P" x: V2 K. r1 v8 k
w3=0.25/ y7 o- j+ g5 B3 u
w4=0.3
$ x3 w7 {& g: u2 C: bw5=0.4 O9 U7 X, n% i5 n5 o' u
w6=0.45
0 ?9 o6 q \$ \" {8 X5 sw7=0.5
$ v5 S4 ]& P! u6 q' qw8=0.55
$ d7 y, y$ E) G. B/ t% Q. d#输出层标记(即期望值). l+ R/ H6 C$ y8 L1 P
o1=0.01
# d: L$ E5 c) W, u: [& {o2=0.99
2 L5 }2 D5 X) {, S& b% R#偏置项参数
! r" ?% D. I( d/ m; n; z% N9 M& p1 Db1=0.35
7 u/ M- b& a4 n9 |# db2=0.6( l0 k6 c) U9 b, p, N5 L$ c; ?/ u
4 w& W2 f; s8 j#学习率
. u) i {% A: ^) Y+ J0 l" G& Tlr=0.50 _& V# T( w7 K4 }. _, J
#学习周期
" z- F# D4 M( f! }+ z7 klt=0! w) O2 L6 O' F5 H9 X
max_lt=100002 A: ]2 p! {9 C1 M% o" X$ M/ t
#允许误差" G' f, e# y, u8 P# ^0 N
eo_allow=1e-5
, D/ ]# A/ A" \
8 v8 R: J- g6 d! }- _#线性转换4 g$ Z% z9 e) Y8 X8 H
def linear(w_one,w_two,i_one,i_two,b): Z3 B+ Z6 D8 b
return w_one*i_one+w_two*i_two+b
9 I) h: _) N8 B( m9 G#非线性转换
& D4 j3 B% V. _def none_linear(i):6 M7 P; \ A2 S# ~6 P2 l, i; g
return 1.0/(1+math.exp(-i))
0 \. j8 H% Y/ k0 R( W8 C: b; o
7 k' P/ _/ t( u, Z: P, ?" yprint("训练开始")& ~0 a( K6 b# O+ v
#学习周期结束前一直学习
( O4 f) X' l5 [1 Rwhile lt<max_lt:# c9 ~" q5 A" @' m5 {4 e
lt+=1
- N0 h' g% w$ F #求h1和h2输入值
6 \% h. ^, G: z2 z hi1=linear(w1,w2,i1,i2,b1)6 U% ?6 q6 x$ e) b: c
hi2=linear(w3,w4,i1,i2,b1)6 C$ g9 h$ v1 |& ~. c
#求h1和h2输出值8 w) M1 W7 e6 I, N4 z; u ]& p8 \/ S
ho1=none_linear(hi1)
4 r% H% n( _% h; g3 `- D) n ho2=none_linear(hi2)! m, N5 x& Q+ Q* i: E
#求o1和o2输入值7 H" T8 ]+ \) e! r- M
oi1=linear(w5,w6,ho1,ho2,b2)# T' L9 w1 f" J( _
oi2=linear(w7,w8,ho1,ho2,b2)
1 a: t* W$ `0 p' v/ ] #求o1和o2输出值5 J$ A9 B3 N9 Y& @* E9 K& n
oo1=none_linear(oi1)- f8 I1 U' r1 Y* V' ]# G/ z$ f0 K
oo2=none_linear(oi2)# s0 X; @+ f2 f i6 q' O- s
5 i: T( ?" M: e: Z+ L4 Q #求当前计算总误差3 f6 q7 u6 o% M" @! @: y
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2; x# Q% h% k+ g9 x
print(f"第{lt}次训练,当前计算总误差={eo}")3 [/ U/ z/ G: j! M& ^" O
#误差已经在允许范围,退出训练" @+ u- K. J# l% Y
if eo<eo_allow:
9 K9 p: y, Y4 |+ f$ V- o print("误差已经在允许范围,训练结束\n")
/ ^ a% u6 B9 l4 |4 G break6 k& v: L; d W8 I8 ?
#偏导# h) [0 r& x& X8 _( a
d_eo_oo1=oo1-o1: j3 Z/ D/ o# @) N" m5 M6 y! m
d_eo_oo2=oo2-o2
( \) B: `% ~9 C5 s' d d_oo1_oi1=oo1*(1-oo1)2 \! n# O2 ]. F/ L' Q) s
d_oo2_oi2=oo2*(1-oo2)5 \8 W) F$ L' }: [2 n; N
d_eo_oi1=d_eo_oo1*d_oo1_oi1& x, P+ t2 G* x3 i5 M
d_eo_oi2=d_eo_oo2*d_oo2_oi21 |' e' L: v A( s
#求w5_new
3 }9 U- E2 X9 x9 B d_oi1_w5=ho1
- e+ M( a$ K7 B* z d_eo_w5=d_eo_oi1*d_oi1_w5
2 Z; W9 J! Q0 e w5_new=w5-lr*d_eo_w57 {; s" Y5 G, ]2 D. |% j
#求w6_new2 D+ T8 S* ?! D
d_oi1_w6=ho2
# A( O' F, u. K' Z7 F5 a5 F+ s: j& P d_eo_w6=d_eo_oi1*d_oi1_w6
- r; b5 s0 M- T9 i w6_new=w6-lr*d_eo_w6! I0 D. \9 L& J) n: U, z. s
#求w7_new" c$ I& ]! t/ O4 M9 P" K! e W9 W
d_oi2_w7=ho1, D+ C: S9 r$ A0 S6 {
d_eo_w7=d_eo_oi2*d_oi2_w7
; k. K( a3 Z: o+ @" @% [5 T! f w7_new=w7-lr*d_eo_w7# |7 `' [& Z# W8 w
#求w8_new6 w: s6 Q. S( B" M9 W$ m2 ^: d
d_oi2_w8=ho2
, I @, D% R/ {! R d_eo_w8=d_eo_oi2*d_oi2_w8
" x: W6 B" F( p' Z7 Z9 l w8_new=w8-lr*d_eo_w8' Q5 |! \/ y. j2 L: [# a
#求b2_new- j1 S8 s8 z/ u% t3 [; I4 p1 h7 o
d_oi1_b2=1/ _4 ?& u# i4 b; k$ t# h" r
d_oi2_b2=1
) o- z. j% L, k$ w& M1 B d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
: C3 D. t# ^. F- x v4 _+ X b2_new=b2-lr*d_eo_b2
0 X5 n: \8 e: y2 O9 P/ p9 G( R$ U d_oi1_ho1=w5
2 @1 F) T [1 R& v0 R! l- l5 [0 y d_oi1_ho2=w6# C) n2 f. x* Q
d_oi2_ho1=w7
: g2 e6 g% x4 Z d_oi2_ho2=w8
! l/ T# ]" k; I! O d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1" u8 o- ?) a! ^# g/ R) w0 H
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
6 }& a: I( n; E+ ?/ r3 G3 W5 }# g) w d_ho1_hi1=ho1*(1-ho1)+ X. f' t' x" x/ U9 z
d_ho2_hi2=ho2*(1-ho2)& u2 u$ P1 B7 i7 q! y% T, n/ F
d_eo_hi1=d_eo_ho1*d_ho1_hi1
W4 ?1 M. i, R: i5 T d_eo_hi2=d_eo_ho2*d_ho2_hi24 E0 y6 ]3 b& `2 J
#求w1_new. G9 Y9 r; |* l! N. e# _3 l* p
d_hi1_w1=i15 f8 @ G1 ^8 j& d+ ^5 c0 n& [. Y
d_eo_w1=d_eo_hi1*d_hi1_w1
( g& h# p# R9 s w1_new=w1-lr*d_eo_w11 ^7 F: A$ T0 {0 ?4 s8 i
#求w2_new t- @. C$ i; U3 S& o( Q& c9 _
d_hi1_w2=i25 A# d/ U. P& b6 E/ v g
d_eo_w2=d_eo_hi1*d_hi1_w2, T# H' [' c' z3 Z0 ?
w2_new=w2-lr*d_eo_w2, T4 K) F# h+ D9 m( {5 h& N) Q0 n" m
#求w3_new1 R: w) d- F2 J9 q' e
d_hi2_w3=i1
6 B- z2 j! U/ d8 o d_eo_w3=d_eo_hi2*d_hi2_w3
2 V: X- K5 @! X2 M3 s; T w3_new=w3-lr*d_eo_w31 d1 b" k- |/ S, b' }8 w; N
#求w4_new4 S* d- h1 u" i5 q) p- E* O) Z# }
d_hi2_w4=i2
& h) i2 P! n' b9 J4 Q d_eo_w4=d_eo_hi2*d_hi2_w4. `! W; t0 K S# ^1 Q
w4_new=w4-lr*d_eo_w4
. A5 ]: L7 `1 z# c #求b1_new
$ V$ G( x: ^8 P d_hi1_b1=1* E# j* H# a8 W) q% x( v
d_hi2_b1=14 I6 ~1 \' n Y$ n% B7 i5 M
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
# L; F; q" O; q7 B/ o s b1_new=b1-lr*d_eo_b1
) {0 O& T" Y% G! D, A8 | #更新反向传播
M' O, {2 l0 U! w w1=w1_new
# i+ s+ ^: J3 N) h5 I& M& T- f w2=w2_new* ]- }# W. t, N' a0 @" v
w3=w3_new
f4 y$ |$ L( p& _6 B) B w4=w4_new
8 [' V' m/ a' S0 O! x1 E p# b b1=b1_new7 d/ s1 o4 O, A4 s# s: A# e0 b( e
w5=w5_new0 W# u& X( \: B- f9 D* F9 x
w6=w6_new6 b4 w5 {, o4 ]
w7=w7_new
# q" c- M/ Z4 C( d w8=w8_new
7 ?/ Y4 h# p, K- f b2=b2_new
7 u/ A: {3 G8 U" {print(f"当前计算总误差={eo}")
( D5 h# k6 Q9 _3 Vprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
2 [- M( i0 Q$ |/ y; ?print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
/ \& j$ A/ n4 t* q# kprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
- i; [% I+ q" u( S
; y+ x0 g: l b% R结果
k6 i) c8 s& c4 I! {+ H t$ \5 k7 n5 w9 K# @1 h
+ z' g/ e* Z2 [# a! L结语9 X! Z- R1 P6 B4 ?8 k
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 c- S! \ c9 {1 J
8 Z' j( m6 N/ y! X Z8 i' U
补充
4 _1 N$ G4 y B! _, D. k4 M2 X程序中d_{a}_{b}格式的变量表示a对b偏导
9 O2 k. \2 o& ]" S, r3 X————————————————
/ S2 Q9 R( e7 S- q. C" V版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 U5 ], }0 o: r- i原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
, w( q! r) m# T) m6 U* i$ g6 K) W0 s+ B5 o
1 s7 g) r _/ `" K- k( R: x
|
zan
|