- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563252 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174198
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)9 X' F5 [# g( o. W$ Y/ [: I8 O+ z& W
) f2 c0 h: R' l( K2 C背景
6 r L$ h1 E( E5 w1 ]) [6 B4 N初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下- v4 D( f9 g" t4 f; j9 k2 |
. e. G' ^6 V% T6 k# J+ v【神经网络分类算法原理详解】
4 {7 l8 M/ p$ n8 V& E- M$ J) {
注意
& U7 o! [! h2 t# A* r: u8 }8 Q站长提供的图片有点小问题,我们更正如下
" k# F; y) Q7 A1 y9 U
8 Y' E/ l/ m8 m6 ^$ S ?( p' X3 o1 s3 @7 A4 p4 d9 C! P0 S& D
6 }* L2 Q# e# O+ Y. D% W0 a- k问题* A$ o9 L M& j2 g
根据上图所示,我们有已知
4 L3 j: H- d$ t) [% }- z, p
1 H, }+ w' J9 K% e- ?& @#输入层
* |9 O1 G5 P/ M# F0 y* s3 qi1=0.05
^" c' G7 c2 n- Z& S/ xi2=0.1" E# k1 E3 U1 f% s" i4 h0 Q
% _- s, k# x3 \8 y5 P#输出层! o t, R- q1 S. }9 F! k/ V! u
o1=0.01
8 \3 Q) d0 w+ G% N( `o2=0.99- u& M* t; [5 O6 P
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的! o( @2 T; Q4 a
1 E, y/ S& G6 h& M- C/ x神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
7 \5 [* B$ {/ {8 o o" @* S/ z; G& g# y' _' {3 N# H$ H
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
. @$ k! j# L' K1 _7 J
* F/ N- ^" F! R- ^- T' e8 U6 O神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出5 L8 y7 N+ V. Y7 ]8 B- a
( N& D1 ]& h( h: d+ p& Y
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)) N) X B. \& |' w$ T/ i3 p9 q
) F# V6 `. k7 O& g& w' a
同理
' H( I% G) p3 p9 i. ?6 i
( O) [" m! }6 ^9 r8 M- f, [# f; C神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
+ g2 i+ h' b. j- c
& W% W6 O" g' B3 {7 [* b6 `接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式, E# `7 A6 W2 w5 M/ d8 u
% Y e1 p/ N- K) F0 e( ?3 R
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
7 D! g1 @$ R F/ }3 U. s( M4 }5 ~4 t# K9 ]
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
' j5 {" o; K* ^/ G8 a- {5 o& A$ s# b( z! Y
再经过非线性变换Sigmoid函数得到0 p9 h7 Q2 X0 J4 N+ K* I
! s; C' L2 \( h神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), Z: p4 W$ s& f( B7 Z* a/ e
% u! H6 o- z: {
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
- G4 _% s/ {% t4 D0 G: E9 S0 W2 D$ l( W: ~. c1 R$ ?' e
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为( I: e* M$ x0 ~( d) x
* z. c2 u% K2 T损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2+ ^7 M- T0 ]: P! B
9 N5 k3 _* `- r( B; Z: M y3 @; W
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足* m* k( l2 U3 r
f- q/ g0 b$ p
学习次数 (learning_time 简写为 lt)我们限定最大为10000次3 b5 [3 T" M/ l9 [
8 X2 ^0 e4 ~. r0 b; y9 ^7 Q6 _
学习率 (learning_rate 简写为 lr)我们设定为0.5* N- \- Y# Z" S9 N" X
% k* y5 g N8 V) X0 {
依次求解代求参数
) y' R( a) `/ e6 F* t" ^3 d( n. l0 \4 O6 C5 W2 \7 V, U
w1~w8,以及b1,b2
0 b2 T( v2 P' i/ ]4 F7 P! l) X% J T3 ~
跟
- t$ M: S+ v- M5 O w0 w7 N3 U1 o' X
9 X& i0 J7 R* S( j! C损失值 (eo) 的偏导数
; L9 I! k6 K& a( e. T ?6 ~% R( r; c+ ?: L3 b8 t ~* Z8 h
再更新该参数,更新公式为
' @. d2 b2 W1 z4 m; v1 ^" ?
0 h1 c3 b, ~& M2 o* x参数_new=参数-学习率*偏导(eo,参数)
5 x, @2 {$ X8 s随后进入下一轮学习- b' _( z: C( p: Z
- q* g2 l; g. N) Q: Q7 w/ s; X终止条件(满足其中一个即可停止训练)1 V1 n/ w9 W6 p1 t+ H0 [& e7 P" A
* X9 k9 K7 Z2 t; r" c
1.学习次数达到上限9 c) [; }- J) b" ~3 N/ J' R( L
* O" i7 `8 u6 S- ~, E2 o2.损失值达到可容忍的范围) |4 L2 k8 ?8 @; B4 U4 `6 O R
8 Z4 C' R4 h9 |0 w: r; z导数
* p) _9 m& [7 r) a, C8 ef(x)=1/(1+e^(-x))的导数是
5 m, B0 @$ S/ Lf'(x)=f(x)*(1-f(x))
! _) A5 Z6 C, ]源码( k4 O/ @# }9 u8 {0 m
import math
; [% I" X: v6 j6 o0 c0 M7 `1 L5 B" D, {, r) H; E% S/ x
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】5 c0 { P3 K6 S- }
#网址中图片有误,请看我博文上的图片
8 a. @ [ B8 s# P, r, T( o' f- e) z. b' a0 f& b
#输入层
z3 E3 e8 \, I9 qi1=0.05
$ y- Q n/ [( n9 L3 c4 X* @i2=0.1
& ^0 O- R" T' M# [" q#权值参数/ @/ B3 G# p# w& A
w1=0.15& _0 Y+ x1 x4 A" i
w2=0.2
8 `3 k+ J1 T; X; K6 Vw3=0.258 [5 l4 S/ F" a9 g+ s9 U" @
w4=0.37 V, }) H7 L6 Q" i p( b4 R
w5=0.4
, L8 |: _! a! x% r8 |4 _. \% ^w6=0.455 n; r, t5 b" y! @$ @/ }0 [
w7=0.5# Y/ c# ]. V7 z. r7 T1 p
w8=0.55
# u& A/ o9 L7 ~5 j+ _ R c4 v: ^3 Y#输出层标记(即期望值). {; G: Z* t9 A+ {+ i2 P* t
o1=0.01
. n7 I" H7 t1 @' y6 ho2=0.994 y* S. r |$ y6 A8 |+ {
#偏置项参数0 D& C7 t+ ]0 @" x' g( H
b1=0.35
- Z) g0 T; _: P" s6 l0 d6 A7 rb2=0.64 }4 j! B7 g" D; o/ P n$ H9 L3 V
J& N8 l! N) Z- [% t
#学习率! @5 Y: K5 D/ }6 _' _3 a
lr=0.5
4 X4 t# ~8 e" {4 U. l& I, R#学习周期! N+ P- Z- C5 { o
lt=0, T [, {+ h4 V0 q1 g0 D4 ?6 E5 H$ N
max_lt=10000
3 A9 X P* }1 H( t) I" x5 [! B#允许误差
) D4 \- Z) S X- Peo_allow=1e-5 ~2 G" \$ q' @! C' }
& j0 N1 K6 ^2 R% c, }" G2 u7 P
#线性转换( H5 t( E* h7 @4 X
def linear(w_one,w_two,i_one,i_two,b):
0 M' }0 v3 u" n8 P: X return w_one*i_one+w_two*i_two+b
3 z9 j! o8 }: w8 n+ g# s* N#非线性转换
3 C; P7 o; h# M& Q+ I; U- [def none_linear(i):( ~( T& }8 ~/ X# q
return 1.0/(1+math.exp(-i))
3 W8 s( M/ C0 W2 e* @
* f. [' W) Q9 N) ?print("训练开始") ^: w! E9 @! G. n; P3 I" p
#学习周期结束前一直学习
# }1 Q" \4 W2 T3 q: e) W+ A }: Ewhile lt<max_lt:
# D8 M& G, v, g/ a0 r3 s7 r lt+=13 i- l6 |+ x3 F2 V/ R. \
#求h1和h2输入值6 O' ~ p* p9 ?3 Y# ^
hi1=linear(w1,w2,i1,i2,b1)- t2 }( Q2 h: h# Y4 m) k: i
hi2=linear(w3,w4,i1,i2,b1)
8 B1 w4 }" E6 y4 O #求h1和h2输出值1 P8 m6 ~; ~/ Z. ], m7 l0 O% D" E
ho1=none_linear(hi1)
( D! ^5 T2 ^) q ho2=none_linear(hi2)
6 q9 ~0 m) d5 _, d #求o1和o2输入值2 h! f F& R, Y6 @! ]6 ~
oi1=linear(w5,w6,ho1,ho2,b2)% r K6 o$ y5 Q0 W0 m
oi2=linear(w7,w8,ho1,ho2,b2)+ a" |, T) }+ B9 h8 A$ C
#求o1和o2输出值
5 N t w2 P, S: g oo1=none_linear(oi1): i; F* S% C9 D) |2 T O0 j
oo2=none_linear(oi2)2 m3 {6 h- S' ?& C
. P! b) {1 [: G; e9 z& p4 A7 A #求当前计算总误差
+ M8 v% N/ {7 J5 T eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
O2 p7 |) [8 G- j) k print(f"第{lt}次训练,当前计算总误差={eo}")- z* E; w( {& ~( _0 n: r# }
#误差已经在允许范围,退出训练
1 T6 A& n3 r ^ if eo<eo_allow:) P/ z5 _+ g/ B) P+ ]* N) C
print("误差已经在允许范围,训练结束\n")
2 c0 n' G; N0 f& Z9 M break
6 _( {4 c) G9 K; V #偏导- s. Y; s+ y; @3 p* }
d_eo_oo1=oo1-o1
! M: ~+ O6 U# c: s d_eo_oo2=oo2-o2
' i5 q2 z- R$ w) g d_oo1_oi1=oo1*(1-oo1)
# Z- t, [6 k, x# I$ q; H2 a d_oo2_oi2=oo2*(1-oo2)
$ [( k6 v; Q4 B. ]2 O# Z d_eo_oi1=d_eo_oo1*d_oo1_oi1( o7 o5 b0 i* `; v! U! Z
d_eo_oi2=d_eo_oo2*d_oo2_oi2
" ^- o5 w8 ]! T& T) d3 W #求w5_new
5 J1 X* h" m8 {5 ]& ? d_oi1_w5=ho1" e( |7 |% f9 s
d_eo_w5=d_eo_oi1*d_oi1_w5
. D, L& f! B, ?' a. k6 Y% R w5_new=w5-lr*d_eo_w5) A# g8 _1 j" a' K, B* S1 l
#求w6_new
4 ^+ ~6 G3 _. d% m ]7 { d_oi1_w6=ho2
/ g$ v. F1 B1 `, N f d_eo_w6=d_eo_oi1*d_oi1_w6; {2 p" d% v5 [9 c
w6_new=w6-lr*d_eo_w6- d2 p+ |0 q( v# b/ R
#求w7_new
$ _2 Q0 p' b" j0 h* T! y- B d_oi2_w7=ho1/ k2 y( V: M( _5 F
d_eo_w7=d_eo_oi2*d_oi2_w7
7 O8 b0 v5 V4 C5 ~& b, A3 L: _- o w7_new=w7-lr*d_eo_w7
6 s1 ^$ U" \/ x #求w8_new# a2 _9 a& n4 F3 V9 k' A/ S" c; @0 {
d_oi2_w8=ho2# V8 w3 Y3 Y4 W) R' c& B
d_eo_w8=d_eo_oi2*d_oi2_w8
) k* y" }( X& f ~ w8_new=w8-lr*d_eo_w8$ w! y6 S9 |3 k* q
#求b2_new z3 R: n$ T1 l6 V2 o. D( l. z v
d_oi1_b2=14 S# Q8 V8 F/ J2 i; Y! n
d_oi2_b2=1' b. s w* f }4 K. ^
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
! I G1 `# i- g! i7 ]$ b6 O- e b2_new=b2-lr*d_eo_b2% {- Q6 [7 z1 }6 [3 {
d_oi1_ho1=w5
9 t' t3 O8 d8 `' q& Z+ w3 V9 ] d_oi1_ho2=w6
, G' j0 \5 d% b, l) C1 C d_oi2_ho1=w7/ l2 ~% t0 E) r- r$ C$ d* s
d_oi2_ho2=w8
# t$ k) \; U( F9 N" _ d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
& V4 m' J" V# `8 \ d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho27 b5 T$ s1 t1 E: w+ S
d_ho1_hi1=ho1*(1-ho1)
% c3 }: H8 {9 p d_ho2_hi2=ho2*(1-ho2)% X2 {2 l' [$ ?
d_eo_hi1=d_eo_ho1*d_ho1_hi1
" m) U% G9 I% s3 t; l d_eo_hi2=d_eo_ho2*d_ho2_hi2
B T3 q m. o! A #求w1_new
" j6 {! D9 R, e0 S% J6 \ d_hi1_w1=i1
' r7 R* I8 e3 a7 p- b d_eo_w1=d_eo_hi1*d_hi1_w1
6 v8 Q' b& d( e( c/ s$ H# c4 ~ w1_new=w1-lr*d_eo_w1" S2 D! }( a0 r5 ?
#求w2_new2 M; f( |& j+ q2 @& {, U
d_hi1_w2=i2
1 C, V: H6 \$ N' V0 T d_eo_w2=d_eo_hi1*d_hi1_w2+ N H# q" c- _, O) r7 Y
w2_new=w2-lr*d_eo_w2
: [% s1 D! ~" r* x' p+ X) u #求w3_new$ _" a9 L' ~7 ^; H, n8 u
d_hi2_w3=i18 K* V' R6 E9 c, Y, V
d_eo_w3=d_eo_hi2*d_hi2_w3' |& N! Z% w& a
w3_new=w3-lr*d_eo_w3
3 @. a. O8 [! h8 C Q/ w: C #求w4_new
4 l! G1 A2 K: O. o. b# z" X d_hi2_w4=i28 E( c: M3 i2 G: u1 u) s
d_eo_w4=d_eo_hi2*d_hi2_w4
: y6 q2 u0 A' x' X w4_new=w4-lr*d_eo_w46 ~, `" ^. u! d
#求b1_new
/ n6 i1 @8 F n; n+ g3 I d_hi1_b1=16 S6 R6 f! b' I3 X n7 c! g0 ~5 r
d_hi2_b1=1; J4 s- L& s' ]
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% b0 T) M$ S; I
b1_new=b1-lr*d_eo_b1' D/ n6 Y- m- V! i# x
#更新反向传播! M$ u4 l( y: C3 p
w1=w1_new
( Z0 B( X) S- I( c* K w2=w2_new0 ?& T' l) g# m% O8 d' o
w3=w3_new
( n7 g' v: F- C$ O w4=w4_new
1 a7 ^6 g0 ]2 A& u2 \9 l! D b1=b1_new
6 v( S3 g) c g8 b" F& d w5=w5_new
?" \: r1 o' ~ w6=w6_new" v3 a! V! Y2 d# K5 W, Q( n5 ]
w7=w7_new( N" B8 V3 J9 R% G; R
w8=w8_new
) f* ]5 C8 M9 r4 _0 Z; R# B8 ` b2=b2_new
6 W4 f/ k. D3 R7 C$ \% p6 c% Sprint(f"当前计算总误差={eo}")
1 \7 P' J- w7 r# Hprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
% w, j9 k2 F" L7 l& vprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n"), X& P$ V) l/ R$ B: p
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")& p' J/ h8 U4 @- `3 }' e
7 j7 }) ^. }% s _4 `+ x9 @/ ]
结果$ q# x9 P% r( m
0 M O+ N% u ?4 ^! ~" N* b
. E5 W" G* L- x结语# ?) G2 _( G# |# F
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。: I( z& n; H0 Y2 K2 `
8 M5 u! G. S5 F( l) {
补充. c2 q7 E) k& u( ?: a- U& g
程序中d_{a}_{b}格式的变量表示a对b偏导. a+ X' D( m+ ]
————————————————
) z8 t0 p1 `6 K/ c- _- p版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: E# h7 z( `# ^0 n$ B) d4 Y; l
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
& s2 `, a$ \/ W7 U6 H. q: B* l' F; o: S1 O2 \
# N2 U( A8 W- y! w
|
zan
|