- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558515 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172927
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
! h0 i% _) y7 _& F8 V
) ^. q- H H! i5 }# b3 Y背景
* h" ^, W. _/ H$ |+ `2 p A0 ^初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下4 C4 ^+ X# I A1 v
& ?7 p6 `6 ^: P* k2 N: X" K【神经网络分类算法原理详解】
# @. s5 T& A$ {/ n/ U# ^
( n( X4 ^: n8 W% m r% y注意. x. T" d/ f7 w* O* g* m. ?0 y% d+ F% c
站长提供的图片有点小问题,我们更正如下
% {7 B2 s: u$ ?0 U
; M! e) @, [. U: g2 N2 S N0 y) M5 J: J
- S/ x0 D I, m4 E) L( [问题
1 c8 b6 {$ I( [. @+ S4 d( i( W根据上图所示,我们有已知
% {8 V9 _2 s0 ?: [' Q8 z( f3 f# D+ I8 M
#输入层& I" x& |% I/ Z" [8 f' L
i1=0.05/ b, e+ @% I8 X6 P4 k2 e; d
i2=0.14 s# `1 z/ s, G1 u8 |- B
0 F" O; V4 r' ?" G- N% o
#输出层
+ w7 u F% S4 X: }o1=0.01- @: t1 J' \+ _! q/ B( i) C
o2=0.99
# T' [" w4 S2 Y这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的5 i! K+ P$ r* K$ Y& e4 B- b
9 R- ^: X5 g: X5 {! J3 P
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1; `- s% @5 Q4 G$ v$ x0 L9 X5 A
0 `+ C* O0 ?) N8 }. k1 s3 ~" @* j/ ]神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
$ d" i+ u9 x9 k: t2 U7 h: ]: _5 h% X' p7 g& ]5 x
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
5 W8 e! r9 c- D W. }3 |& V3 p1 X
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
8 f" s$ G. h" H8 j
0 B9 F- q* I1 M2 O* O% w# }9 Q, X5 ~2 a同理
8 E5 R: A, ~" H' G4 y, J' C3 F6 k, [
% z2 [& X3 G, C4 E I& ^, W神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))0 w: n7 w& a) q
/ j- o3 a5 {* O3 M( w8 u
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式% c0 a9 X* w2 c9 i) n
: k' o2 x& ?9 s
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2! \. ]; p$ Z1 x
5 b) v0 l0 I8 \9 F神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2! k) r2 |% V" E. I+ | K
5 U7 h# [+ K& F% \
再经过非线性变换Sigmoid函数得到
( T7 R' w( L/ z; F: Y7 e1 z2 }/ e% t
* b1 e4 H# o: x" I! h( H8 W+ B2 U' O: q神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))) A8 E3 `5 o3 t
1 `: P9 g3 X( O1 s4 o/ _
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))4 A2 Q3 n* p% A' Y- X, i
7 Y* v8 n% \/ Y) X3 E我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
3 j8 b( Y# H2 T7 V+ L9 e* b$ ^+ V$ x* e6 q$ I* K0 ^: n3 _- g
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2! C5 S' y' E7 j6 W
% l3 H+ A( }6 O, a7 Y
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
$ |7 j6 N6 g4 W5 }! O% w
: p1 x2 u G+ K* k1 g. I. U学习次数 (learning_time 简写为 lt)我们限定最大为10000次
# D. u4 m& z, a# C$ l( j7 J- I' x$ m( @ E% u
学习率 (learning_rate 简写为 lr)我们设定为0.51 x6 ?; a, u$ p& R1 q. x8 x
- d% X e8 @; ~8 b0 O
依次求解代求参数. l6 \* X v! h3 ]' b# m- a
) d9 K: p( v8 I/ d5 @8 m) u
w1~w8,以及b1,b2
8 h: h, W7 b1 y: R) n* e t9 z8 ~& ^8 M* e
跟+ h& m& f! h$ b6 ?4 ^
( |* l' T# \9 K# w0 G
损失值 (eo) 的偏导数2 C2 y& E4 o; X
! R$ M" Z7 T" `5 Z5 E _
再更新该参数,更新公式为5 X8 v$ N, w, a. @) X3 h4 \
9 |) h# Y8 S+ Y- g. W6 R& n' r) q参数_new=参数-学习率*偏导(eo,参数); @9 x7 H9 N. ] \3 @$ B ^ _: z: b
随后进入下一轮学习' g, e/ g9 u z1 a( S4 N. _
2 G& A6 @4 `" b) [6 |4 y终止条件(满足其中一个即可停止训练)
' J% f' L2 ]: f" }& i7 J8 }
" _3 Y( m0 v. \8 s" Y1.学习次数达到上限
# ]- z: C% \# P
- S& y: d/ R$ I7 r0 P2.损失值达到可容忍的范围
) P& j. I: Z" F; W: L* \( w/ |5 M9 {4 B( k1 T3 T7 T; Z
导数* r# Z6 j7 ]9 l0 V( Y4 \
f(x)=1/(1+e^(-x))的导数是
' [% q Z8 V9 L) d$ _0 Cf'(x)=f(x)*(1-f(x))7 v# x4 c/ p/ U7 d
源码; E5 g. s' P* u* R! j, z& q* K: Y
import math
7 L- ^9 r; Q( e2 U# Q, U
$ b% F5 i7 e, i#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
8 x, n/ d0 g: J; l9 y0 F#网址中图片有误,请看我博文上的图片
) [2 v- G f: s# v9 R/ V, K' K8 {& v) @+ v1 h2 d# v
#输入层
* H# O2 ^5 w7 E; V8 @9 bi1=0.05
6 z7 |" D d. l0 u$ ci2=0.1/ W' t4 s0 x7 L; h, }
#权值参数
0 K T. M! \9 X4 ~/ Ww1=0.15
% i$ z& p" J! }- T9 C( Y, ?w2=0.2
' L2 j" }2 q" ~0 R: j. |6 aw3=0.25
8 P) K) V" l0 \; z: Cw4=0.3
) z6 K4 o" z; C7 h) Zw5=0.40 U7 c2 O, Q/ V5 p8 K1 h
w6=0.45$ f8 { f1 S- u9 }3 D
w7=0.5" |0 l7 U4 ~( C4 I, b
w8=0.55
' y$ {' W' ~- f! i" y0 y) O#输出层标记(即期望值)
; X6 n- r8 `6 {$ Y% {; _+ bo1=0.01% ^: }" J( M' ]2 x/ P4 q/ \
o2=0.994 Y" Z0 t: ^: i$ n( v6 O N) D
#偏置项参数% ~2 ]) j0 v. }
b1=0.35
2 |9 u* Y9 H; w' f: o _* G7 Z" j: V! [1 `! ib2=0.6( E* g( J2 K- K" ^. f2 \
9 o# S2 m1 ^1 `6 p; B" h
#学习率
7 f! T) a5 N$ x% E/ Ylr=0.5
* Y R c7 u2 x2 [#学习周期' ]( ]# I% ?3 V6 f( K8 ~
lt=0$ Q1 X) {4 p, e$ {0 m& i
max_lt=10000
8 y7 h* ^1 ]9 \0 y7 Y#允许误差* k7 ~8 r! {% y
eo_allow=1e-58 b. I; v5 G' i7 \. m/ h! b2 I
. J6 q. e1 X" _, ]; R& v
#线性转换0 R( n/ n, |3 Q( I# ]( k, p+ G
def linear(w_one,w_two,i_one,i_two,b):& T. Z# ~( b4 O# Y
return w_one*i_one+w_two*i_two+b3 K. B' E* L% e
#非线性转换
( Z& P$ e, [$ Q# j% m7 n) Z9 Pdef none_linear(i):
" F9 Z+ `& q! `4 v3 B9 u) W# W return 1.0/(1+math.exp(-i))
" s) k2 S" X* a! @
8 G) r1 }* m! [' W1 P5 @/ aprint("训练开始")- ]& w1 a ^ D6 I8 e4 K+ e% V
#学习周期结束前一直学习- a1 }1 r6 [7 ?: b
while lt<max_lt:% l3 `2 z# E3 U; n; B
lt+=1
) H& n& U/ C/ h #求h1和h2输入值3 D3 Q; l. o+ o5 C5 E S
hi1=linear(w1,w2,i1,i2,b1)
, |6 A) x8 [# o6 x+ T hi2=linear(w3,w4,i1,i2,b1)
5 j& X# _2 [; ? #求h1和h2输出值
7 Y* G1 \3 v2 e3 r# G ho1=none_linear(hi1)5 ]+ S! p6 W3 S( I$ `! @5 q
ho2=none_linear(hi2)! N" k& y) B# t& l
#求o1和o2输入值; V3 Z* _! [6 k( a
oi1=linear(w5,w6,ho1,ho2,b2)" A+ l; i6 B; ~" H) C# c) F
oi2=linear(w7,w8,ho1,ho2,b2)+ o9 j, z9 w3 X9 _4 p2 y4 ^
#求o1和o2输出值
6 }' j1 B$ h* F) i' ]- f oo1=none_linear(oi1)
7 |3 f- q6 z, k6 q( ?5 D2 P, d oo2=none_linear(oi2)& P8 g8 @4 M* W8 h) w
3 c K7 v$ u0 [5 U# \- Y/ s
#求当前计算总误差9 v; `- k7 U" x5 \ U, _
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/20 ]- \) S1 X4 y! u$ k$ x7 a! a) d9 L
print(f"第{lt}次训练,当前计算总误差={eo}")% |' d; x2 ?3 Q( r
#误差已经在允许范围,退出训练5 {7 Y7 `3 y6 _, w1 K
if eo<eo_allow:$ `8 Z$ r4 l: y# @4 G( Z2 J
print("误差已经在允许范围,训练结束\n")+ K4 N, d+ D- w
break* X2 q& e) C2 j
#偏导
' e: {$ y6 T5 v( v1 ~) [ d_eo_oo1=oo1-o1+ j! Z4 K% L5 }6 S! _
d_eo_oo2=oo2-o28 z6 l6 A1 g9 M- [/ u
d_oo1_oi1=oo1*(1-oo1)
. c5 W: g8 ^! u d_oo2_oi2=oo2*(1-oo2)
* N- Q( s/ M( C$ w+ J: @# L0 g d_eo_oi1=d_eo_oo1*d_oo1_oi1
6 O: g/ ~, C: f( ? a" a* H d_eo_oi2=d_eo_oo2*d_oo2_oi24 c* S# Z: E- K6 r: B9 X0 | [
#求w5_new* G& `8 `* _; K! `% o# M
d_oi1_w5=ho1
; g- B/ v9 L. g8 } d_eo_w5=d_eo_oi1*d_oi1_w56 E4 l; A: Z1 ~
w5_new=w5-lr*d_eo_w52 `; Q" v% s4 b7 t) _+ q
#求w6_new
) r8 K1 [, C; \9 Q3 ]8 x& B d_oi1_w6=ho2/ G# i9 l* g. ^& T' U
d_eo_w6=d_eo_oi1*d_oi1_w6
, C1 \& T6 C5 \& p e3 v5 T% E) Z4 D w6_new=w6-lr*d_eo_w6
9 C5 K0 Y3 F' G4 c% H3 H #求w7_new0 f2 a& C9 r2 V. D0 i- W
d_oi2_w7=ho1
9 `: o: u0 L/ e( W# K d_eo_w7=d_eo_oi2*d_oi2_w7
+ ?3 S' F% g7 B w7_new=w7-lr*d_eo_w7
0 b* T) P& m' j: d" ~0 a+ J+ k #求w8_new- V6 a1 e, v6 p; x( U2 F' r$ Z
d_oi2_w8=ho2
2 t4 o( G" w; x& I' _$ r) W$ e d_eo_w8=d_eo_oi2*d_oi2_w8
& x# O" b5 |; ~) q* ? w8_new=w8-lr*d_eo_w8
1 p) K3 K2 D2 F0 G, _6 e #求b2_new
8 @5 N8 R5 m& V. A9 u" v d_oi1_b2=1
\9 O/ z: G& G! |; v$ A d_oi2_b2=1* ]3 P5 z/ I" h- p; i( ~
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
5 I1 N# O2 }: H4 u: F b2_new=b2-lr*d_eo_b2: y: F# X! w# |+ q
d_oi1_ho1=w5( L6 l$ A; ]' I1 k
d_oi1_ho2=w6
& y, B( H: C7 V* h: i9 u4 B& y d_oi2_ho1=w7
* S# j8 }4 u5 U) l d_oi2_ho2=w8) ?7 c ~! }, H2 J! X" Y
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
# Y0 f9 Q6 k" i* M( f% m6 Y8 K, @ d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2" I% M0 z4 L, J6 ^ b
d_ho1_hi1=ho1*(1-ho1)
7 c9 c& e; Q1 J, S+ D6 b d_ho2_hi2=ho2*(1-ho2)
. ?. y' |7 e% K; h# G$ [ d_eo_hi1=d_eo_ho1*d_ho1_hi1- D+ U( s+ s2 T7 A# w* q0 j
d_eo_hi2=d_eo_ho2*d_ho2_hi28 p3 n3 F) z5 Z' h
#求w1_new0 z: \0 k# a2 b; _ o5 Y- ?' d
d_hi1_w1=i1
0 A8 ?8 \" D3 l" b A d_eo_w1=d_eo_hi1*d_hi1_w1* f( d1 r) l8 h) e) S
w1_new=w1-lr*d_eo_w1
* T! ~ d; u+ U #求w2_new& p# G' C" s8 I9 [/ P. ?, z3 I% @
d_hi1_w2=i2, `1 l3 e9 {8 w, C2 W9 g1 ^
d_eo_w2=d_eo_hi1*d_hi1_w2
1 v( z" h0 r3 O8 F8 [ w2_new=w2-lr*d_eo_w2
* S8 a( ? t; A #求w3_new5 W% y1 z$ ^) ]
d_hi2_w3=i1* I1 }8 Z; G/ o0 S' r
d_eo_w3=d_eo_hi2*d_hi2_w33 V3 g9 ~* |' J i: B
w3_new=w3-lr*d_eo_w3
1 \% X1 h. R5 @. } #求w4_new. D* ~, J% `3 T# M
d_hi2_w4=i2
; o3 l$ \) K$ {& c: Q5 [- B d_eo_w4=d_eo_hi2*d_hi2_w4
; x) W" `4 E! o+ T' Y3 j5 z w4_new=w4-lr*d_eo_w4
' y; J) {& T7 n' v" t #求b1_new
! Z; e" H& n4 w$ H d_hi1_b1=1! j6 `+ w, B* c+ g6 p
d_hi2_b1=1$ |$ H# f! b+ |& q8 e4 Q$ J
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1! B( ?, t- l6 m! \5 S
b1_new=b1-lr*d_eo_b1$ A2 L3 R; f( p9 t# y
#更新反向传播. U- t, `2 W3 ^. J
w1=w1_new- k$ n5 I' y3 P
w2=w2_new
/ L8 R3 T R' \3 v4 t% _2 ^ w3=w3_new5 Q7 y& L0 ^: H7 S* T. z4 d. R) h
w4=w4_new
p7 ~! E3 I9 |, [+ r b1=b1_new
3 v S" _; h& ?/ n* d$ r# |2 H w5=w5_new
0 z6 J4 D1 x& _6 g" J0 s: K, m r9 R" C+ ^ w6=w6_new+ r( S4 P& Y% n% T0 E4 z7 y; b
w7=w7_new
2 C. F: m3 ?# r6 d; p w8=w8_new: ]. w: [$ q( a# D
b2=b2_new
4 b9 Z+ Z" m7 V" X7 _# Bprint(f"当前计算总误差={eo}")
. o/ X q: d: c$ c' H# x& zprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")+ [0 P, S! ?* ?* p+ s& k( r
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
/ T& X' R8 W. Q& L2 @print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")% Y4 C5 `* s9 R k0 t; d/ v
^2 S% q4 E! ^4 ]结果
! M3 i+ Y8 E% d M5 E& J% o: a; [* x4 d" d, Q5 r$ W
& p& V k$ K3 A2 [, a7 w! n
结语1 O% w% y7 `8 O( t) w8 l- @
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。9 @$ B2 k0 J3 v' V, Q0 T
) \. @) X9 T. q补充9 |% R _" t8 t% D7 d0 n) u+ G4 @! {
程序中d_{a}_{b}格式的变量表示a对b偏导* D; t3 L6 a4 n ^- y. W. C
————————————————- V* ~& q3 D2 \, O
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ |6 M5 F, W$ b% Z s+ a5 l Q原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679546 K& Y' {1 H: K8 }
: i% s% o0 Z% L" U6 X6 ?6 d/ s
, p# B* D+ A6 A& {/ B6 E4 B |
zan
|