在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564671 点 威望 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实现)
c; A+ J3 r# Z; W7 p( N% x' E6 E 7 y3 @& P. y) G* h( ?5 B$ \
背景
+ ~, [8 H. G4 H/ o( D8 O, O9 a' j 初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
* P) A& A7 C, ? d1 S 0 r: W& f/ |& Y9 \6 G2 a
【神经网络分类算法原理详解】* O1 a8 }3 X* Y2 |* _% e
9 u; n n/ c3 n
注意
. P. C. O) ?' `4 W 站长提供的图片有点小问题,我们更正如下2 p! L) S2 s" B) Y1 J+ ]
" L& r: |7 E7 F % @( w j4 y( m
/ W/ ~+ z& ?) e 问题8 |( d0 i. `8 ~! b6 l Y: @. K3 W
根据上图所示,我们有已知
/ D2 W5 J9 o( K' O& a, K
3 l; E% n4 r4 e' m/ Q #输入层
e' S, _* O3 \! z. ^9 i+ g i1=0.05
. J' \/ k. b8 q4 ^' p) I" y3 | i2=0.1" V# s1 _$ [- i0 T# Q" `( L
4 g1 \$ v- @& ^( C6 h7 U1 A- _ #输出层
7 @7 j2 R7 D) N0 O$ J. `* `5 X o1=0.01
! _( D8 {$ o0 B: G1 [! z o2=0.99" z+ M- i; C% C- c( V8 y
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
' U4 M; n5 d" I6 t8 B% h
* G7 D4 I' y3 v 神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1* F! `" q; i' _
1 j6 o4 w0 Y, Q6 c- ? 神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
, m- O2 b* I8 y; G ) p( [2 V% Z- V: j
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出, ^5 X; I& q' W& D: f8 i: ?; j: ^
: }) h5 f3 B; N! d; V 神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))2 u" f1 T& l$ q8 l+ A6 O
) J5 U" A& o* u1 `8 ] 同理
4 Y x2 \& m5 ~" ~1 }0 K" U : t$ @9 A8 H" U% e2 m' u( r
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
6 Y6 U8 u2 x; B% c$ W7 A2 _7 S
5 H' _8 }, [8 R( X 接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式; W( d9 R2 d0 g: m) J) v1 Y
4 ^6 J- A( m F( T1 _ 神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
9 A" ]! M' B, `( q& T( w, G
/ i6 j/ \' h: v 神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
5 N* z2 c5 i. ~2 C: w' ]
. u' v+ q3 x# z% ~; n0 X2 ~ 再经过非线性变换Sigmoid函数得到
3 S7 ^7 l( y" h* } * l4 }! V3 O* F, e7 [3 E( M
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))8 _/ [) k$ b- G0 D! m) e
* \9 N! ~; i& U& V4 ]* m+ F3 ]
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
9 U q- Y- o6 Z7 F) O! F
% Z7 b) [8 M7 H# _ j 我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为. U% T0 m. U8 Y2 T8 `6 K" Z4 x
9 U Q& x; b6 L" a/ p$ M3 t
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/27 b, U- ]" L( |7 k% L& h6 q
% _3 R8 l U: l3 o) Q 由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足; g% b( F4 S- F# W9 L. x
* Y0 u5 e. |2 H
学习次数 (learning_time 简写为 lt)我们限定最大为10000次! b9 M7 x b- q- t D
& K2 e7 }6 K# V6 ?4 ? 学习率 (learning_rate 简写为 lr)我们设定为0.5& i7 c1 D' Z2 y4 \8 s* O
0 k9 U( P: u' q5 e" ~: q
依次求解代求参数
+ j* @% C x F$ K6 _0 u% |, \/ h2 X 8 x/ U# _8 U0 y7 z2 \5 c
w1~w8,以及b1,b2
$ ~. J- u0 {# p8 K0 B' N* p0 N2 t# S ; C1 G* o8 B' }( ~ r
跟
+ {* O# X6 N/ Q& m4 g# `2 z % W4 O4 ^9 c5 i6 G
损失值 (eo) 的偏导数
7 _$ g5 x4 o; O. m3 g
, {1 V$ r9 {4 d; Y4 Y- X 再更新该参数,更新公式为! Y! _- G% ?! N: n
5 j% k1 x* h7 J9 t( w) |! X5 g! G7 t
参数_new=参数-学习率*偏导(eo,参数); P/ i7 }; V$ p
随后进入下一轮学习; S& T# K/ [0 ?9 O. g
& k6 w" o/ D7 a6 Q0 a8 M. d
终止条件(满足其中一个即可停止训练)
% s& {, g2 t) L* d 7 d7 ?& O0 q2 x
1.学习次数达到上限
N0 \# I6 ^2 d# {5 e 3 I0 V- [ Y0 X, c0 V* m7 w: ?
2.损失值达到可容忍的范围
+ c; D( u# `# i' D! K 1 V* D( |' n: }& W
导数
9 A1 O- F( B% I# [9 X! q- O f(x)=1/(1+e^(-x))的导数是2 T+ r8 T- h9 X" j
f'(x)=f(x)*(1-f(x))
g7 B! c2 ~ C! g 源码2 i9 \8 G+ x/ z
import math
9 N' X8 s3 E& a6 Y5 _- P
3 G' ?! q* `2 s; s, \ C* K #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
0 F) {- p3 ?0 Q ^0 P3 K) ` #网址中图片有误,请看我博文上的图片5 t P$ T; g8 d; ?/ @: y4 \
, U" d0 c1 x/ V5 r; q' _: X4 D1 E( Y #输入层
% }: L; J8 Z6 S i1=0.05
3 T) A) @# g) n& A3 M7 T i2=0.1
0 \7 K; _5 n, E% n #权值参数( l6 _3 ]/ c: v# i
w1=0.15
% Z, [) Q( e- T6 B- c w2=0.27 h! h& B+ k# _( S& o9 Q
w3=0.25
2 T* A" B6 v3 S5 A/ d" ?: q w4=0.3
. ~0 b2 l) ~! f; E2 A& B w5=0.4
$ v* u: G2 o! F$ R$ j w6=0.451 G9 O: u$ Q6 Q! Y9 } q5 s3 R
w7=0.5/ g( F6 o" N4 _# c5 |
w8=0.552 g# {6 B, D! v8 l$ x/ ]0 M
#输出层标记(即期望值)! L+ s8 G8 m$ C' i- l) }- W3 S# U4 m
o1=0.017 p: U* P/ p1 n8 ]/ e
o2=0.99
7 H l7 E0 N/ ]4 l) p# N #偏置项参数7 v- a8 s3 S) |5 G; T- ~: x5 ?
b1=0.350 X: B. d0 O* h
b2=0.6
1 [1 x8 F* S8 c) v8 j! Z- Q
- l' I9 X, p3 V' q) j7 ^ #学习率: h7 u5 O. t. T& |7 {' W
lr=0.5
- g8 j1 h& ~. K- n: z #学习周期8 E T' m. K# s
lt=0' U0 x4 H+ c7 a% H$ J2 D) t( I0 ]
max_lt=100003 a2 n. ^ P5 o _7 v
#允许误差, n# ]( N- b$ e% ]$ C9 ~
eo_allow=1e-57 W( Q2 P1 B5 G$ A" Q, s9 w8 H
; B) h( o7 @. j6 }9 R0 z( ~& X- H #线性转换
4 h" p3 h4 g9 n def linear(w_one,w_two,i_one,i_two,b):3 [: A, A) `0 S& W4 y" J
return w_one*i_one+w_two*i_two+b- ]! I. ~- u& P9 F0 x0 r
#非线性转换: e- T @# z# D( O7 I# b) h |' h9 ], V
def none_linear(i):& o3 @- \. c: @# R
return 1.0/(1+math.exp(-i))
9 I5 l5 n6 N/ X# K# a! x . ]0 g% i5 ^% l
print("训练开始")) p0 }' b/ ?; v2 s; Q, U; x% f
#学习周期结束前一直学习
/ J$ w5 v* y; ^6 G6 y while lt<max_lt:# L/ z/ U) A+ g; t
lt+=1
/ i* d2 J6 v0 v& Y9 A4 g- M #求h1和h2输入值+ b0 K4 \+ K$ V
hi1=linear(w1,w2,i1,i2,b1)
& C+ h; |5 ]& u; p: S: r- F hi2=linear(w3,w4,i1,i2,b1)! ^7 l1 g' \7 M2 S
#求h1和h2输出值; p5 W" l6 b: Z3 l* X1 W
ho1=none_linear(hi1)2 X2 h, q# t2 Z/ H
ho2=none_linear(hi2)
; L% F* ]9 v2 D! }0 W #求o1和o2输入值
8 s L9 b) b' [; Y1 P8 l% i oi1=linear(w5,w6,ho1,ho2,b2)
9 a" S. ?- r* I0 _3 Q oi2=linear(w7,w8,ho1,ho2,b2)( ]$ h0 P' J0 k- f* N& I
#求o1和o2输出值
2 X! P) N9 W3 F e oo1=none_linear(oi1)
4 o# O% B6 \8 n; D$ [ oo2=none_linear(oi2), c9 R( W: P8 m) F7 V3 B; u
i h' C7 h2 F/ {. U, P9 c
#求当前计算总误差! K, S4 |4 S% ?4 M) C" V
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2- e! i; U4 P3 z+ n
print(f"第{lt}次训练,当前计算总误差={eo}")
& @: d7 V2 L4 n% t- Y9 ~ #误差已经在允许范围,退出训练
6 u. A; r' K! v, ?: @ if eo<eo_allow:
- e/ P1 s& a* K5 u print("误差已经在允许范围,训练结束\n")* S' R+ h8 z; V( g: f
break
6 Z6 g, ?* C, a0 }- E #偏导- j% c3 G! D8 m; S
d_eo_oo1=oo1-o1
$ r1 ?6 j" s [% C d_eo_oo2=oo2-o2
1 U; [1 [0 b; }- l2 a0 W d_oo1_oi1=oo1*(1-oo1)$ l3 w. P0 O# a' D% r4 i \, w
d_oo2_oi2=oo2*(1-oo2)+ g% E( G2 e1 q. o( q
d_eo_oi1=d_eo_oo1*d_oo1_oi16 v: G `; X3 V1 y4 @0 D
d_eo_oi2=d_eo_oo2*d_oo2_oi2
9 z% W) B% S, G4 }0 m2 v [ #求w5_new4 N3 d; H# R) \! z& V% D, m+ `
d_oi1_w5=ho1" h% k; ?8 P& `3 |
d_eo_w5=d_eo_oi1*d_oi1_w5
; i% k) n# r/ O w5_new=w5-lr*d_eo_w57 k- u, n( G6 }
#求w6_new
; f; [* s9 d/ |- I5 P* q3 Y d_oi1_w6=ho2
+ c) z$ n- ?$ d3 h7 M) V d_eo_w6=d_eo_oi1*d_oi1_w6
# D' m; w+ P% f. j w6_new=w6-lr*d_eo_w6; {+ C2 T6 e. E& ]7 G5 z
#求w7_new
3 T3 J6 R* y6 d% h* T& Z d_oi2_w7=ho1( O( S! F8 T) r) f) z1 e
d_eo_w7=d_eo_oi2*d_oi2_w7
6 J' d/ y h5 _; C P w7_new=w7-lr*d_eo_w7) Y# }2 H. W% W& l# S( f2 Y9 @
#求w8_new& C& b& u6 X* J* c
d_oi2_w8=ho2
& i2 V/ L: r% @% p- l, `# U1 y d_eo_w8=d_eo_oi2*d_oi2_w82 i, ]5 x5 f+ X; Q. f
w8_new=w8-lr*d_eo_w8# A' ^ W9 K9 V- t* `$ ?
#求b2_new
* \' D" `/ d9 X3 W ]# T6 n d_oi1_b2=1; C J# q( Z2 N0 Q: [) ^/ Y# O
d_oi2_b2=16 s9 @: s- }7 \, V0 g: Y7 p7 C
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
3 {& v7 e* v+ o9 B( V' R b2_new=b2-lr*d_eo_b2. Q7 V4 F9 @+ {8 |2 l& J
d_oi1_ho1=w59 [' g U( v0 ^% D
d_oi1_ho2=w6$ T- B8 k+ }* p8 u, N& ?
d_oi2_ho1=w70 s, S; d% S) W
d_oi2_ho2=w8! x8 {, T+ x, x3 k% H5 V$ z! h% T
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1& e6 B( p1 X) P- q( ]: `
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
( I* ~$ t M( M7 J d_ho1_hi1=ho1*(1-ho1)
* \) k2 Y6 U- U& o: ]# e* N d_ho2_hi2=ho2*(1-ho2): ~3 C2 B+ I$ Y+ `5 ~
d_eo_hi1=d_eo_ho1*d_ho1_hi1+ r2 v' f) W6 ?: K. ^/ S
d_eo_hi2=d_eo_ho2*d_ho2_hi2: [# o e+ h" F- [7 t" N( s) s7 L: ~: x# v
#求w1_new6 U/ z# V' Q3 ~
d_hi1_w1=i1
]$ |5 T( m5 t$ r d_eo_w1=d_eo_hi1*d_hi1_w1
6 f% b1 M, A6 k: c w1_new=w1-lr*d_eo_w1# @8 k9 N, o( r) U
#求w2_new
; v9 j7 {; B4 {" }2 S d_hi1_w2=i2/ N$ N; L/ F. y; b- ~+ g3 f
d_eo_w2=d_eo_hi1*d_hi1_w2
1 L, B" \4 b: ~: K8 s w2_new=w2-lr*d_eo_w2
6 h6 p* N7 q3 a) n, ?( E- s7 X #求w3_new
2 |- D0 o0 O1 V7 z/ w; { d_hi2_w3=i1, Z J V* c+ f7 C
d_eo_w3=d_eo_hi2*d_hi2_w3' s5 `+ s* N* ]# v7 P
w3_new=w3-lr*d_eo_w3
- ?+ \0 T9 @4 F0 [& q# i #求w4_new
0 m! R" g5 H. P6 f5 A8 o d_hi2_w4=i26 E7 }6 _! Y: M4 g* W
d_eo_w4=d_eo_hi2*d_hi2_w4! @: k! d9 d* X" j8 B" h. Z( ?6 [+ W
w4_new=w4-lr*d_eo_w4
+ r7 M# \* z1 V$ V) W" u/ z #求b1_new% m4 @+ K0 l- U( Y) S! i3 s
d_hi1_b1=1* B# u+ c" W/ O( V
d_hi2_b1=1( |, {, y/ _1 p/ X
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1+ R; h* O4 s" \% O; U- C
b1_new=b1-lr*d_eo_b13 [& e4 H7 ]' c1 ?3 N6 [+ G. l c
#更新反向传播2 q1 e8 C8 B" F6 |; {
w1=w1_new) l8 o$ r* ^0 q1 G7 ~! Z
w2=w2_new
! Y- I& o2 l. C9 g6 N' u( H w3=w3_new
0 i- \% f& k9 n' U9 [9 h w4=w4_new- M' G$ O* s) y; S5 X+ n0 u& k7 s
b1=b1_new
: \: \4 p5 A) N4 i w5=w5_new/ d! {9 F/ R# v$ O/ ~
w6=w6_new
" }1 T7 p1 \4 {9 N+ G' U w7=w7_new
7 n! |- k8 }9 L _% R w8=w8_new
! `" Y1 G2 m+ E b2=b2_new
z8 g2 R1 c7 e2 }+ e! c1 c0 X print(f"当前计算总误差={eo}")
) h5 q# k W' @7 n* L print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")3 x- O1 a W" [3 E) F1 c4 h0 [
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
& x8 B/ o; u' @3 \- b; N print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) q r/ M( |3 Z% h4 H+ G# N
) N! x1 r' ]( K s8 d
结果7 D1 |- S4 @$ z: {1 C C, [
: f! X- W& t$ ], r2 W
6 H: C5 b E5 m+ S; r/ j) Q
结语
# {0 A: I! w4 |7 F3 Y) p 可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
) V2 R! A" M9 ]: |1 @ - \# o. c+ o1 h1 ~( R3 s
补充; N0 l' p; l( N. b: O2 a2 k8 k
程序中d_{a}_{b}格式的变量表示a对b偏导& T/ Y* T! E" u
————————————————, m# a! E! {; O A* z1 j1 M
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% V7 v3 U& j9 q; q& g: E' k 原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954/ b% r1 |- j' K1 G+ j7 y& \
8 m, z3 R' m6 \; [ 7 W+ \+ {3 {- M D
zan