- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563253 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174199
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
$ l# q: p' |, q/ E6 `7 M: f7 q$ L, B8 A3 j9 t
背景
( N. V( z/ h( E0 g1 J. H初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
! w% S4 n2 v( D$ w
) c6 Q; e! m0 n' n- l5 v- l A【神经网络分类算法原理详解】1 q- g; Z7 O6 b# V% _/ ^
. t" l9 V6 B ?( C" V
注意: m/ | \7 }( N& N u5 i. u* y
站长提供的图片有点小问题,我们更正如下
; b Z. E" C O" L/ P4 w! V8 s+ Y |7 w; K+ {! b! T
; h% M" T* Y4 [1 k: C i
( P8 g5 V$ p, K) u$ W M
问题" q$ Y! |# C% ^' w. f
根据上图所示,我们有已知
' f# |) ]! I$ S- d6 O, u8 u
% O& M* r6 z3 C) d#输入层" D/ n0 F6 ?6 q3 D0 v
i1=0.051 m) A, v' V6 t7 F
i2=0.1
+ S) p4 }: F, s" p) U' h5 a4 J3 m( p8 J5 O1 y* A( d
#输出层" T9 ~* J+ ~$ X. s6 v
o1=0.01
/ \6 E/ ?! \! N+ l3 No2=0.99! {* O7 C6 D/ W9 Z
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的/ i5 y( V o0 C6 h) l9 n, z
4 @7 [1 H/ H; Z3 E) B神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
, H: o4 @1 j& e% l# D" s1 h+ I4 l" R0 k4 k9 ?
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1+ ^( l2 `0 L" N3 G' T' D( a
) s8 Q, I9 m3 I4 @8 f& r: \( a4 a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出& s) u( }: K% O, ~
, g9 h0 w3 F% \0 E' l$ Z神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
7 Z, s* p) N) n% S$ P$ h) ?
( r' ^# C- u# Z ~6 z/ R同理# t) d6 n) l7 ^ p
C0 r+ Q/ g8 z; A4 D# O# N神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
/ L7 \1 E, J7 n2 [
; Y5 C4 k$ H; d" G& | o, a接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式1 a/ s% }$ ^" z; ?0 Z
. _7 |9 ^1 T, c: W4 |
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b21 B, l2 `! l. s. z% b) n
7 o' K$ Q0 r+ r; V) b
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
/ y* e: ~4 ~& I5 {5 g5 f
% m% u+ ?$ f1 e* M+ I+ E. c; ]再经过非线性变换Sigmoid函数得到
' O/ b# N4 N3 U% N1 G9 p% X9 U& T: ^" f; c
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
! x/ d5 E% F7 N
! @0 w$ Z+ _8 l* r' a神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
' k6 ^* Y% ]1 i
2 Q& |+ H2 |# U/ b% S/ d我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
Y" m" s1 r4 u% ~0 W5 z* ]( v$ I3 P6 j1 Z
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
( q& l- K0 u. v2 S$ e7 e% ~! w7 ]9 P1 G) k, d# m$ p- I: I9 y
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
5 F6 U, @( U% d4 n& [5 W8 C3 N. W# ~/ X# c2 U/ ]* r- q3 [5 d
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
; C+ G& V: Q# G2 b2 h* N/ j# V+ |: F0 Y8 i0 w
学习率 (learning_rate 简写为 lr)我们设定为0.5) t9 u$ I0 j ~# o* U H
( j2 ^7 G$ Y$ e$ U* \
依次求解代求参数# ?& A2 P k9 |
. w) u$ L ?% D3 nw1~w8,以及b1,b2& X: g" D' j+ t/ g) a
6 u3 Y- s1 L: d: n
跟9 w8 R7 a# o, A c0 {) }$ ]. L
$ f/ B; @/ Z# t( O# K( {# y& y8 L
损失值 (eo) 的偏导数
]+ k& q1 r$ `5 f$ B$ K) \" F! E: j$ N9 k# X
再更新该参数,更新公式为3 l: i% l+ H% @" O3 z: A9 E# G m! N9 T
. u3 {4 |1 @ F9 Q
参数_new=参数-学习率*偏导(eo,参数), p) ~% C, o9 O. O( v: ]% S' z
随后进入下一轮学习
6 c* d& Z; l1 i' {) M7 p- _) K1 Y6 F( p% b1 O+ {, y; l9 [2 t- a+ y
终止条件(满足其中一个即可停止训练)
% r0 t0 R, Z7 |( Y) M0 T4 B$ y7 [/ `: B( v
1.学习次数达到上限* F6 L0 i. {! \# u% T# C% ]) Y
( e+ `& _9 f1 I E A G2.损失值达到可容忍的范围
) h& O- b$ R# G* }# h% h, h" p2 m, i6 z9 ], I
导数 ?7 W0 V T E& b. M. t8 ~7 c/ R
f(x)=1/(1+e^(-x))的导数是7 _+ k, K V6 N& `* l
f'(x)=f(x)*(1-f(x))
9 y8 h- ~4 T( y+ u$ F e- ^* O1 s源码% q2 W* l! B. k5 h2 U" J
import math
7 |& d& q8 E, r2 d+ p
( ?. P8 Z& O5 \. N. ]8 V% ]0 l#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
' A- s$ e* ?; z4 `( i& P#网址中图片有误,请看我博文上的图片
, a' t) ~) @ \
, V: z% Z. r' K! f' x9 u#输入层: l g* i9 t! |+ o1 X5 ~* ?
i1=0.05& p8 C; s5 [/ s" D: y. V6 E
i2=0.16 O/ [( u: c* Q4 }% @
#权值参数1 ?2 p- K& v0 p$ `# O
w1=0.15, K! a& N/ l( ]' S- k
w2=0.2
3 k( [! l/ R; T' ~) q5 `' Q) ]w3=0.25% Z, n- i! s( P, Q
w4=0.3
6 i; `4 k6 \$ \; W7 |/ [6 \w5=0.4
! }6 f& |. N6 J0 G" z& K- w" nw6=0.45) @0 E* C! _) X
w7=0.5
; Z$ {- H5 R" z, k+ x1 {w8=0.55
! m8 ?7 L1 f( H5 p1 |; K. o#输出层标记(即期望值)/ Z+ T2 c$ m1 J. g
o1=0.01, r6 f F" q" s) ]0 {' b# ~
o2=0.99
% _3 P; I2 b9 M8 y& V#偏置项参数
8 [# s8 N `& ]8 \9 R8 a. ]b1=0.35
* {; T; R$ X" Y4 ?- a0 |# L4 H4 Hb2=0.6" i; e, R" M0 O U# z
8 P7 @9 Y) l8 b) N: V#学习率
4 T/ X; m' W( B. q: @% m ylr=0.5
]. ?, t- L2 o& u4 F3 q# M& H#学习周期
1 t9 q( ~3 r' L( B& {+ E; e! Jlt=07 ], n& V: I* I- A
max_lt=10000- j6 m( ]$ X3 T
#允许误差* q( B; Z3 y+ Z3 ^0 ]! r9 d1 ^
eo_allow=1e-5, A3 e& Y. q# A0 n2 F+ d
# d: r& G7 { j+ B#线性转换. ?5 _8 t- }; f+ A, F6 b( l5 q
def linear(w_one,w_two,i_one,i_two,b):: H, R0 j% y8 h, `% h0 q& m) G! ~- t
return w_one*i_one+w_two*i_two+b' G+ o& g. S& V) R- t6 i+ e. M
#非线性转换1 m2 V; h6 J6 _; ]/ D! r. k
def none_linear(i):
/ S# E8 @2 Q6 o7 ]$ l G0 j- [2 f return 1.0/(1+math.exp(-i))
6 U, j' J5 U3 x1 \
3 l1 t7 O& q* k: ]print("训练开始")% W* T+ }+ a2 h; e
#学习周期结束前一直学习7 m/ X! l5 a* F; h
while lt<max_lt:
. N) y' K( R3 F% g- s2 N! o lt+=1
2 @3 v5 }1 s# W* |8 }$ P6 m #求h1和h2输入值2 q/ S7 T% h# B9 B" F J
hi1=linear(w1,w2,i1,i2,b1)
) X/ q7 b3 l- Y2 O9 Q# ]# R hi2=linear(w3,w4,i1,i2,b1)
P5 t; L$ l0 |' @; m9 a #求h1和h2输出值
+ C! Y, W+ A# W8 g ho1=none_linear(hi1)
- h8 y9 r% q3 c5 g0 o% q3 l ho2=none_linear(hi2)
* J) A& [% ?/ \; g% Y #求o1和o2输入值$ b6 x' ]* X. h$ H$ x! Z; i3 M; H
oi1=linear(w5,w6,ho1,ho2,b2)
& Z6 J- S" C r2 r/ l oi2=linear(w7,w8,ho1,ho2,b2)6 G0 W! h" E/ a8 g4 J) W$ M5 ^: {
#求o1和o2输出值
- Q5 f. g6 n7 X( L oo1=none_linear(oi1)
% [5 y1 A, S- ]* Z oo2=none_linear(oi2)
: q/ P& ?" [9 I7 y m' ]" R1 W
9 K5 m! Y1 y2 i: \ #求当前计算总误差 P/ g1 ^& }/ `0 L. w
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/26 o Z+ u3 w# z& \. n, P- b
print(f"第{lt}次训练,当前计算总误差={eo}")
9 d8 Y7 S/ b: | q #误差已经在允许范围,退出训练' E( x' J4 D1 X6 `9 f
if eo<eo_allow:6 q( {+ F" |4 \# ], z
print("误差已经在允许范围,训练结束\n")
* p' B% a N, f/ x break+ ^! K+ Y5 E4 K Y$ t: K
#偏导
/ r, H# |4 }0 h d_eo_oo1=oo1-o1
: r& B; z/ U; t; b1 i d_eo_oo2=oo2-o2
4 u/ F _4 v! _( v, {2 L4 u d_oo1_oi1=oo1*(1-oo1)2 b+ e6 I6 D, G3 O: |
d_oo2_oi2=oo2*(1-oo2)
* M* w; Q1 Q. y d_eo_oi1=d_eo_oo1*d_oo1_oi1 I* }5 ?8 c. b3 K" ~+ j
d_eo_oi2=d_eo_oo2*d_oo2_oi28 d, D: R- `' a& R. T
#求w5_new
" J! @2 g) f. H& P# S d_oi1_w5=ho1' w" G+ w. P- ^& |8 E
d_eo_w5=d_eo_oi1*d_oi1_w5
% f9 ^! {6 U4 z6 A& o5 t4 P w5_new=w5-lr*d_eo_w5
1 ^, [* [1 B6 S5 X& l8 i! N! z6 P; k #求w6_new6 l% g$ ?& O7 \9 t# {) A% W: y
d_oi1_w6=ho2. e. a# e8 V, v; a4 a) t- W
d_eo_w6=d_eo_oi1*d_oi1_w6/ B w _! T- j* h. ^- M+ A& `/ e4 K9 ~
w6_new=w6-lr*d_eo_w6
; F4 L; L* x- Z* u #求w7_new
2 l+ |, P% }* {0 G d_oi2_w7=ho1& Z$ o' |, ~5 X+ r7 B3 z
d_eo_w7=d_eo_oi2*d_oi2_w7( s d! Q6 W9 t5 E% `
w7_new=w7-lr*d_eo_w7
' m) J0 M8 e0 h7 K p% t- h #求w8_new T8 A' g1 ]0 Z6 r d, d G
d_oi2_w8=ho2! d e9 p0 E& K' o- F7 w( H1 `
d_eo_w8=d_eo_oi2*d_oi2_w8% }. i; P8 S# j0 y3 L) u
w8_new=w8-lr*d_eo_w8
- p3 c& I& g( U+ L3 ] #求b2_new8 T, p; A, E7 ` z4 K: X9 a
d_oi1_b2=1
3 x0 {9 G! {/ {) C+ m# m d_oi2_b2=1* v& @0 S, v7 S( H+ i' p6 M. ?
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
/ ]2 {% [" r1 a1 e8 v% o1 ~2 h- d, x b2_new=b2-lr*d_eo_b2 s0 k. `# I% F! {" `; @: @% g( @
d_oi1_ho1=w5
6 q8 i$ v) E1 v+ r( j d_oi1_ho2=w6
1 v* I0 {- Y* i" t d_oi2_ho1=w7; T p5 f" y' Z9 K, L; s
d_oi2_ho2=w87 X* W! z6 m1 z$ S9 q4 _
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho14 V6 K; L7 q" H+ j. X
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho25 x& z9 b. b9 j8 @* q: @! n; Q. ^
d_ho1_hi1=ho1*(1-ho1)
* i" a& h+ X) L# H+ {& e. c% i% k d_ho2_hi2=ho2*(1-ho2)
3 k9 i: D# n/ Z! u" S) K. J7 d2 ] d_eo_hi1=d_eo_ho1*d_ho1_hi1. L& L9 _+ w2 F F; h
d_eo_hi2=d_eo_ho2*d_ho2_hi2& H; ]) q& b0 {$ N' I Q4 k
#求w1_new5 P, f ^* g D! G4 z) L6 A5 Y# R
d_hi1_w1=i1
8 b+ l9 O9 s3 T$ e! F d_eo_w1=d_eo_hi1*d_hi1_w1$ r$ y% B6 k, {* e% _8 Z
w1_new=w1-lr*d_eo_w1! ]; Z8 f$ C+ }% M# W
#求w2_new4 \: ?! c1 |0 N+ T. K& P
d_hi1_w2=i28 |7 [- F6 Q9 b& _( Z! v
d_eo_w2=d_eo_hi1*d_hi1_w2 H, g3 B; H' @0 t, D( u( V
w2_new=w2-lr*d_eo_w2
( j) |! [3 ]! G #求w3_new2 S# q% e$ ~+ @1 w) q
d_hi2_w3=i14 }6 z# O9 j: v
d_eo_w3=d_eo_hi2*d_hi2_w3% [; t( @* L3 O- L% h
w3_new=w3-lr*d_eo_w3" @, i5 h, d3 _. M) I
#求w4_new; ~1 [2 T$ i1 V+ v" J
d_hi2_w4=i2* ]% s; c# X' V
d_eo_w4=d_eo_hi2*d_hi2_w4
" o; S) c7 x3 \3 [; m w4_new=w4-lr*d_eo_w4/ Y. w2 a3 J" b
#求b1_new3 Y/ W; H' K" e' |8 Z3 ~8 s
d_hi1_b1=1
$ m7 p0 Q$ N" u) Z6 l! Y3 r d_hi2_b1=1# \+ J' [& w3 h/ R" A
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
5 ~5 W4 o3 A, S) {0 I b1_new=b1-lr*d_eo_b1
- z2 n; r4 V" S( M# c, R, z4 D# V #更新反向传播
! {/ N! _0 U+ H2 j/ P2 E w1=w1_new
& P: R; A b8 Q" s7 K/ A w2=w2_new7 v/ l+ V4 `/ x1 P+ `/ k/ f: j
w3=w3_new
2 }/ F& o# M; C/ Y! a! x w4=w4_new9 E) [* }( a3 t J
b1=b1_new* ]) `* ~8 r( c7 [% p
w5=w5_new
; {, d* b: H8 Z5 c* R7 ^ w6=w6_new
M/ D5 q/ v6 z. v" W2 N: ^ w7=w7_new
0 G& ~$ ^0 E6 Q. n% H w8=w8_new( k, I; _2 \3 K& T9 ~: B' w
b2=b2_new- I& {( q- ^: D2 z9 `
print(f"当前计算总误差={eo}"): | R$ S6 R7 b
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
, H. I0 N" S6 }6 [ i9 Lprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! A1 p7 K# U5 L% [4 x% \
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")3 F' h6 Q; G4 W: N3 @
( [/ a8 i$ \% s6 A$ w
结果( C# l5 Y9 e3 `; _4 a
. m8 ~. g" S0 ~# w+ E0 g
) a8 f$ {- `1 K结语9 C- j! x$ a, r, @9 c( Z! Z
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 Z3 R$ N4 J* e, i( k. g
6 T% R, ^( J7 ~/ t9 n' W* X$ G( y8 n补充- ^8 Y7 I! P1 j" n( p* M
程序中d_{a}_{b}格式的变量表示a对b偏导
1 [) p+ `! ], m————————————————5 \. Z/ @0 `2 I( _2 u
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. n4 m _, v2 u原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
4 T: d9 B6 B! W/ c: R! Y8 T' l9 P$ t7 t- x$ m
- R5 ^' b6 |& N( s
|
zan
|