- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563349 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174228
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)+ v9 z( U a* X7 y0 E
' b& }) [% q$ p. d1 U5 S+ [背景
/ J& }( n. m/ h2 d6 `+ q. q3 G3 o初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下8 @# E. C" Q) w% A5 {5 G5 m1 C7 t4 {
% {! i0 B" y' t+ M0 y! Q2 e【神经网络分类算法原理详解】2 l& h- Z( v0 ~- q- u; K
4 q5 D* i6 `) a" d# s1 k
注意3 k8 N1 v1 F9 _) x
站长提供的图片有点小问题,我们更正如下: ^! B8 F4 [ X+ p
& `. m3 N1 F( E V
$ D2 E# w: X) }) E" ^% q I3 h0 T- \7 Z {
问题 K+ p7 K0 I0 ?: n# p& U
根据上图所示,我们有已知( @/ ~# M: Z4 e
: R" R$ Y: ]% o9 U3 p( A% {$ d
#输入层 G" j3 r4 L+ I: J/ ?0 V' C
i1=0.05
4 |2 W6 Q9 s+ ii2=0.1
8 O3 |, [% G3 t, N
6 Z8 l. e; f2 f# w' U% w- n" L4 X#输出层
/ d% I5 H B* M# o7 I0 o5 X, Xo1=0.01
: C9 o1 T5 l: K/ y. r9 b, O# |* Ho2=0.99+ |: Y! `) J/ o4 ]- |* e
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
) Q; q( p' |! _, ]- V$ ~5 a, ~
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
$ a4 D* v3 H! t& P
4 @. p7 X6 C( x$ U9 z3 ^神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
! ]% N3 [' C+ S% H
0 c; v! C. @0 W. `" `+ H神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出 B \1 k5 f9 r
) I$ V3 ^+ Q# W. L& _/ ~* q/ P
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))! {0 R$ @3 ]/ {' w! ~
1 C' Q8 ?" H$ C& r+ l7 I同理
2 {& ~ Q: {! t7 K
1 f4 w. K: i. K/ B7 F( }神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
8 P' D. w1 K, v- A9 A
. `3 S- [( N" Z$ e8 q* Y0 P接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式8 P4 r- e( w6 L2 `8 j6 U
* H. b4 A; M' b+ I+ K, e+ v# E& w
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
& P8 E4 n% d0 Q# o; J* F) g, \ G" }8 u' l# J
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b29 Y- B |- K5 a( w: R5 }9 ~7 w
u$ p5 j; s3 X+ w$ U0 ]( r
再经过非线性变换Sigmoid函数得到
1 U' }+ A3 e4 V! S
# k) U2 D+ T1 e B' w3 E9 B神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
' s( n7 X; e. w' v; [% Q8 [5 {8 L" T( \, W7 a
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
2 d7 z% c6 a0 F/ Y* R$ @4 u. e* F: x6 n6 ?# `
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
4 u7 g/ ^& }! F [% G( \) }# @; M6 y3 i5 b
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
$ i: u8 j3 |: z! @) ]: Y% B7 q3 U' k- E# N- b( T# ]
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
1 u: i# H# ^, l; l# l2 J% w
4 L( ^9 C1 x9 l% H/ V学习次数 (learning_time 简写为 lt)我们限定最大为10000次
; \& @4 m1 U: {6 ^# B/ v, {
5 ^4 H" V8 O5 R2 k3 e& O& i, |( x& P学习率 (learning_rate 简写为 lr)我们设定为0.5
- k4 h# C2 M( ^( Q: t( x# ] h9 v! @+ W" w5 x% G0 `5 S; W3 i6 g
依次求解代求参数4 x! R. z. B1 v, E$ j/ v
`5 K7 ~. ~1 `
w1~w8,以及b1,b2
: i+ n4 Z' E1 U9 ?$ S' d. E- Z0 ?, \8 O8 v! h+ h8 D/ f- Q
跟/ i' o5 N) l2 s/ N) `
3 O# i- h- g1 H
损失值 (eo) 的偏导数
2 l9 e- s% o y# [9 {( U1 {/ ^+ S7 R
7 F; W3 X; e, A再更新该参数,更新公式为# o. R F/ P& [' c; S& H
* Q8 w5 U2 u4 _- U7 X2 T, @参数_new=参数-学习率*偏导(eo,参数)
; V7 ^" {! x% z- |: z3 @随后进入下一轮学习
! `7 K% G5 X. f# c) b
# N" v% h5 u7 \$ |! K' m) R$ f终止条件(满足其中一个即可停止训练)$ C; ^: G4 _. L f4 F) q+ k
8 G% t% V2 F+ k+ e8 t
1.学习次数达到上限
& G1 e4 w5 S* ^: [$ B4 v$ ^' `5 G5 M- B6 k- |/ b+ v
2.损失值达到可容忍的范围& z, O, O* K" \9 j
( M. K6 }+ k( b' y+ K1 x% X4 l6 p导数. _5 O# \- a% _; P9 v
f(x)=1/(1+e^(-x))的导数是
$ o' S0 L! d5 w. [6 Yf'(x)=f(x)*(1-f(x))
5 N( N3 V# K% m0 _# A x源码# X7 Z* G3 c- z! E9 _3 V# i0 O. I& p
import math2 y! G4 h4 f3 k/ T+ Y j* z, K
/ G2 S6 x( h8 V. F5 y#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】: k& q7 Q, [2 T6 Z6 r& M
#网址中图片有误,请看我博文上的图片
; \8 I, Q: v) q6 h' m( @! k+ b$ j; Z1 U# ~) G
#输入层
' I( V2 g7 Y/ V1 [7 E- }i1=0.05. G) x+ `, v7 a7 c
i2=0.1
* q( Y. `& O5 E+ p4 E- L/ @#权值参数
* S! Z* U4 z6 f G7 c% b0 O1 u$ nw1=0.15
1 X* r7 I4 }: aw2=0.2
6 X, b p0 S8 p1 j7 g# Qw3=0.25
d$ h2 Z% C. x/ Z2 }# o5 m" B$ rw4=0.3
D+ e8 z m, b6 t/ O/ P" A/ aw5=0.4
+ Z2 [, O4 ~3 x1 `* W# {: @w6=0.45
# f/ u# B( j& x6 h* ]w7=0.5
6 w1 {. o) Q8 f s7 z9 b- tw8=0.552 x L& q$ Y6 p2 V4 A
#输出层标记(即期望值)
9 D0 K1 v7 g$ Y+ f9 m, e7 {) w. v2 Zo1=0.01
( d3 f$ q4 w2 v& e: d! R; C: Ao2=0.99
2 M8 h: f' T6 K#偏置项参数" y; f5 k; f0 w
b1=0.35
$ y* U8 I( {5 R- S2 Z9 Kb2=0.6# X5 e3 B7 U& B0 e- F, h1 T
6 P' X |$ z- y1 }/ O: D# h
#学习率
# Z1 X6 P5 s- q% g$ i- }. [+ ylr=0.5
3 X0 j7 F- D8 X" q' Q( |0 }#学习周期
, S( }& F$ c7 P8 @ A# q* Dlt=0
3 k( J8 A/ f1 [9 umax_lt=10000
& T" s# C* L4 b6 U#允许误差
' e( X# N/ u: Z+ _. y9 B) F& k7 Geo_allow=1e-51 U3 x q# T% N
; z1 f' u, f( D) |; k9 ?' L, y#线性转换8 A6 Y* b# ~$ h9 A# E0 j- p/ u
def linear(w_one,w_two,i_one,i_two,b):
/ S; f5 _6 g$ t0 _ return w_one*i_one+w_two*i_two+b1 |0 Y4 m3 p# g! `, `
#非线性转换7 G: \" x" Z$ F" _% C
def none_linear(i):$ ]/ @# y* O* _
return 1.0/(1+math.exp(-i))3 {& `/ w6 d& K' h
, U3 N% \% S" h0 J
print("训练开始")
" i; `* Y2 I7 A#学习周期结束前一直学习
. S- a# | M) ]$ f. w3 \# \while lt<max_lt:
1 S5 C& Z& W3 P: ?+ P lt+=1* D& B" d& c; v8 X! ^ ^
#求h1和h2输入值
I+ x' n8 y# C, o) c H; s7 N hi1=linear(w1,w2,i1,i2,b1)
$ g8 x8 y5 \3 ?8 Q hi2=linear(w3,w4,i1,i2,b1)
; @0 a' t( `7 X( Q #求h1和h2输出值7 v) }/ J6 p! k) p7 Y# d% _
ho1=none_linear(hi1)3 g7 N1 ^9 `5 x0 m: b" ?. b7 X3 c
ho2=none_linear(hi2)1 N. w2 [8 T5 b: G$ L/ }) i. g
#求o1和o2输入值2 m% j7 j0 y2 Q) G- q+ {
oi1=linear(w5,w6,ho1,ho2,b2)
: |, m$ U* K* t" ?3 d8 a8 ]5 K oi2=linear(w7,w8,ho1,ho2,b2). n& L9 M1 y% ]& \% m
#求o1和o2输出值
9 C: k( ]6 J+ C T& a oo1=none_linear(oi1)! V6 h, F8 U9 V7 L2 G, U5 G
oo2=none_linear(oi2)' m# x* y0 t& F; l0 |( z% g6 k
9 c$ {# l. d) [* H9 i1 c #求当前计算总误差
9 t- F: H$ w" T eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
! g6 n; H5 H) G& G! V5 h# V print(f"第{lt}次训练,当前计算总误差={eo}")
3 g8 e k, l: J #误差已经在允许范围,退出训练9 q, v) u8 y, o& B
if eo<eo_allow:
% G1 ~. r) u; T1 ^ t print("误差已经在允许范围,训练结束\n"): O1 Q( k- }9 B! d, X+ {2 `% z
break& \ s3 h ] @0 ~* m
#偏导
/ Z; p! d. M& j' G, N' B; _ d_eo_oo1=oo1-o1) ~ B) L$ A5 d2 }
d_eo_oo2=oo2-o2, G! W( ?9 a, s
d_oo1_oi1=oo1*(1-oo1) q l2 R7 i9 X
d_oo2_oi2=oo2*(1-oo2)% L1 x& l- t; R8 C
d_eo_oi1=d_eo_oo1*d_oo1_oi1
, X1 ] L3 R. _; H d_eo_oi2=d_eo_oo2*d_oo2_oi2: S0 r" y+ u5 m+ ?7 M# J: n6 O7 v
#求w5_new/ U8 z' R4 F" K# B
d_oi1_w5=ho1
# I: f. j. I) N8 K+ ~' ^, n" C* s d_eo_w5=d_eo_oi1*d_oi1_w52 i+ r. e6 D4 j
w5_new=w5-lr*d_eo_w5, A. M7 L3 ?) ]! G( A1 k
#求w6_new6 W7 M6 |- v8 v$ O; o8 {" J# q" p
d_oi1_w6=ho2( l7 V# s1 ^4 Y6 ?! [' t: V1 K
d_eo_w6=d_eo_oi1*d_oi1_w6
. N0 M9 f T1 R' l- p" X; v w6_new=w6-lr*d_eo_w63 u. s6 I$ s* K
#求w7_new) J9 B! A8 a p
d_oi2_w7=ho1
/ Q6 Y$ `" U. d" p d_eo_w7=d_eo_oi2*d_oi2_w7+ [! E8 l' n* z9 m9 e* W1 N
w7_new=w7-lr*d_eo_w7
4 u" A- M2 |, U7 { #求w8_new
( {( u4 g7 G9 J d_oi2_w8=ho2) K; b+ D$ b6 z! {
d_eo_w8=d_eo_oi2*d_oi2_w8
$ k o3 D3 R' M. ~ w8_new=w8-lr*d_eo_w8; {1 s- N# [/ n- O+ `
#求b2_new- L0 K3 c4 ^" x5 `! r, Y7 @9 ?. g' A
d_oi1_b2=1
! c4 G/ x/ `/ a% X1 [ d_oi2_b2=1
6 l$ H' H% |4 d4 _5 x7 S d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
8 \6 \4 X) m6 o! H+ L b2_new=b2-lr*d_eo_b24 v" W4 {* u# P; ?! ?# x# [
d_oi1_ho1=w5% W+ G7 i/ }; l/ w
d_oi1_ho2=w62 I- y3 k& @! X% L
d_oi2_ho1=w7" J' {: _& K3 f" D1 Y& F( P8 {
d_oi2_ho2=w8
9 `4 j; p9 p. _& [2 h; d d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
9 U% W# B* H0 {/ W+ ?' L$ T/ D d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
* H0 j: L0 O9 ~* K$ W* Q+ m7 s% T1 J d_ho1_hi1=ho1*(1-ho1)
8 C7 B9 r5 I5 I d_ho2_hi2=ho2*(1-ho2)" i, x+ L/ h# F6 X i
d_eo_hi1=d_eo_ho1*d_ho1_hi1/ m6 v) V" R1 ^: T
d_eo_hi2=d_eo_ho2*d_ho2_hi2
, t. n& C$ R3 ^; a- z #求w1_new
4 q: C" j* r$ ], @( Q" d d_hi1_w1=i18 Z7 P6 n6 Z w) ?+ b
d_eo_w1=d_eo_hi1*d_hi1_w1
- K6 s7 o4 @7 a+ ? w1_new=w1-lr*d_eo_w1
; g5 S2 Z3 |- t9 _+ p #求w2_new
2 i( w( s2 W! Q, O/ V d_hi1_w2=i29 B' X+ e. m' W6 \( m3 j, v, _3 W
d_eo_w2=d_eo_hi1*d_hi1_w2; ?- x. y0 R, i* y" s' R% D
w2_new=w2-lr*d_eo_w21 _# @& G7 K" v( v& ~$ D5 Z
#求w3_new. [3 A" k% w! k7 A* t, F
d_hi2_w3=i1* o$ `* I2 l5 |7 ?6 K
d_eo_w3=d_eo_hi2*d_hi2_w3
: V* i) c: }- V2 o+ j* F) c* M. C w3_new=w3-lr*d_eo_w3
0 }# {/ s0 t) o! s Y8 G #求w4_new
4 @) Z# b2 ~5 x( Q# g d_hi2_w4=i2
, ]9 F n6 A% P7 V# j d_eo_w4=d_eo_hi2*d_hi2_w4
0 K' h% a0 |; C: G6 u' d" l2 [ w4_new=w4-lr*d_eo_w46 ~. D/ ^1 _1 Z6 t
#求b1_new" q! F9 \6 f4 W6 ]* C
d_hi1_b1=1
1 {. z9 v! C) }0 E( X1 c3 u3 [ d_hi2_b1=1
; G. W- r L- M! o! e' { d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
* L, \' R3 N) s) r8 [- k. f1 ` b1_new=b1-lr*d_eo_b1; U# s2 ^3 Y1 l. M6 ~( |) l
#更新反向传播! J7 C8 G$ J& L- h: s+ z: `' L
w1=w1_new. |$ t; ]* }5 K7 b' W6 ^
w2=w2_new& U* F s3 t/ o Q
w3=w3_new9 W9 j: T( b+ y0 s3 _9 E4 V" A
w4=w4_new
# s- P3 ?3 A+ O3 t/ o$ D3 E* j b1=b1_new
5 s* c2 S" k0 U$ h# x w5=w5_new
; H2 Y. L$ W* Z6 H% b w6=w6_new! h* a& }, K j4 J% h; ?
w7=w7_new
9 P. v! R0 l/ e* E w8=w8_new
9 B+ \- w3 n6 R1 U% a5 j b2=b2_new
& f7 f x x$ X1 _# `: Pprint(f"当前计算总误差={eo}")+ H) m9 e3 T3 l4 n
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
4 E$ S- S; l1 ~' F( i+ vprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
1 E4 `7 e. x/ wprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")$ O/ [/ I0 d( z4 D Q
" n. G0 I5 i6 T3 o, m
结果4 Z# d* v2 `) }; d3 k
+ f( O8 S: N7 u1 P" n" C' z+ G) \2 }, `- v7 W- @0 p9 o
结语
( x: p# ~' w5 j8 ~1 r: w$ ]; w可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。$ A! L( _) i8 y- u) r# z
# Z- T2 Z7 Q/ g- d补充6 M) T0 j6 i. }* W! Y' R
程序中d_{a}_{b}格式的变量表示a对b偏导& r b: J1 A2 Y: w
————————————————
$ Q$ q0 p# \$ x: m; s版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" R: G$ x! E9 W9 V3 W0 D' j原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
^9 N; V( J# G; R
8 r; s' D- i( ?8 G2 n9 h( j! T' i9 N+ O; w
|
zan
|