在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 569584 点 威望 12 点 阅读权限 255 积分 176098 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
人工神经网络——反向传播算法初体验(python实现)
, i. z! D7 i' f. B7 m % `7 J% k4 k; X2 L' B
背景% Y% p$ {; T: O0 ~: V
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下8 e) m' c b: `( S" D
6 ~+ n- Z# n, I- v, \ 【神经网络分类算法原理详解】9 h5 E2 f7 U5 L/ l4 ^! H+ l, k/ e
' E$ T5 e4 q D4 V+ L. s! Y
注意
2 D; x2 F; I1 \0 F$ {# a, s5 w0 P 站长提供的图片有点小问题,我们更正如下
, `% P* S4 r8 b/ {7 V
8 V) m: B# F' I+ l% G, S/ J
0 v+ P2 d% q6 i) `- h" `# A# R5 _* Y 6 ^8 I# }5 ^( F: w# \
问题7 l& e9 p8 A9 r3 a# ^9 f; m
根据上图所示,我们有已知
/ n7 m7 \4 V- X2 V3 J" B+ m. B( P
$ i7 L# c1 q0 a: @/ E" k, K2 ? #输入层 Y; |" s6 L+ {4 P4 Z6 J6 u% f
i1=0.05
4 Y2 l/ `- L/ ~) S i2=0.1* l! N) E6 S H7 a$ |! c
! d$ i! u4 U: {$ P u/ j/ C
#输出层$ E5 ^0 q. X2 u9 U. _
o1=0.013 `9 I, `1 k' ]# ~+ I
o2=0.99
7 d: n Z1 Z6 h+ r; v) z3 k6 ] 这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的4 \9 X7 j8 Y* s! }+ q
2 z& F- v# I5 S- H8 @/ r4 G: c# c 神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1/ [2 q( l& u8 F. }9 `
1 y+ U. R0 u* v! c 神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
5 @1 g5 V4 X8 U# \
# p/ G# O& I( n 神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出9 l4 |" Y* N, O, }) E) o
: Y r4 a. ]$ P4 ~3 f! @ 神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))& V0 B& g3 X2 y4 ~) ]9 z
3 S, o0 F( P8 h 同理- R" {# }7 B8 L0 }4 t
' S: j* V6 q! H }% m( G" [ 神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
' m; Z% _, u6 |$ ]3 P( B. m5 H + v5 H" _; p- T: W
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
* m4 a8 U* x- \6 ^" ~" v
! e& s0 b% ?& y 神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b24 Z" O& T7 X' j4 ?
, s) e( v" a Y$ @& i
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2& J( s; I/ q, R
; F6 c& M' Y& _2 @/ p; F& E e 再经过非线性变换Sigmoid函数得到
* H+ P; Z! n9 ]" ]
' P0 O" g, b" A; m6 a 神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
^" K5 [. L+ \2 K' x + f+ H; \+ g( S" z1 o
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))9 O J( E3 o" K/ }( N7 S+ P3 e
. {! p7 l3 I1 p& o
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
4 r4 E8 d6 I: J 2 E2 s# x. `9 s
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/20 K, v, G: d# H
# B: \ j) E, @) h" |% u
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
# W8 s7 c+ N( y! V0 L + o; |/ b' Q) B- q0 ~+ R1 E: b2 i7 j
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
) O) P5 o7 m) P5 {2 ?$ ]8 y- j
0 H$ `- W! y4 f3 u6 E7 n2 n: w 学习率 (learning_rate 简写为 lr)我们设定为0.5 x8 v; Q# j+ ~. x, V$ N6 z% _* h2 t
3 A( x& p. N) {9 z% j. d$ i. ^! u
依次求解代求参数
; A3 S" N) Y2 c4 e( E9 O/ U , H2 W& A6 y2 a6 i) u& G
w1~w8,以及b1,b2- c) B# R! @5 o I' c* E3 A
7 h4 j/ m5 o3 m# y
跟
/ Y/ k( Y' ?; ~( B) u: B 8 s: J: J% H( @$ t) Q
损失值 (eo) 的偏导数4 X- M$ B) q4 y. t- b: h8 ?
) z9 `0 F% S6 R" s 再更新该参数,更新公式为7 q5 t# |5 d8 I, j. B1 v* Y- K
$ h5 H4 v8 m3 }6 h+ ^
参数_new=参数-学习率*偏导(eo,参数)+ K+ N$ J8 y$ a9 z
随后进入下一轮学习
$ J! K$ e$ R( Q
$ A* S I4 {! u* y. C7 c; } 终止条件(满足其中一个即可停止训练)
% p! a" \- B1 j _
! G# V7 y4 b7 o0 {' z 1.学习次数达到上限/ b% N5 w; [6 m2 |+ M7 S L/ ]
3 L- ?. L- ^; C* x' r/ g
2.损失值达到可容忍的范围( I0 B: P3 R6 B/ R3 M) p1 V
: {5 l/ }! G4 m 导数$ E9 q. h) P* O9 E# P1 \0 {' b f+ P5 a
f(x)=1/(1+e^(-x))的导数是
) T) f* p; I7 W4 Z# l, P7 ? f'(x)=f(x)*(1-f(x))
' S/ X" Q6 _! |5 g 源码 O' t9 g9 k' S1 M! A8 V* v3 ]2 B
import math. H* m8 H. C* S* Z9 H4 t
* ^* U0 o& D9 B5 n) I #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
9 w( G' |4 x2 H! u$ |: {% R/ q #网址中图片有误,请看我博文上的图片
, [2 M0 U f. A2 ^3 J v0 B- j1 N! T) c; ?! s# e- ]$ ]
#输入层
. i/ y+ H( ]+ ^) i* S6 Z i1=0.058 C; b1 R2 N/ W& I) n
i2=0.16 ^6 f) i/ m7 h5 i0 z
#权值参数
8 X1 U1 y" I9 l' g8 j w1=0.15) U, \3 l+ y( [/ S9 H3 m9 I `: F
w2=0.2 V0 h- o9 ~+ v( \) {. I
w3=0.25# i' y2 D7 t; \ N* }+ _5 i* _
w4=0.3' p' K0 y" k# x% c" D1 ^8 h( x
w5=0.4; o6 X( k0 x a2 c
w6=0.45
/ A% F$ R& T! p: B9 X" L0 E ? w7=0.5
& J9 m5 L+ j% ?, z4 R w8=0.55
% U5 q0 g( D- F #输出层标记(即期望值)
& e: H8 l2 [0 E o1=0.01
' h8 @; Z$ }8 h. s v6 ~ o2=0.995 `: R; d0 Q0 ?0 Z6 L; K
#偏置项参数
" t0 `! t6 f% Y* c t. d/ q, V b1=0.353 f+ \, G8 V* f$ z; L4 D
b2=0.6 b+ x1 {: ~. h6 K, d
8 A. n! P8 {: }3 } #学习率
& C8 m& _2 E) M lr=0.5
, t8 d: P- L- z #学习周期
G8 r. E, s7 f: Q& y lt=0
+ O. p5 R$ ~! [ max_lt=10000
; t9 y" ]( x1 e: p8 c# S! h #允许误差9 S4 ?6 c3 H: _; I0 ~* X
eo_allow=1e-5 C! W9 i* W i8 e2 f8 o
( V' i. {2 i6 t0 T9 v
#线性转换, Q, D8 |: V& s" ?( x( X
def linear(w_one,w_two,i_one,i_two,b):
! J& I$ m) {% J; x: I) [/ b6 y' c4 x return w_one*i_one+w_two*i_two+b
# @! J7 T1 k/ m/ v! y% k #非线性转换
( g- Z9 L7 I1 E3 S! N def none_linear(i):
5 `. }0 Y* R& L return 1.0/(1+math.exp(-i))7 y0 ` K: y$ p) n& b( x* E$ b
; o) T4 h; X5 D6 E print("训练开始")
! }" N0 Y; D# N, h" E" d #学习周期结束前一直学习
& k' `& i. k, S& m% U9 w while lt<max_lt:& x) _/ h& g7 g1 n/ y4 s4 s4 X
lt+=1 c( W1 ?( D3 p& z p h
#求h1和h2输入值2 C9 I" \2 r5 ]
hi1=linear(w1,w2,i1,i2,b1)
- h3 I( w1 ]( {9 t8 J hi2=linear(w3,w4,i1,i2,b1)! ~( F2 w9 J8 Q8 _ F- P1 t/ y
#求h1和h2输出值
7 |5 e$ N3 Q; t8 C" a ho1=none_linear(hi1); d- C, _' D0 c
ho2=none_linear(hi2)$ z6 m" d* a' L# U3 p) U
#求o1和o2输入值) `# Y5 a! |& ^4 x# ^( u
oi1=linear(w5,w6,ho1,ho2,b2)
2 q- Q- I$ {) }2 y s' {. n3 u oi2=linear(w7,w8,ho1,ho2,b2)
" |) i3 p8 w6 j' t! p6 [# \ U6 g #求o1和o2输出值8 ? N! I" N+ r1 y
oo1=none_linear(oi1)
) L3 _% s/ o9 R" `* L- y oo2=none_linear(oi2)
1 l) M5 A( c5 g2 {9 {* O5 N b
% q' u4 j( j' |" i #求当前计算总误差
8 \, n; D2 U- S- o/ f6 ]( |: O g eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2) P- i- c6 j/ w" t$ m- M
print(f"第{lt}次训练,当前计算总误差={eo}")- ]& `/ K5 H+ _: B- X3 Z
#误差已经在允许范围,退出训练6 D3 C2 P8 r, e/ Z/ V3 q7 u: Q
if eo<eo_allow: D2 P( ?# V# W2 v. Y
print("误差已经在允许范围,训练结束\n")1 N7 V* a2 l3 l2 m
break
, c( A( [" f4 {+ n! G #偏导9 h0 u/ I& V5 U! N# _' {. k
d_eo_oo1=oo1-o1* f, G% F$ {/ a
d_eo_oo2=oo2-o2; ]. P3 c' _1 N
d_oo1_oi1=oo1*(1-oo1)
0 _, I ^2 F" N3 Q5 } d_oo2_oi2=oo2*(1-oo2)
# K! U9 x9 f2 M1 w9 k* [ y8 }3 m d_eo_oi1=d_eo_oo1*d_oo1_oi11 v8 \6 h1 X7 Z7 y
d_eo_oi2=d_eo_oo2*d_oo2_oi2
8 \# o/ f0 I0 k+ K; R/ [2 i, B9 [ #求w5_new
% J. R% T/ u5 D d_oi1_w5=ho1
7 R5 S# a* p. J# L: E# K d_eo_w5=d_eo_oi1*d_oi1_w56 v, B9 Q* s1 L# V, `" _. ~; G
w5_new=w5-lr*d_eo_w5, G5 w6 B( \( k
#求w6_new6 y" z+ Y* u; |" O) i F. a
d_oi1_w6=ho2
4 G- T8 ~1 f3 d d_eo_w6=d_eo_oi1*d_oi1_w6
/ X! e, G h; u' O0 o8 Z) n w6_new=w6-lr*d_eo_w66 y) r1 b) w. W1 ^! Z2 t6 `
#求w7_new( W5 W Z# r/ G2 ]/ J$ ?
d_oi2_w7=ho1
7 N' z3 l; \% A d_eo_w7=d_eo_oi2*d_oi2_w7
! F6 C. t4 p! R# b w7_new=w7-lr*d_eo_w7
2 C7 @1 w$ G4 _) _. S: ? #求w8_new
+ D# q7 H1 _+ ]' y1 p% X0 g3 ` d_oi2_w8=ho24 k! c; e' D7 T/ @* ^
d_eo_w8=d_eo_oi2*d_oi2_w8
$ h" c. S/ c/ F8 q3 }% ~* Z w8_new=w8-lr*d_eo_w8
; g9 `! D, H3 T3 t3 y #求b2_new r, |; k* N1 d
d_oi1_b2=1) z5 x' T; d1 [& I5 H: }
d_oi2_b2=1& |! s2 R/ N( F
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2, x, l4 w* D% h
b2_new=b2-lr*d_eo_b26 V$ J" c( B" l2 `: l9 O8 O" F
d_oi1_ho1=w55 B* _- z+ X- M7 U: l ?
d_oi1_ho2=w6
3 ?3 ~* d% t$ v8 W% U0 n d_oi2_ho1=w7
- ?8 C! ~, Y, o+ C8 t d_oi2_ho2=w8/ D2 L3 d! B/ [) v& p
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
7 a5 g4 w1 `, O$ @ d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
/ z; D; l# r3 C2 W* D' S1 c d_ho1_hi1=ho1*(1-ho1)3 R% J2 I, e- L' \9 P
d_ho2_hi2=ho2*(1-ho2)
: E( Y& L) m! p1 ` a' X d_eo_hi1=d_eo_ho1*d_ho1_hi1
& n/ i2 c; O, @4 @/ g d_eo_hi2=d_eo_ho2*d_ho2_hi2* R% N* j* r0 |/ f* b3 ?
#求w1_new
% Z. ?- Y5 {4 l4 }; H d_hi1_w1=i1
6 h; G% ?! q! x d_eo_w1=d_eo_hi1*d_hi1_w1
' \$ J( m8 M3 Y w1_new=w1-lr*d_eo_w1
8 v! S6 G1 [% H% n, j/ ?( r #求w2_new3 ~7 x: n3 A! K. C7 x
d_hi1_w2=i2
; I) f2 _0 Q2 @9 n d_eo_w2=d_eo_hi1*d_hi1_w2 B. i+ l- U$ K) |) B/ g/ s, K
w2_new=w2-lr*d_eo_w2
: W9 m5 ]" r9 b8 V! x #求w3_new
! Y0 J& Y+ I) q& o- S; L d_hi2_w3=i1
* z# X0 k1 f# q# Y1 C d_eo_w3=d_eo_hi2*d_hi2_w3
2 V9 H1 _- ], w, j w3_new=w3-lr*d_eo_w3+ R% J1 Q/ S/ g/ M; M) @
#求w4_new
o, S2 X; y: b x4 h$ n5 v% H3 { d_hi2_w4=i2
, X/ i* ~! o9 z% B% o d_eo_w4=d_eo_hi2*d_hi2_w4
; x; o; y, ~* t* _ w4_new=w4-lr*d_eo_w4
8 D% Z# u3 q( K' w0 @% |9 W0 L8 C& Y #求b1_new
0 p( n$ E+ u3 U d_hi1_b1=15 d! [; |* y5 a! x( p
d_hi2_b1=1
5 h7 h- J, T' N% f d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
/ e3 c2 B# c7 V/ Q Y7 E( a* u b1_new=b1-lr*d_eo_b1- M: N3 ^8 e" g" l
#更新反向传播
3 @4 @' p# A, `$ T" X8 m- m( \ w1=w1_new, F& F) U- B' N
w2=w2_new
\! O0 Y5 c* T- [ w3=w3_new
6 l: X/ J- l: A0 T w4=w4_new
1 a/ H$ I7 A5 o/ C& m b1=b1_new& Q9 @* Q" {/ h A! a5 _( M' N" O
w5=w5_new
( H4 ~, ^6 w+ _. I1 Y w6=w6_new6 Q$ R9 ~' I: l, F
w7=w7_new& R$ A9 n+ Q/ l% K/ ?
w8=w8_new- f+ O: d6 R. |) `' `5 X3 |' B
b2=b2_new! }( \ u, I, q# b/ D' z
print(f"当前计算总误差={eo}")- q1 z! @) X; x( f& N
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")6 X/ o- G3 I( @- C! F! X. e$ j! @
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")8 K+ X2 ?$ b0 I7 H% Q# k% Z
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
. l: P x* C# u
! M6 v; ^" P; |) i: V4 }$ C 结果
' ~+ Q4 H. T# ~3 ], _. i' Z2 g
' q: f0 V( I z' s ( ]( Z& J# j) Y& F v+ b( }
结语0 z4 t: d' M; s; m( m4 O% i
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。0 u3 K2 v- k( B" Y4 w8 V
4 k- r/ k. \2 r) p8 Y& \
补充
i$ v9 y+ Z* _+ r: z% V0 C& o 程序中d_{a}_{b}格式的变量表示a对b偏导
: h$ x$ @# w; I) `0 j) K ————————————————
5 ]/ D3 f5 w* y" N% L) U 版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# N8 ~) q$ W- W 原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679547 i" e( \: }& @- p1 b+ Y, Y
' `3 R& h6 u! i
4 j/ g4 {, H' l& k* X% N' l. l( V0 S M
zan