- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565657 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174920
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)# N8 x" Y- { Z5 O
' f; g6 r% i+ u, w7 L4 g6 P, i# ]背景
/ X- C0 A+ S: L* g; ]初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
I0 a! W7 M" J* `# U, L1 p
* q$ l" L$ b1 L2 p9 ^+ Q6 }【神经网络分类算法原理详解】5 U* m5 S& o2 T' I
9 T0 j7 t6 b: f6 n# i( |
注意
8 L4 }) Q: c/ [6 g! x3 h! S- E. V站长提供的图片有点小问题,我们更正如下
7 E0 y- n% L' N, f; ^2 `2 }6 b5 s7 O! d) e
8 R/ e; _" z7 I" m, q' h7 h; l# L+ {$ g$ n0 [6 w
问题; j& s7 y' `! b- U
根据上图所示,我们有已知
, |4 s, P, z8 M0 V: Y7 O
! R4 {& m8 n2 I+ i+ r% M#输入层; Y% c3 c D6 B- o" y
i1=0.05, |& A2 Z9 U0 d: r, Z8 z
i2=0.1
2 u* R/ k/ }# G( a
; N- E$ x3 f; f# a$ I#输出层" g. V. ~8 z( M7 r
o1=0.01
9 \# c2 e$ q4 Eo2=0.99
9 c+ m( ]% ^. }8 V" N* ?+ _: d这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
# x2 S; u2 n5 H1 q1 Q2 X9 e: q& m2 e% S ^% Z7 D/ [! `
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1) T! V/ R2 {, L& ?8 d
8 z, `! [7 ^7 N" N" ?6 R! ~. j
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1 E. `# o* l5 G; e/ |) c9 G
( ]& O- D h g! m5 @
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出+ W" B3 o& X$ G H5 R, k
& j8 J& }* C+ p- j1 c" ~* e
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
2 A0 Y) Z4 |' e. C2 X% M) i& W% I) z% }: V
同理0 d4 o% G8 K# @3 y
' \# K" y) T" A, I' u( q神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))+ P: v/ g c$ Q% n
( \6 J/ U' z8 d接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式: S5 ?; h9 ]- [8 {3 ]; t
) H3 Q3 ^, F6 \2 ?: A8 ]神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
5 `8 r/ X5 f7 X r1 P4 o( b3 X4 N% @. u% z0 O9 c# [
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
+ Y8 |+ ?) [: R2 g" E
/ Y5 X9 A3 `+ x" [. S6 g再经过非线性变换Sigmoid函数得到
. N6 e3 d" a! d1 \" l, i2 r4 t, z X! F- g& s9 R
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
5 a' r0 \2 U$ r/ |2 R) M5 A1 \: }# j) n
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))9 N3 O* F9 f- ^. E
9 {/ G2 E) `; B% q5 p& e我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
3 V4 B- X, T& B6 W. m1 Q. |9 _4 D% G2 g5 r9 F! _( s
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
# d9 L* b3 m N! c2 N3 h- |7 c1 ^) |: j( `$ I
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足6 ^( a6 Q: m4 C7 ~3 E4 T
4 k( s6 `# R' k7 X' c% e
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
1 z4 S. n' U. }- k/ m
; ?2 F7 ?% d$ {8 Y学习率 (learning_rate 简写为 lr)我们设定为0.5% C& i* z0 T$ M7 |
. C; }& p+ D1 N5 ]依次求解代求参数
) v/ M3 X4 S0 U, X( I" Y2 c6 Y+ p6 E# u0 x2 ?8 l( s
w1~w8,以及b1,b2
5 |) }% [ S' N! v( K' u
( O; W8 D; J% k' f8 ]0 q7 J跟
. {1 {8 C& N7 H- l2 o% m% h& Y
损失值 (eo) 的偏导数
, T+ e* N$ R8 H% j4 h# v. D9 }1 U, ?1 z% Q2 J, D' X
再更新该参数,更新公式为
6 ~: M5 G& A$ X6 Q) d% k# q% R2 `0 C X
参数_new=参数-学习率*偏导(eo,参数)
) y. K' ~( R) o, Q+ e随后进入下一轮学习
9 ]7 p+ ?4 a( w
1 o$ `7 n: J j- Y9 i终止条件(满足其中一个即可停止训练)
8 i/ H6 M# J8 C7 c8 D1 T3 z/ s9 h9 ^+ \1 x D) v( U3 g* _
1.学习次数达到上限
4 Y3 m! z, o# W0 e7 O
/ t: A& Q+ L0 e$ f. m0 a$ E: d2.损失值达到可容忍的范围
& v8 p+ h2 [$ Y# E4 L+ Q; _2 e6 V, N$ q# t4 g w% t/ {
导数( F4 X, h. k! H0 E$ b6 E$ w" s
f(x)=1/(1+e^(-x))的导数是
1 C, V5 R% @- E3 O. ff'(x)=f(x)*(1-f(x))1 Q7 b+ r5 E4 I& Q
源码
: y! X& N0 v. J4 X6 E% qimport math7 G2 t# K$ H( Z4 u& Z- C
, A/ \& ]+ U3 m' g& g' R) p' s
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】$ e& p7 ]: k; \' n! {* s
#网址中图片有误,请看我博文上的图片# O$ }) v% w( B( L
) ^ d: Y! F+ Z% }# T% e
#输入层" J) F% i5 t! h
i1=0.05
1 @6 H( W* \/ q3 \8 ji2=0.1
9 ?5 g5 L1 b: [4 u# ]3 D) p#权值参数6 h$ p- o3 B P: [3 X' O
w1=0.15- }* ^3 v! h9 y# W* h) Y" i
w2=0.2
3 o# Q* t3 @& U! T! W: W3 Hw3=0.25
+ A9 x+ ]9 \6 k3 _8 V1 K8 ^8 mw4=0.39 K2 R8 {6 ?0 }- c( v
w5=0.4
( R% @% n+ z( I% Qw6=0.45
/ A; V1 n" @9 m2 x) P; |w7=0.5
6 y# w# ?9 w0 f) U2 L: I0 y4 b* R# Rw8=0.55
& ]! L$ Z% u/ e; i* ?( H#输出层标记(即期望值)
/ z7 n, o- p, J5 ?/ P0 Uo1=0.01
$ i- [" x: J# t/ ?8 w# No2=0.99# w" e- t- }: B2 j6 U8 f/ G
#偏置项参数, ~# d6 S& o" [
b1=0.355 d' w$ i ?8 c/ N/ u; r
b2=0.69 S: u* x8 k8 D
- X) n7 B5 l* \% @" e
#学习率( G+ x' B+ H& A* Y
lr=0.5
( T9 T# L; N4 @8 P' W! K4 j8 v4 [$ a#学习周期4 e0 `7 [; D V- k+ h1 X$ W
lt=0
/ W' z; v. m6 Qmax_lt=10000
; K4 U) K4 L$ N/ [$ h3 F2 c5 \/ J2 h! G#允许误差" u. Z2 E9 [& n$ B2 H/ E8 i; K
eo_allow=1e-56 J- Y0 I2 W( }( ^
8 \8 j7 [8 v( j1 p3 v
#线性转换6 R/ \ Z% y' D* Z+ ^( T& o+ W6 H6 D
def linear(w_one,w_two,i_one,i_two,b):
6 Z" L3 y4 ?. s( I7 m return w_one*i_one+w_two*i_two+b
. ]. i$ L; t5 J. }#非线性转换% W y8 p2 s; ]3 A3 z5 P+ g
def none_linear(i):
5 F/ Q. L: k q6 _4 R" H2 Y$ t2 X return 1.0/(1+math.exp(-i))# a, y |$ Y; ~ c: M* z0 U$ H
+ Y: m0 e8 m; t3 l- ^7 g/ m! V% j) {
print("训练开始")
H: ]! r! z2 p, _) _2 ~#学习周期结束前一直学习2 t# }6 T/ p0 j* i& k* e' Y
while lt<max_lt:" L: [9 K* s% P8 w. P
lt+=1
+ W3 m7 Y! B9 l) P3 B5 o: u4 K( r #求h1和h2输入值
5 R# w1 x: E) v hi1=linear(w1,w2,i1,i2,b1)
% n3 U; m H, X4 _( K" e hi2=linear(w3,w4,i1,i2,b1)
5 ~5 l; Q3 I! c; I9 J8 e: C5 c5 i* T #求h1和h2输出值; Z0 a/ U9 n1 ^' \* J# E
ho1=none_linear(hi1)) L! `" m5 p* |5 q+ f. W
ho2=none_linear(hi2)7 a6 |+ N/ H6 f4 X! I5 s5 x0 C2 _$ f
#求o1和o2输入值
- X0 z1 r0 z b' |6 q oi1=linear(w5,w6,ho1,ho2,b2)
" K/ ?& j$ N4 h, A* f, O oi2=linear(w7,w8,ho1,ho2,b2)
" P3 B. i. i! J) c- E- ] #求o1和o2输出值% [- G* V0 m, |9 \3 {. g
oo1=none_linear(oi1)3 ~6 h( B+ ~ W; ~) m# {
oo2=none_linear(oi2)
- R% {4 N2 @. Q6 W0 k
; H: N4 t& V u& {- E& j #求当前计算总误差! W) n; m6 L/ k
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
- j, z$ E& I+ |$ E# \ print(f"第{lt}次训练,当前计算总误差={eo}")1 v! f4 t7 }# K3 ^8 B C1 P# M
#误差已经在允许范围,退出训练6 V/ O: [/ x5 x
if eo<eo_allow:) a% _, ]+ J& ]: p, g- W6 n) T7 {
print("误差已经在允许范围,训练结束\n")& d; _3 y; D& ]* q$ h$ Y
break9 ?! h5 X b9 @/ D8 b3 K! E" G
#偏导
0 u0 v5 v7 T+ M/ O& L/ \ d_eo_oo1=oo1-o15 X$ {" E9 n) S* \2 l
d_eo_oo2=oo2-o2
: F+ x5 b% M& @* {6 ^ d_oo1_oi1=oo1*(1-oo1)/ h+ A# Z6 O8 d, S
d_oo2_oi2=oo2*(1-oo2)" p* M% J0 [/ G# b( X* o
d_eo_oi1=d_eo_oo1*d_oo1_oi1: Q) v& h6 \4 E1 m- Z4 H
d_eo_oi2=d_eo_oo2*d_oo2_oi2
0 j+ C7 p- L& K5 G( f" E #求w5_new& d! i9 t' g, K" ?
d_oi1_w5=ho10 H+ p4 B% C0 T- u) H' a& | t
d_eo_w5=d_eo_oi1*d_oi1_w5
* N. s6 l, G1 s, @# a- ?) m w5_new=w5-lr*d_eo_w5/ l1 p; C+ M, M9 G* G
#求w6_new2 @- I2 y0 h. I1 D) S# o
d_oi1_w6=ho21 o8 B+ `0 x/ ?
d_eo_w6=d_eo_oi1*d_oi1_w6
8 @" C$ B: X/ [ O8 K- ^/ ^ w6_new=w6-lr*d_eo_w62 Q5 y; f1 i5 V" s( f
#求w7_new. k. s, t8 l* V
d_oi2_w7=ho1
( c. J" L/ ?6 W d_eo_w7=d_eo_oi2*d_oi2_w7
8 k) I/ I+ L, n- P w7_new=w7-lr*d_eo_w7: z( f% G+ v7 {" R' ?# x& \9 H$ V* Q
#求w8_new
. d, { f" q6 o, V; Z# t d_oi2_w8=ho25 C) M: P& [0 \# B8 r9 E* S4 m' X
d_eo_w8=d_eo_oi2*d_oi2_w8( |5 d$ y+ U4 {7 Z, s- W5 g
w8_new=w8-lr*d_eo_w8
) k& j/ `7 j1 t4 {7 }* S7 h9 p, z #求b2_new0 {/ D" h. ~& ]% Z+ b
d_oi1_b2=1: w. Z2 p8 j( V7 A4 V4 K! [
d_oi2_b2=11 l4 |& {' Y$ x/ D' g; R
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2$ B" B ~$ `3 G* l% A
b2_new=b2-lr*d_eo_b2
6 m# \" U* D5 A; s d_oi1_ho1=w5 W4 j, V) j9 |4 k0 A2 a
d_oi1_ho2=w6
( k, y) G% d; y% a: K) k d_oi2_ho1=w7 X- _8 [; Q5 t0 B/ n
d_oi2_ho2=w8
+ Z( A( m d% n0 V& j! T d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1% B6 Q- R5 ?- d4 H& \
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
) g4 Q. V- q6 M S# _7 d d_ho1_hi1=ho1*(1-ho1)
( P$ Y. ~# s- I3 ^8 W d_ho2_hi2=ho2*(1-ho2)7 A( V2 |3 W. Y& u
d_eo_hi1=d_eo_ho1*d_ho1_hi1
9 {2 o7 Z V5 C% c/ X d_eo_hi2=d_eo_ho2*d_ho2_hi2
% L9 P+ a( b2 _8 J& s- L6 n #求w1_new
- I1 a+ |3 [: |5 Z4 ]6 S# l1 u d_hi1_w1=i11 M5 @" Q+ l9 M' I0 ] g" {
d_eo_w1=d_eo_hi1*d_hi1_w1
5 s+ U% r! X8 d2 O4 n \1 R w1_new=w1-lr*d_eo_w1
$ Q4 ~1 t2 q6 ^/ Y0 a #求w2_new
5 e; ~1 }. N6 O9 i+ I d_hi1_w2=i2$ n( }! U% _% i8 H( O
d_eo_w2=d_eo_hi1*d_hi1_w2
3 B* R# M, \9 x/ c( w4 [ w2_new=w2-lr*d_eo_w26 ^) l* J# v6 R$ y. W+ P5 s, N
#求w3_new0 ~) `7 T: W$ R! S5 l I
d_hi2_w3=i12 V' x) e6 z6 v, |& F2 v
d_eo_w3=d_eo_hi2*d_hi2_w36 ]$ H2 k3 V- A; d! e# G: z
w3_new=w3-lr*d_eo_w3. ^ o* w7 ^( M2 Z
#求w4_new8 e( A1 t U9 k! Y. k B c
d_hi2_w4=i2
6 P) y0 [3 }% S. ^7 K8 T d_eo_w4=d_eo_hi2*d_hi2_w4# _1 w* l; s0 d9 ~+ t. [
w4_new=w4-lr*d_eo_w4
$ T1 }- T4 o1 f& E) {6 M #求b1_new
! L, B& n+ {' ^. G9 R- ~ d_hi1_b1=1$ p+ e. N3 I( I: n: P1 |4 s
d_hi2_b1=1
5 ]& F0 c: G. R! z S* h( }- Y% T9 k d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1! s( r! ?2 i' A/ Z$ l5 x
b1_new=b1-lr*d_eo_b17 `6 g. x8 j/ l3 h6 s- P* ^
#更新反向传播- `9 A( r0 [" R8 b+ J- |
w1=w1_new
/ c4 Z1 Z; G' ?0 S. o" a( ]* y! q8 B w2=w2_new
& Y: {( J& H" \9 P4 [6 s w3=w3_new/ R& \% Z7 T( `4 p+ U
w4=w4_new
# y* k1 G, {+ q0 E1 W) c b1=b1_new
: C9 V8 x) i3 ~" D* D& L w5=w5_new8 v6 R- r+ \8 y9 \/ @: v
w6=w6_new4 x! J" b C, h; ]( ?$ j
w7=w7_new3 A$ p, o& f. ^9 d
w8=w8_new
9 \& J; {, w. s b2=b2_new$ O" w, D3 E+ q; W& {7 W/ }# U
print(f"当前计算总误差={eo}")& w9 s& b$ o+ f0 l
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
9 S& ~( P; |1 T. f4 `' Rprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
% K0 ~! J1 d' b( tprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
/ N1 [, S: _( r% i0 i7 P0 M* L, e# H& y7 u
结果; J; t4 C! r4 D; m V
6 Z9 b9 b1 O2 I( N! P8 k& L: T! W* R y/ [. Z' N
结语1 Y1 {( z# m; H6 a: e- {9 |
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
1 e- \' T5 p+ V6 O$ f4 X# K+ f
补充7 |7 o% `! `: G8 M/ o5 b
程序中d_{a}_{b}格式的变量表示a对b偏导! |- d' ^* ^- x6 o1 S |+ c, J
————————————————
7 I- ]3 |# _- O9 P2 i版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 w0 J( w4 @1 e/ A9 `5 p4 |
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954" ~! B- u7 H. p2 ]
% F1 k$ L5 F x
3 n- k- ]+ f" a4 U( y |
zan
|