在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 569622 点 威望 12 点 阅读权限 255 积分 176109 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
人工神经网络——反向传播算法初体验(python实现) $ \1 }; ~: A, ^9 u1 G% y" }1 N
, A) c+ l3 |8 T. Z7 X
背景
8 c. V- m S, ^1 F$ I 初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下$ o4 ~# m" [* m. }2 S
3 r s# J" p+ s0 {( P6 i1 [8 d 【神经网络分类算法原理详解】
. [8 G# k/ O8 ] 8 Z! W8 J1 ?* H5 s( z% a0 b3 e
注意6 ^2 Q% N V. j
站长提供的图片有点小问题,我们更正如下: h% a ?- z7 U. [$ Y
+ p" U' z& l& |; K" r4 b- y % S$ U8 n/ K" M- I
5 U1 G6 R( Q9 Q6 B+ r7 Q 问题" q# A2 o- ~" H, z
根据上图所示,我们有已知
: H% T$ u- A0 M% R* y6 Z- q , {, l: m* Z0 z0 W" H' ?1 f
#输入层
$ B' W# C r: V( z i1=0.05
. X6 X1 V i1 ?4 Y5 S* k; a" t i2=0.1
, L% K/ U W( u
Y( H% R$ @3 j% S) ]! x1 z #输出层
# h, `. m" D5 x5 I4 A o1=0.01
' ]2 l$ E6 F3 j o2=0.991 G2 ?; Q$ }2 g# y; a) N
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
8 W& E1 }, I2 e: a* z' ?! Z/ G6 w 7 Q* T- r" d1 y ]
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
/ R) H& |: H+ v$ P; p+ Y; o0 y ; f/ b* H* |' n( p
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
! A* t- J% i* u& z ) B! V# U' B; d& b
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出6 k% J/ K, e; I9 L1 m
! J% C6 L! q+ n9 r7 J& x
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
3 F) Q6 u e3 f $ M* |. s6 \' d& q8 \3 Y: H3 A
同理# }' B4 [1 X+ K* z# e4 F
{% W! C* W% X 神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))1 s0 L5 D' A- y1 s# }2 Z# j t# K8 T6 g
- B4 T/ X) ~$ _' L$ q |4 u' V3 ` 接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
! U. C6 k, E! x 2 c6 p" M+ r- B2 n
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
! b4 P( z( P, K; S: f- v( \ 9 d5 c _1 w# u* z
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2* Q3 u- L* A/ j9 X+ ]
& S, O F+ `' B2 O7 ] 再经过非线性变换Sigmoid函数得到
+ M- y' A$ |( e; [ / h1 R0 i& e0 _; F. s1 b$ p8 Y1 @2 _; S
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)): @* X V6 y8 m# }: ?1 ~
/ A, R1 J/ }1 F9 f# n l 神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))# o6 i5 ], j+ Y j
) ?, I1 c5 S8 g( K& F" A
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
2 R9 X* G% d6 X" V; i8 h* T e, K$ t( {! C- A- u$ P0 b9 E* v
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
4 M9 u) J) p9 X$ o# D 0 B; j+ Y8 b+ M
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足9 ], T: P6 v' R: f: Y8 g
) R" l0 h* x9 j; V& _ 学习次数 (learning_time 简写为 lt)我们限定最大为10000次. P; S9 G& n( U5 S7 ^9 V" K `3 i
! P/ C2 k% R# G 学习率 (learning_rate 简写为 lr)我们设定为0.5
" _1 C2 B- {$ Y* o$ _ 7 L# L1 _$ D4 z3 X& t% K
依次求解代求参数) k9 E6 l# L6 Q! V; O5 {/ e) [6 u
& q( F n" x2 B. A$ z6 O
w1~w8,以及b1,b2
* K7 V/ F4 }$ \2 \8 J) S ! k* i% T* I7 C/ U$ q+ o: e3 ^
跟
. D0 K$ U$ j0 s3 s/ N. l$ k 5 J6 f# j: {# s" y: X# I2 v) g. }
损失值 (eo) 的偏导数5 P8 O/ ~0 z: E+ S% G1 Q
6 W7 F$ H, h: J, U$ |9 t1 \
再更新该参数,更新公式为
7 L: q/ Z1 N# }5 ^' \, _$ R
- q1 `) |/ Y$ w C 参数_new=参数-学习率*偏导(eo,参数)1 v. @: b; Q/ `$ a
随后进入下一轮学习
( _: @3 e' ~) e7 X' G " o% ]8 ?0 d' m9 a1 D
终止条件(满足其中一个即可停止训练)' Z b* b- [( i5 L5 Z
( R5 ?% P9 `- {) }3 t1 R# G
1.学习次数达到上限
2 D* w$ @1 v; c# e) k' f5 ^& x" b * X) \) a9 K! W0 w
2.损失值达到可容忍的范围- A& [. m4 G7 _. z( f A9 g i2 p
s, R; b. w4 g
导数
3 I: g6 H4 a q/ ^$ {( x f(x)=1/(1+e^(-x))的导数是
) y5 P+ y8 I8 l; P; ]4 L* c: {9 F- _% I f'(x)=f(x)*(1-f(x))
' m; v, {! W: h) \# H 源码
2 R$ e: x }, T z+ | import math
' n( z7 n. H( j ' C. K; i6 J( t8 z: D, z4 O
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
: ^8 A- N5 @! J7 A9 F+ ]3 Y& Y: G# T #网址中图片有误,请看我博文上的图片
4 p3 T3 a8 i& n3 Y! u
' [% x9 }4 r" \/ C+ w1 } #输入层 K" f, w9 q! [6 f/ _% x5 P
i1=0.05
/ _/ `* ~7 h/ n( f6 y$ g i2=0.1 h9 M9 p n' |5 k1 _9 L( `7 m
#权值参数! M+ e3 N) R" w- o9 n
w1=0.15
" r @: ?1 B: ?7 F: j) S6 @ w2=0.2
1 _0 `( {4 Q6 k# C6 I w3=0.25) ?0 f6 a' n1 ^1 f2 k; k7 @
w4=0.38 X, v6 _8 Z( w% f; O
w5=0.4
+ V6 V8 ?# u3 M4 d" S+ i w6=0.45
. h- K: [4 Q. ?0 _. F m; k A w7=0.5" L- p' z1 w( I8 g
w8=0.55
! ?9 I$ R% D* H {% c/ K+ U9 J #输出层标记(即期望值)
( i0 ]1 G% h) t2 i7 w7 u7 `, e o1=0.01
+ ^$ J# ]9 k1 j4 o7 o; @ o2=0.999 A- \/ Y4 H! k: w
#偏置项参数
' w( Q( ~1 t# ]/ S9 c& b$ t b1=0.355 P7 U# I% c8 e: |
b2=0.6
+ O! m: o$ U" a' o& a9 M
, ], q; |! ~* f9 I! Z0 Z4 {! m #学习率
5 b* f* o9 t" y, c7 L6 o+ @! A lr=0.5! J6 ?* P! }0 ~3 w3 u
#学习周期
4 m- M1 K, L) I3 h9 e lt=0
J' S& Z0 l m% v2 |7 O max_lt=10000
/ H6 h: S3 V4 {" q- s( @1 ~$ n: E #允许误差
! r7 j& |9 }2 |4 g5 k- { eo_allow=1e-52 Q& h1 \" ^* G
0 x0 f m' g7 c3 r% A& Y9 c9 E
#线性转换1 r! g2 e0 \, E1 f4 Y& E% p
def linear(w_one,w_two,i_one,i_two,b):( V3 g3 H5 T* N0 l% I. U
return w_one*i_one+w_two*i_two+b7 z; {, Y3 ^3 O' c( [; `: {
#非线性转换& d8 N/ ~+ j5 G9 V* k
def none_linear(i):
! ^* u) w4 y, b/ y return 1.0/(1+math.exp(-i))( F/ R7 f% n0 y: e
7 E+ }- E* D2 u4 J9 ~6 Y- [0 f print("训练开始"): X: Q: [. [& K D
#学习周期结束前一直学习3 W- w) X6 W& C) s m' R( o
while lt<max_lt:% o% @! ^4 E$ \# M1 e( I
lt+=1
8 o4 P* I! r% y3 I #求h1和h2输入值4 H+ E4 A' g; F8 i
hi1=linear(w1,w2,i1,i2,b1)
; N4 g& x; d" j; N- J hi2=linear(w3,w4,i1,i2,b1)+ W, M( v1 p1 g$ k- q
#求h1和h2输出值7 n' L/ X) [0 A% j3 M& J1 \7 R
ho1=none_linear(hi1)
* w: {4 I+ Q) ]3 k8 d$ t0 G, N ho2=none_linear(hi2)
8 h; Y' ~+ W Y1 p3 c #求o1和o2输入值* ?4 u6 L* w8 [- t
oi1=linear(w5,w6,ho1,ho2,b2)/ W% `" g, S' C; F( E
oi2=linear(w7,w8,ho1,ho2,b2)7 f3 w3 R( g2 B% C9 [
#求o1和o2输出值
5 l1 e r4 D n. u2 Y oo1=none_linear(oi1), N9 j4 Z0 m* W
oo2=none_linear(oi2)$ w8 e1 g A# F. {+ O/ `
8 ]% k5 d$ q! ]2 o! D: B& N
#求当前计算总误差
* ^1 L s! V3 P eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2. |3 H* H8 x8 S, Z* |2 n
print(f"第{lt}次训练,当前计算总误差={eo}")
& M4 Z1 r- q* R #误差已经在允许范围,退出训练
9 u" \# s4 A+ N( h if eo<eo_allow:
2 h% D' D$ B8 k. X, f$ U: v print("误差已经在允许范围,训练结束\n"). r6 ^3 L. c: y! S2 b
break
) I8 Q5 y3 l* Q" Q! {" V #偏导' i, P: ~- m" O
d_eo_oo1=oo1-o1! o( [8 _& N/ s: y) Y: c ^( I5 a
d_eo_oo2=oo2-o29 z0 E( Q$ p' |" P; w4 }* M
d_oo1_oi1=oo1*(1-oo1); c/ w# p7 Q. ~/ G" z: x: ~8 O
d_oo2_oi2=oo2*(1-oo2)
- k. k, E. [' N3 B d_eo_oi1=d_eo_oo1*d_oo1_oi15 U- V0 z# ^- E; M
d_eo_oi2=d_eo_oo2*d_oo2_oi2$ }( a: r( {8 Y! l
#求w5_new
. B. Y& l& h: w8 f7 ? d_oi1_w5=ho15 z; T. K6 L/ k5 k8 x# m& A
d_eo_w5=d_eo_oi1*d_oi1_w55 S; v" s' e6 O8 C4 ?/ P0 E
w5_new=w5-lr*d_eo_w5
6 z8 h9 \7 U3 t4 J* Q( b% v5 Q #求w6_new
' U) \6 ]2 m! ~7 ` d_oi1_w6=ho21 J# R: _# N5 A
d_eo_w6=d_eo_oi1*d_oi1_w6
, c' n# s- S' e6 T w6_new=w6-lr*d_eo_w6
& P( V+ h5 K. T& v% ] #求w7_new
8 K# l2 L4 f! |1 | | d_oi2_w7=ho1
+ I3 N/ h. e6 h d_eo_w7=d_eo_oi2*d_oi2_w7
* `+ r( Y* W! L J w7_new=w7-lr*d_eo_w7( e4 H9 c) l2 T* o8 Z4 i" F* |
#求w8_new
+ i( k! l z" @ c- Z d_oi2_w8=ho22 \# d2 B9 Y' ?, B) y: }
d_eo_w8=d_eo_oi2*d_oi2_w8/ B. p, l, z4 R7 d% g3 G! f' U
w8_new=w8-lr*d_eo_w8
, u& `( ~% B1 I #求b2_new7 D) [( X g) \7 a5 `; o1 E* E
d_oi1_b2=1; N0 H8 f* l) R# m# Z$ N( m
d_oi2_b2=1$ M% K. J- g, V1 f
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2& o/ @8 `/ s' D
b2_new=b2-lr*d_eo_b2
5 e3 n/ S4 r5 p& F: X$ V d_oi1_ho1=w50 |$ P: C0 J4 {
d_oi1_ho2=w68 b0 P% J3 [* t+ M" ^
d_oi2_ho1=w7
; ?4 P$ _: @7 S6 [5 l, t d_oi2_ho2=w8: K1 E2 ~1 E( h
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1 L/ r$ M7 n' Y# t
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho20 Q$ t% x. G" R$ C& H5 g7 ~* K u
d_ho1_hi1=ho1*(1-ho1)7 P' ^8 b* _ ]/ B
d_ho2_hi2=ho2*(1-ho2)- Q, N9 G% j9 g/ Q' Q
d_eo_hi1=d_eo_ho1*d_ho1_hi1# G* I; X1 c4 Q8 \
d_eo_hi2=d_eo_ho2*d_ho2_hi2, C( I( D9 |- h: @; y
#求w1_new
) [ `, P q/ N' m2 D1 U h d_hi1_w1=i1+ F: ~( s c- ~, k& I. d! u. n& d1 }
d_eo_w1=d_eo_hi1*d_hi1_w1
6 z- B$ ]4 S* V- {2 I, B/ k/ Z w1_new=w1-lr*d_eo_w19 p9 Y0 j: ?; h, ]; s, T2 U* u: ?
#求w2_new: |8 \, } q+ t7 ]6 k6 |4 C3 F" n
d_hi1_w2=i2% D1 F) b9 j+ r1 T- f3 ?6 F
d_eo_w2=d_eo_hi1*d_hi1_w2 {; o" U7 X# v
w2_new=w2-lr*d_eo_w21 H3 h8 I2 m% ]6 T9 w8 u5 V3 T# R
#求w3_new0 b4 \) {; `7 h2 p" ^; C% u4 ^7 T' x
d_hi2_w3=i1
* l. V: F* X, ^# ]( ]! E d_eo_w3=d_eo_hi2*d_hi2_w3, d6 @8 k9 H9 ]0 D: Z/ u
w3_new=w3-lr*d_eo_w39 ]& S5 X0 i3 H$ i
#求w4_new+ Y; }0 g) u7 f5 j! B- p' g
d_hi2_w4=i2/ s) f' N+ Y7 X# q5 T; X
d_eo_w4=d_eo_hi2*d_hi2_w4
. i9 h6 ~! a% M9 t5 W, t w4_new=w4-lr*d_eo_w4: k4 b( @2 E$ Q+ y
#求b1_new
+ T1 @1 Y U+ \% n d_hi1_b1=1
& x$ Z9 g( L3 _ d_hi2_b1=1
. q L- A- t/ T$ k d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% _7 Z5 @9 w$ y, Y
b1_new=b1-lr*d_eo_b1
3 x! a0 u6 U4 F/ O2 B #更新反向传播
: N4 j; z |/ V' z w1=w1_new
1 ]2 i: E0 j/ } [5 B w2=w2_new
' T% u+ l- N w, X# R w3=w3_new
' @, h) S, U1 R w4=w4_new
# c. ~' ~: J3 o b1=b1_new7 f* `' m9 H' F v/ E
w5=w5_new% }1 x. t, O/ g) p; K2 p
w6=w6_new2 W% I0 S8 G& \' u0 T! h
w7=w7_new
: \( q4 E2 s. w( h, h ? w8=w8_new; e) G: e" ]9 E& {% b
b2=b2_new
6 x5 S% B Y d8 F$ Q print(f"当前计算总误差={eo}")5 I. I" u$ P( c- U
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")) L; P0 [/ t( ]" m7 x( v
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
- ~6 } a. Q& ~6 r% I( s o' A7 u print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")6 S$ e* }" P2 ^2 I1 ~( `- h
, w2 I! z% e" A( F) y6 K
结果
* {1 i) j! U+ k0 R0 I" H/ Y ) F6 k1 n8 _( q5 j) o, @
: }, U7 v4 R: Q% p' w K5 ` 结语6 M( M( K8 E6 `4 T: G( N
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
: f8 ]3 \6 c" m3 h2 `
9 l; o% ^! @: p: M: v: ` 补充; {$ |4 Q$ L& S s
程序中d_{a}_{b}格式的变量表示a对b偏导
1 m7 {. u& a+ t9 z ————————————————# e! B: |+ L% w
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( n7 Y* F/ D, Y* Z" V 原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
, b# c# M$ h2 R1 l* u$ r7 o2 e1 e 2 T. r3 l4 O* J! u* }4 J& g' c! _( I
1 W/ B6 t4 ?+ b, ^0 U" q* l
zan