在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 569640 点 威望 12 点 阅读权限 255 积分 176115 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
人工神经网络——反向传播算法初体验(python实现) ) J2 F4 ~8 A) N$ T
8 O% E [; } i% v! |( Y8 Z8 A: u+ b
背景
$ j( ^# t- { c& K 初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下5 A& p; i1 ~$ x, ]. }
* U" j) d/ a" v4 q
【神经网络分类算法原理详解】
, ]$ h: J# z3 F" s/ I
$ b+ ]. l6 M: P' f. a; | 注意: j9 g3 Y; | b# M* @6 w
站长提供的图片有点小问题,我们更正如下
/ w: v& e. f4 o * b1 h, o2 H: F q- x/ G# o
/ Y. k9 s+ ]9 ~
: [( t& I) u- B8 }: t- ~: s
问题6 F/ N9 C3 l9 C7 z
根据上图所示,我们有已知( }8 q6 p u% F1 {" e
9 l! {) `# v; F1 M
#输入层% i: s- u7 q" r
i1=0.05; P# b1 j! M/ ?% R' w; n
i2=0.1
/ `/ T2 b. t7 n1 ? $ U v p3 G2 C
#输出层
( J3 a- d1 l$ _9 Q$ U E0 A o1=0.018 n4 [/ T z. G5 S6 K- `% I4 j
o2=0.99" N" B" m" u ]: n( Y2 C7 N
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
) g8 e$ G+ x+ G' M5 c ^
& d8 n$ ~7 t& V1 G( d; {# \# M& l 神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1 A$ { I( a" ~6 l+ D; y- v
9 a* h" k& W$ w# Q" t. a 神经元h2的输入 (hi2)=w3*i1+w4*i2+b1& K4 ?9 ?& S7 A+ O0 M2 P
2 c! F+ c1 M: Z, _
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出- T4 F6 B2 D: D! k
9 J- h6 m8 r A- h+ i 神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))( m+ w9 j$ O: M8 N3 f6 \; k- H
) u) k) X7 j ?' c d 同理
0 I" K6 h! T( Y4 j* w & l8 C0 K" p; @
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))+ H0 J% ^8 G" h3 W" t
; q& D q2 y2 V# w 接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式; b$ a, M. F+ o8 b5 g: z z
" v q; @+ j. M
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2$ p- h* u; \/ u2 ~/ A2 r w
& o4 f; P6 ?& O! A( ?5 F ^: S( r
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2# p0 {2 P. g# X: W
4 f: _* X/ C6 v# k( j/ ^ 再经过非线性变换Sigmoid函数得到
3 y& O+ f" B9 t; \* d% u" C: c 3 q# G s2 h8 o& M% k' P$ i
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))' j3 |- k2 P& V0 h
; P! W1 ?$ `( e1 k" X* O
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))* ?% |" ^8 x9 @4 @& Y
' _- @9 a6 }+ G2 _, t% N u+ |
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
7 F. @% H$ j% H9 z
5 B2 h* d# q$ y [ 损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
' h& m! d7 I9 ]7 g$ }2 w, p4 r. n/ \
' R* s. Z4 j5 V& a3 I3 f# ~2 {, A 由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足- h, r6 U, U# ?8 o- ^
. {" w( t1 T& q2 v$ a# m 学习次数 (learning_time 简写为 lt)我们限定最大为10000次: Z4 ]+ Z9 Z) P; ]7 n8 p8 I
" b, r$ K/ _0 A$ \' B% @ 学习率 (learning_rate 简写为 lr)我们设定为0.5* Y1 V2 M! m) L# X& g8 L$ f
9 k6 F7 K0 T& y8 B+ k( {. M% ` d 依次求解代求参数
& z- ?3 T3 p6 p/ {# V/ `
% N1 i, m1 W$ y' W+ U' a w1~w8,以及b1,b2
v) D8 |: D; A
+ M7 a: K6 l1 w 跟
) j" X4 D% Q$ h0 C0 J% G/ d% S3 Y! a
) N- Q7 w% _3 Y: t 损失值 (eo) 的偏导数
! q. E/ B' J; k0 m6 G/ V6 O0 u , n0 N) ?- I5 p9 {
再更新该参数,更新公式为3 R( R: h$ E, l3 @
) _; m0 H2 f4 t( B4 _8 P1 I$ g 参数_new=参数-学习率*偏导(eo,参数)
6 p' @2 C+ F$ e9 p% o- L6 l 随后进入下一轮学习1 \6 R$ M: {4 l; j
. m: e- |5 y. o4 N. x
终止条件(满足其中一个即可停止训练)9 Y+ q' m- V1 y
4 C7 ^: O) v1 Y
1.学习次数达到上限
$ k3 q# \; ]: I5 p- X , m& E* c2 h6 _9 v( J1 p
2.损失值达到可容忍的范围
9 Y# K4 x* {. R6 `( z( A: L7 @
. T+ f; B# v+ _, w/ ]; r _! D& g 导数5 e2 Z' x p8 c+ B) X) e& N" V
f(x)=1/(1+e^(-x))的导数是
' u7 P. k3 y. q& g" n f'(x)=f(x)*(1-f(x))( K. D' G$ x9 c5 ]
源码
# P; t8 k x r+ S5 S import math
, c6 O" B, a4 O1 v; r
& N) `5 `9 n! C$ Q #参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】9 N* v1 R( ~5 l, f, s; j0 r
#网址中图片有误,请看我博文上的图片
# s5 e! i% g) {5 O" S A, v0 d : r7 I3 J9 I/ _; A6 F V- W, H
#输入层3 R! u$ W/ X9 c" D& j
i1=0.05
1 ~/ e! T* Y' I1 g i2=0.1- J8 e3 N+ z, w+ l
#权值参数" V9 \6 A9 a8 l1 j8 n8 ]
w1=0.15( V4 V0 ^6 h G( I7 J0 }0 y
w2=0.2( R/ @: N: I0 L' F8 E. N- B
w3=0.25- @3 n- m6 t, E! Q' L& c/ n% w8 r4 b1 K
w4=0.35 C; a) _. [1 M; o
w5=0.4( F" |% Q9 K! S0 E& z1 T2 |1 t
w6=0.45
( B2 k, `! I+ r4 K, e" | w7=0.5- F, g4 M# e! |$ K# X2 n' R
w8=0.55
0 s m" I/ S& I6 U/ I #输出层标记(即期望值); M( L" P8 Z. q8 P( X# m/ L2 b
o1=0.01
) K2 t0 r6 v) o: d0 S& @; C2 {) h8 b. \ o2=0.99 p5 t8 c' I g
#偏置项参数
1 R5 j0 u3 E: u2 t7 t b1=0.35
0 Q* r+ }7 ^) K2 M4 f0 | Y. | b2=0.6; _- |5 v, O/ `9 P" J
: E3 C; P/ {& [; e #学习率$ i; v" ~, `% i/ n
lr=0.5
# ]: S1 j9 y/ ]" ?/ k5 |: [ #学习周期: S- Y; S$ Y( A( r0 j, q6 e; i' ]
lt=0) ^! t4 R8 X2 R6 F2 v ~) Z1 M
max_lt=10000
( I8 C z# \. h$ _% t #允许误差
: M+ e$ L! i* j7 k7 x T `3 ~ eo_allow=1e-5$ k" U- V! d& a8 |1 v0 Q- b' ]
" P& d: S c: Z# [5 i, z
#线性转换
2 _' J& b/ B$ G, d; ~; F def linear(w_one,w_two,i_one,i_two,b):
7 i4 k' V8 { f% { return w_one*i_one+w_two*i_two+b8 d" S& [& _* G1 ]
#非线性转换4 F4 @: @9 {" Y1 F4 Q7 l" G
def none_linear(i):7 `& \2 U7 Y% H4 Q6 l3 M" F3 z
return 1.0/(1+math.exp(-i))4 G9 V3 _" z' J6 Q& M" m& a9 I
0 G+ B! v0 E% A. H print("训练开始")
; R- ]' n7 J, ~% B* K8 G. F4 u" l #学习周期结束前一直学习* q( a" h, ^7 P" |3 ]
while lt<max_lt:
. O) ]1 Y& b% a& o4 G' K f* Q lt+=1- Z0 B. q& w. k/ u
#求h1和h2输入值
I9 g/ Q, g+ M* u, l. ]7 S+ { B hi1=linear(w1,w2,i1,i2,b1)
0 R% K' v4 F* g: k# i, W; A6 u hi2=linear(w3,w4,i1,i2,b1)
3 R' j |0 G# e/ i) {: h( o- V #求h1和h2输出值
! Y) Z! Z; o& E0 B7 _9 W0 D1 R( S ho1=none_linear(hi1)
' j+ ]) Z2 u- C8 ]* x7 M ho2=none_linear(hi2)
. x0 [, v* b* r4 m #求o1和o2输入值
$ q& Q8 \+ T. _2 l D" `0 a oi1=linear(w5,w6,ho1,ho2,b2)
; J2 J5 q0 ]% c1 a- |& B oi2=linear(w7,w8,ho1,ho2,b2)
: `( n# i6 @3 ~ #求o1和o2输出值8 w/ d0 w" J% _6 Z/ e$ W
oo1=none_linear(oi1)9 Y" h& [; @3 [7 X
oo2=none_linear(oi2)
3 W5 t( m" F; s3 ^ & B, b. B/ b" Z9 `4 A4 J
#求当前计算总误差% d0 h5 H0 G* W6 z( G
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
. @/ D5 { a1 Z2 R1 D X print(f"第{lt}次训练,当前计算总误差={eo}")
. @8 j( K3 {- T( l6 N. L, h+ y #误差已经在允许范围,退出训练
) k7 o' L4 t2 e; w if eo<eo_allow:) f6 x+ O( ?6 m, N, e
print("误差已经在允许范围,训练结束\n")
2 \! L; |0 E6 G break
& a+ d {# B1 I2 R1 w #偏导
x6 }* b: R% @+ i d_eo_oo1=oo1-o1
+ @5 p) m. c3 O4 [; E$ a! A5 a d_eo_oo2=oo2-o2. z& Q V1 x0 v- a2 [
d_oo1_oi1=oo1*(1-oo1). p! I- e& z- k( V( K( g
d_oo2_oi2=oo2*(1-oo2)$ D3 j" S' B0 y* C1 Z6 O3 b
d_eo_oi1=d_eo_oo1*d_oo1_oi1
8 ]$ W, @ w8 Q3 O d_eo_oi2=d_eo_oo2*d_oo2_oi2
$ K/ D# K, S" ~6 e/ K+ [ #求w5_new/ l; {0 }6 n+ L s
d_oi1_w5=ho1
- o& J: i/ r' ]* o d_eo_w5=d_eo_oi1*d_oi1_w5- L& f8 G8 @/ e% s$ h4 x, R" ^
w5_new=w5-lr*d_eo_w5
) }9 h4 k1 r& {6 o' q #求w6_new
& C2 }$ V# W5 z$ d d_oi1_w6=ho20 Y1 L+ t2 l: H. G6 E! e! E9 \
d_eo_w6=d_eo_oi1*d_oi1_w6
8 Y: X1 B' ^# d' P. P, c8 ?' V w6_new=w6-lr*d_eo_w6
) ^* ~8 t* o" P0 W, Q9 [( s, a5 N( \ #求w7_new
+ M& e9 [- P, @* h5 p% U: w d_oi2_w7=ho1
! g- y3 W' A: t1 U. j d_eo_w7=d_eo_oi2*d_oi2_w75 x% I$ _& |6 J- s1 S
w7_new=w7-lr*d_eo_w7
2 A( C* J# M N6 g0 N1 ]: S( \7 p #求w8_new
z4 @; q4 [% n( D5 f8 A5 X& c+ U d_oi2_w8=ho2- E* @% j; g% O7 y: p( V
d_eo_w8=d_eo_oi2*d_oi2_w87 i, z7 p# a- J) `6 }: h' M
w8_new=w8-lr*d_eo_w8$ \5 {( b* u& Z0 E
#求b2_new
6 G, P- m4 G2 D) r3 [ d_oi1_b2=1
- i& Z8 @( ^3 b1 { d_oi2_b2=1
* F: S7 i/ ]# Y8 h b3 Z d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b23 y; T# @( A/ V3 u% d9 B
b2_new=b2-lr*d_eo_b2
1 h9 z `9 j* d5 [) I. _7 u6 _ d_oi1_ho1=w5# n5 q7 E6 W3 D4 n. Q/ [
d_oi1_ho2=w69 Z4 o1 _1 j$ r
d_oi2_ho1=w73 e3 ?# J1 }! _8 y2 q
d_oi2_ho2=w81 {' l, R0 D" N3 l4 k x
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
8 j6 _( ?3 b4 O$ L d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
1 ~4 f/ J: K- \+ ]: D( N, a d_ho1_hi1=ho1*(1-ho1)
1 C/ ^* s* F3 s+ z0 I d_ho2_hi2=ho2*(1-ho2)+ `: G3 K5 n' o9 C) F
d_eo_hi1=d_eo_ho1*d_ho1_hi11 ~* \% y& D+ a6 ]0 S
d_eo_hi2=d_eo_ho2*d_ho2_hi2
& |# v4 L! j+ }/ l6 u #求w1_new7 B! c0 @( k& R/ T* t9 f2 d+ `$ A
d_hi1_w1=i1+ B+ I+ F9 O, |2 ?( O1 e' F* |! n
d_eo_w1=d_eo_hi1*d_hi1_w1
' T- n1 V/ W, b/ p% n' r1 Z w1_new=w1-lr*d_eo_w1( q( z: M$ l, B: P! k
#求w2_new
0 h1 @! l5 Z+ w, y' o- p. L1 V d_hi1_w2=i2
( I5 c# ?1 Z4 `. K2 Q* s. X# `0 T. i d_eo_w2=d_eo_hi1*d_hi1_w2
" I; b7 J9 o% U% J l w2_new=w2-lr*d_eo_w22 M3 Q2 J' U6 S2 \2 ]
#求w3_new9 T/ D7 x) h6 B g4 W% A) ?; ~
d_hi2_w3=i1
. k( q/ ^+ {- ~$ \. b' @ d_eo_w3=d_eo_hi2*d_hi2_w3
3 b, V' m0 X5 Q" T6 T, b+ C# C& u w3_new=w3-lr*d_eo_w3
2 P3 T5 R; ]% S. v8 r1 ] #求w4_new. [, P+ a; W- D0 n" q
d_hi2_w4=i2* Y: e( U6 m2 ?5 `4 {
d_eo_w4=d_eo_hi2*d_hi2_w4
' [# w, u& K/ a4 ^) h; l: y n/ p w4_new=w4-lr*d_eo_w4
+ Y% J9 M/ Z* n8 y- {: c0 S #求b1_new7 t0 ^8 V- C+ c1 L3 D9 u: L$ g
d_hi1_b1=1( ]9 |1 S' q! u1 j; X0 j' L
d_hi2_b1=1
1 G* q, U w5 s* [ d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
% W$ Z% z! @# P( r b1_new=b1-lr*d_eo_b1
2 o: `4 b' ?8 W$ s6 O6 d #更新反向传播
% N( p, Z& Z" E2 B4 F: _5 Y w1=w1_new
1 w- a, e% l. ^ w2=w2_new( L k* }5 K, R
w3=w3_new# Q( W9 x. B: I7 B
w4=w4_new
0 D7 s/ U4 z7 T7 f! n b1=b1_new
" x) @/ Z1 q) _1 p. Y7 g4 p w5=w5_new& S" D! @$ L2 }# K- \! o: v
w6=w6_new \6 B1 w: H3 w5 A. a) @
w7=w7_new7 B' s3 o: l( \+ P& E# p0 G
w8=w8_new U" U$ K" s+ p* X1 V9 \/ j' q8 `
b2=b2_new
7 ~ s) h0 |% `- {6 _2 C, r6 [ print(f"当前计算总误差={eo}")/ f. d/ O L# U9 {, f" T4 s
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")* o3 E d2 `( L. Y
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
% ?0 f* L5 s5 A: C1 h print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")9 Z& S5 y- e" n
0 x$ Y6 v$ _+ o; [) Z/ N 结果
0 w8 E; h) }5 F' S6 M8 ~ a4 S# Z0 P5 Z/ ]
8 e9 q2 c& ^: g 结语 o$ ]3 K7 a& M, q
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。; n& z% q; v. P c6 y
8 M0 }) H$ \2 }! M6 ]/ S 补充) |. l4 _( F% i) S4 o, Z! Z: o" E/ J
程序中d_{a}_{b}格式的变量表示a对b偏导0 p: z% O; Z6 b* M' `
————————————————" r9 n8 j; ~. x4 F# }: P" m# \7 Y7 L! ?
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 F; c, H$ K. o9 ]+ j+ \5 [+ y 原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679548 q/ d& J# E+ g" e8 ?( ^" I" y
, c3 B; n0 G, Q& N# b9 ` E 0 I% P$ S7 O7 f. }2 k; w) b5 t
zan