- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564672 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174624
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
7 f; F) B; T) m5 y
- u) H7 X7 |9 r0 w( r D5 N! U2 N) Y背景+ C2 A, c! }9 S6 k% B% @
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
% ~ O& h! y+ ` _5 U" \- z# h/ T6 F. `/ z
【神经网络分类算法原理详解】0 X+ U. Q7 N0 n- p' }7 }. @1 {. x
t* ? @) t+ U7 ]" \3 U/ |$ G; R- m
注意
+ w; P9 R. ~, b+ G" i' ^站长提供的图片有点小问题,我们更正如下
# a- t1 d3 B5 T2 n) f$ l R, e' ?" e7 Q
: F- O# l8 @! ~# @
4 Z$ K& \$ Q; o! g
问题
6 U9 A1 D- [ ^1 b; r' X. N根据上图所示,我们有已知
! T5 b* Y7 n) u* t0 E! x/ |# u# ]3 X% j+ H: y6 E" |* ^# ]
#输入层
9 d1 x) n3 B8 k: g+ @i1=0.05
# T+ X" n' }# c' k1 ?7 F* Y9 l; _i2=0.1$ o: Y, t) s2 s" X
# V3 @/ T* k7 X3 }* E: n1 d6 L9 B
#输出层
" m) V5 _* b4 y" g6 X0 h6 p' {o1=0.01
! g8 r( ]2 e' t) v$ yo2=0.99 m0 f) i" V/ H
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
8 c5 Z: g v; E5 |6 x: P8 {$ T- ~' U- M
9 y0 Z# i6 H# j0 t" w3 K8 i神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1' p0 L3 d( v2 U
9 @8 H. U, a: e神经元h2的输入 (hi2)=w3*i1+w4*i2+b13 n( s+ W3 ^3 `3 z" K
* ^# t, q5 v5 f" z+ D$ r& O" b0 q神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出9 U& G. c1 |9 t r
$ Y6 o! c+ b' b7 d' m; m神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))8 r! R/ R9 u; m, ~' U, H( T
0 {: W8 y. H8 y2 G4 L同理7 _5 h. ~9 n" H7 M2 V {
9 R T! \4 q5 Q1 E神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))6 I5 Q9 T) o& W' ?$ P' P) N, i
. b! e, @( I% O# u* R1 Z" I& b接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
$ \$ p8 R1 F# c5 @& r9 c
9 r" M* X: c9 z, P' v神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
& X2 C8 _. E4 ^% z+ U1 Y( V) @6 U% i$ ?" C) ~" C" T% }1 n
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
3 E! Y: W3 B% ]6 O6 L1 t9 K; j' `! G8 v
再经过非线性变换Sigmoid函数得到
% ]5 \" w6 s3 P: S0 ~) z8 I! b7 G+ }6 _7 D2 H* o$ }
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))2 J0 m/ d7 l# h$ h
: F6 ~ p5 L' ~; M0 |6 j+ k神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
% u& ?+ e$ {' u% W5 F( E6 L+ ^" p3 ]# ]9 ], |' d( G8 z
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为' ~3 Y+ E0 a; b( j) [. t. l% E
- N6 Q6 o6 m5 E. T
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/25 g. p" K! f) Z/ d+ i- G4 v
, s! v' @4 [+ }4 }由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足: P7 z0 H" W1 }# e( H& j9 I
) r- a3 g% ~; u2 B
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
( t- U S: c7 ]2 `4 X) `7 }/ P* [9 _& j1 M, J8 f( r6 S8 H
学习率 (learning_rate 简写为 lr)我们设定为0.5: j. i) n* @4 n4 i: x+ O+ |
: I0 t. k i0 P$ D) ]: M, D( t4 o9 o. \
依次求解代求参数7 X5 W1 y3 f( ~' |* D! ^
; ], k7 [% r' T8 C& i: t/ `w1~w8,以及b1,b21 n/ i7 U- q/ j4 A; Q% {. U0 r
& l# j$ O8 [. ~9 j跟5 g* U: S* C9 D( j* \. n! i
1 \2 o$ l; k! K9 s% N
损失值 (eo) 的偏导数
; f. {8 d7 n c& ^+ [0 D) F
G( U6 A7 t3 B4 G( z, d再更新该参数,更新公式为
# j2 M( a: |, W$ o. E& H+ u& u+ [" t( {
参数_new=参数-学习率*偏导(eo,参数)
& j% D( [; K4 p f/ f随后进入下一轮学习
8 A4 L6 q& E: I c$ c$ @
4 ~/ S8 {% C7 t* z. L终止条件(满足其中一个即可停止训练)
% g3 q: q5 [1 _. Q+ L+ r
1 F/ W0 r0 J6 `$ @) @1 U# v1.学习次数达到上限# z' p5 t5 D( j1 j
+ f+ d! j5 p0 u# ~7 C
2.损失值达到可容忍的范围2 ?. ?( R1 H0 B& s2 W
/ _/ ?. L: ?' B; V0 m" c3 r/ T* t导数8 q: H* U+ {' Q! B1 ~4 ?3 Y7 `
f(x)=1/(1+e^(-x))的导数是
) C4 W% X/ G/ j8 `* _f'(x)=f(x)*(1-f(x))* T- A4 Q E9 i
源码; l5 G* y1 p1 Z; H
import math
7 V- t6 T7 n4 S1 S1 t4 N$ X3 o' U" b) _2 U6 S% g
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】. q# G) ~; F, K" i/ ]
#网址中图片有误,请看我博文上的图片
0 j! l$ c9 P, w, H: n) B G, p2 p: @6 L; o5 n# D; \* w8 b
#输入层: @8 T3 q0 K) M8 ?( i" l6 X: ?
i1=0.05
8 J/ z; {' {/ _9 _! r! l9 w$ Zi2=0.1
5 l' A! d7 r0 m#权值参数( p. z5 B# W s: ^: D) V5 m# k1 A! ?
w1=0.155 Y$ \. U( r5 _0 r. l: G8 Z
w2=0.24 X' U& y3 j% b9 o" x& \5 C
w3=0.25
/ W$ A% F* Z5 e6 C' lw4=0.30 B% \- j7 c, n9 U5 G! O
w5=0.4
; L$ r1 v8 P! S; |- W* Aw6=0.450 ^% j) G, d5 L0 P
w7=0.5
, ^- H6 C8 T/ ~5 K( Vw8=0.55
4 ^4 K" u3 y- b" I& z- `#输出层标记(即期望值)
- Z( O6 B0 _$ Q5 E. ^/ eo1=0.01 i7 d- r. ?1 e) F& `6 a
o2=0.99
2 w/ X8 f7 {, S* Q$ \#偏置项参数1 F9 Z) O( Y4 \4 s. v
b1=0.35' q& {$ P- q) m+ q4 t7 V
b2=0.66 V/ e2 k' a/ ?( X
! n$ y6 A8 q' I/ N#学习率/ s! g# |# p- @
lr=0.5* W0 t+ l& p2 f \& H
#学习周期8 }% Y A( {# ~ p& R1 @1 T
lt=0
F% Z" @% T2 e7 ?% M1 y( Cmax_lt=10000
4 L5 W+ R! p; V" R% y9 ?#允许误差5 Z& d3 b7 \5 Z& c2 b& h
eo_allow=1e-5. s/ c: J1 O, m- l) X3 n
# F. h' {; Y: M
#线性转换
( U/ Y# e0 [$ S6 _def linear(w_one,w_two,i_one,i_two,b):
! X7 ~* d5 ?, {9 g g3 g return w_one*i_one+w_two*i_two+b+ Q9 t) M9 M9 r
#非线性转换0 F* G* }% W/ I% a9 N/ I! I7 j
def none_linear(i):
8 N w5 F1 t* C5 |8 t return 1.0/(1+math.exp(-i))1 m# l2 K$ g* m6 o9 j
# B( C6 t. @2 kprint("训练开始")
. h" [4 Y# h+ t. {#学习周期结束前一直学习
, H+ g4 y& Y! N( ]* h4 T3 ?3 ^while lt<max_lt:7 X1 \- [3 Z$ X: F5 G
lt+=1& p& u" J: m; Y! N# ?! m
#求h1和h2输入值& l+ @8 H. ]' E: o9 R1 s& r1 N/ R2 J
hi1=linear(w1,w2,i1,i2,b1)
0 [* ~7 N! n k: u! W( U" V hi2=linear(w3,w4,i1,i2,b1)
. @7 q$ I# w/ k8 d; c #求h1和h2输出值" ~3 X f/ ]. N* ]$ Q! j
ho1=none_linear(hi1)
- M6 b y2 H: O, V0 G ho2=none_linear(hi2)
, q" v; P/ n& S9 l% H8 m #求o1和o2输入值
& p) ^! f7 [& |) ? oi1=linear(w5,w6,ho1,ho2,b2)9 Y! d, |$ d2 n7 |4 l/ q
oi2=linear(w7,w8,ho1,ho2,b2)
; o* r1 W# b1 b #求o1和o2输出值* u9 l0 k _/ h8 T p" k" S2 @
oo1=none_linear(oi1)
& E6 U. [8 R9 }7 P! ]7 V& Q" V oo2=none_linear(oi2)' l! g& }- [% p; w- x4 ~
: z, p$ O( S$ J1 Y #求当前计算总误差# Z2 ~, f, w3 P5 k
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2" r) o2 p7 }* h3 p! E1 b7 ^6 o1 X
print(f"第{lt}次训练,当前计算总误差={eo}")0 A$ g% y3 p8 _- n2 G
#误差已经在允许范围,退出训练
$ b; P% {; R7 p* F, ~3 L& j3 D if eo<eo_allow:
Z! t; v3 e; [$ X print("误差已经在允许范围,训练结束\n")
. _3 o& b% Y/ h% {- Z+ j1 t) M break6 o R) w \* |' r0 y8 _
#偏导
( z3 A0 ?1 \# d d_eo_oo1=oo1-o1
& g6 I% @* ~" q d_eo_oo2=oo2-o2 z' }5 [. n1 v7 i
d_oo1_oi1=oo1*(1-oo1)0 r: T, G, v/ e" W! F- \6 J" h
d_oo2_oi2=oo2*(1-oo2)
$ A6 w; _/ }# ~3 w, h1 x" M d_eo_oi1=d_eo_oo1*d_oo1_oi12 t8 B$ h9 l: |3 l4 X
d_eo_oi2=d_eo_oo2*d_oo2_oi2& _2 y4 B; C4 d d& q" ^$ \" b) C7 H
#求w5_new1 O) H: e, S: b3 {: |4 S( |
d_oi1_w5=ho1
, s$ p7 E( e9 D% d9 S3 E d_eo_w5=d_eo_oi1*d_oi1_w5
$ ~. |! L- o3 F5 K w5_new=w5-lr*d_eo_w5
5 g2 h" u: H5 d b w6 r3 t #求w6_new
0 A3 a' x* g, T3 ~; i) {8 ` d_oi1_w6=ho2
* v& u' B" C5 z d_eo_w6=d_eo_oi1*d_oi1_w6
& B. o! e7 s3 A* l( B9 K w6_new=w6-lr*d_eo_w6
( x' |3 B0 ^! R8 W #求w7_new! M3 Y; R! V1 P2 L
d_oi2_w7=ho1
. @5 D x& M% N# y. x& V" c% x( R' B d_eo_w7=d_eo_oi2*d_oi2_w7/ Y! q# b. X0 s2 e) I C
w7_new=w7-lr*d_eo_w7
l7 g/ Z9 V0 _ L3 N( _ #求w8_new
7 j$ F, d+ k! u. X/ \: S/ d+ i& { d_oi2_w8=ho21 T" A: t$ J7 \$ P4 V! t- D2 B/ u X
d_eo_w8=d_eo_oi2*d_oi2_w8
9 Y& }& I0 h+ Q- H1 i0 b: F w8_new=w8-lr*d_eo_w8( _% `; S1 G) n7 J
#求b2_new
1 j8 @! M# U& w; t g d_oi1_b2=1
0 t9 d8 l* ?7 e& ]9 ~ d_oi2_b2=1. B1 F9 b) k* y$ e0 U
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2% f5 Y! E$ v; W* X$ j; H3 t/ T
b2_new=b2-lr*d_eo_b2- P' t1 S0 t3 k: ^* [5 m# b4 ~0 D
d_oi1_ho1=w5/ h3 L, u- ]; k1 ~. Q4 a1 \3 j
d_oi1_ho2=w6: Q; |& g! d9 J& q( ]7 N; f' m
d_oi2_ho1=w7
* d5 }9 |4 x( B( j% h d_oi2_ho2=w8
- | P, j. Z0 A/ _' J d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho11 D/ S* ]& c) k) V, @! t
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. V3 F) {& W/ ?3 z' q
d_ho1_hi1=ho1*(1-ho1)
! N* `6 n- U' L d_ho2_hi2=ho2*(1-ho2)0 _" O6 u% T1 ?0 B& {( `) q# O
d_eo_hi1=d_eo_ho1*d_ho1_hi1, w7 g, v/ f# T; f2 u
d_eo_hi2=d_eo_ho2*d_ho2_hi2+ z5 V& d8 u$ x% t7 S5 T1 l! i: b
#求w1_new* b, v, [; ]7 e+ |& u V1 ~' E
d_hi1_w1=i1
/ J( y6 @ x! p7 } d_eo_w1=d_eo_hi1*d_hi1_w1( U* V: d% g& l; v
w1_new=w1-lr*d_eo_w1: o' i: _- f) g, b1 y) I
#求w2_new2 H) u! e; z# R2 D$ S, b
d_hi1_w2=i2
& a! ~" v- s/ E d_eo_w2=d_eo_hi1*d_hi1_w26 d" K2 y- n. b, ~
w2_new=w2-lr*d_eo_w2
! Y0 A3 q- g& w) [5 x! R #求w3_new
1 h0 h2 D l, }$ |7 @3 C. G d_hi2_w3=i1; D9 K# j. t+ i4 g8 I& g* X, N
d_eo_w3=d_eo_hi2*d_hi2_w3! S! ~+ `5 G2 K$ B8 x
w3_new=w3-lr*d_eo_w3
+ }; F0 @$ P0 S5 f0 @ #求w4_new" g9 R5 c7 Z5 z8 {! {' ]
d_hi2_w4=i2
/ u: z: Z# O$ k" B d_eo_w4=d_eo_hi2*d_hi2_w45 j- _3 G1 h0 V6 p' B! k
w4_new=w4-lr*d_eo_w4- E( u E5 z- ^4 e% `8 |
#求b1_new6 q7 w# h3 e* K7 f0 o+ Z3 ]$ ?& L
d_hi1_b1=1
2 [: d" `- |' a d_hi2_b1=1
/ l' M, c5 N F9 _. Z, }: h' z d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
7 y( \1 ]6 p- k* ^# y' d% p b1_new=b1-lr*d_eo_b13 f. M a' W" K* y& J1 X# {
#更新反向传播5 W+ ?! t/ E# R/ B
w1=w1_new
8 e2 W2 W C8 O3 ` w2=w2_new
, [' X9 H5 @- X+ V/ d2 W$ ]2 X# ? w3=w3_new9 J* N. E5 e# |
w4=w4_new/ U& ~4 Y! r# F8 J3 g; m% K, b Y; [' h! s
b1=b1_new
! V$ r) e# v y' S" b w5=w5_new7 m% {- s- x3 {+ u
w6=w6_new# N& }$ k) P! Q
w7=w7_new
' j$ O" O( d; `! E+ s3 _! D% k w8=w8_new4 Y ^* U E0 w4 q6 W6 y" y
b2=b2_new
$ ^* @! K$ q- s* }) F% Y4 n4 H4 T6 Lprint(f"当前计算总误差={eo}")
- A C7 x" @% A: x0 Y6 gprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")% {0 Y9 [$ C* L6 b3 N5 w) I
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")3 H' Z% O* n; F; J* v
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")' E6 a9 w* z% Q2 d5 z
, ^) N/ f2 {4 c8 B. e: o D结果
! w! N. H' s" {' A& U" q& F$ Q1 B, a- K6 _! X( z; T7 X( ?
, P n. _2 K5 W1 \% G7 `5 W
结语% v6 J% J5 s- ?; ~7 f, w; S
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
, }: ?3 `" z- h
: |& H6 Y9 K+ N( @1 |" J补充
1 U: y3 T8 {9 ? \5 B. i' O% s程序中d_{a}_{b}格式的变量表示a对b偏导/ V! C( ~( n0 y! B b7 k
————————————————8 i0 ]; p. A5 E& o: |" w$ N4 t
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ F \. e9 V* E! C
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954# }! c! s8 b4 t- J
0 \5 F( m, ?7 R8 c2 N
) t( Y& z! C& |+ a x- [ |
zan
|