- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 541352 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 167784
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5324
- 主题
- 5250
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现) N* b6 m! U: M
. `. W$ g2 r" g) z; D背景8 [+ @1 S) X1 d8 G. [5 B
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
& H6 W$ u5 i8 e$ H6 q
: l- H0 i+ X$ s& Z. S& U! f【神经网络分类算法原理详解】7 W( I# i; x5 a3 |
3 A* J3 F9 i Q3 p0 L注意9 O1 S" N/ N# V5 ?
站长提供的图片有点小问题,我们更正如下: ^+ i- H$ z c, ~6 D! H% K+ X% V
- S: Q2 N% m% _ J2 P% y+ ?9 k0 W' h& q- s/ I2 V& y
$ _$ E1 X8 j: {' P8 _问题
" i. e ]/ g( O7 I3 H7 h根据上图所示,我们有已知. Y" u) k5 t4 h7 r+ \: Q; G
4 d7 w) Z! I% U9 g4 G#输入层
4 d9 j9 k3 f* J9 D* m Ni1=0.05
/ d% q; ?9 f- N! E* `% L3 }; l% `$ ri2=0.1
# i. h- t! ]% L {
' O. K Z* D+ a! t5 w: M#输出层
% K* a9 N0 z8 `' c7 i* K9 [o1=0.01
# B2 O( R& D' C* no2=0.99
- e" @8 l$ H* n. m这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
3 [. Y. O: k5 t; Y) ?
- Z6 _ W1 r: q, h( Y9 O- v- S" [神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1% A4 q/ h$ O% H, p
% r. E1 P) }5 ^/ ]+ j `8 G% w
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
% O- P# b6 h8 q+ ] z. T; Y. u& G: T# ^6 N1 E
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出& K+ R" u4 `/ q8 @! _$ N
' h6 V0 J9 `/ b* |
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))4 _4 B! P7 j$ b- G" a
" C7 m" K1 A( k; U9 r+ i8 F+ @& U' N同理
" Z/ O+ a: y% V1 G8 W; t4 E8 J# f: X/ H8 m/ N/ ~6 k. ?+ F5 j
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))- f9 T( W7 p3 S5 D
5 b/ x# x T1 V3 m& w接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式$ G+ Q) Q2 _9 P: O$ _; I! M
W6 C: b, h8 h3 S5 b. m( @神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
6 e$ i3 Q" }8 |7 R1 k: ~4 S% b4 U4 l9 d1 \ X: T# q
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" n2 ?0 |. Z6 G9 I ~5 l
# s" u! Q& Q8 i7 }: F; V- n再经过非线性变换Sigmoid函数得到+ V% w' H$ l4 S
+ P% t- R1 v |& y* `
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))! h9 U8 A# l4 G8 ?" p+ S: [6 D* M# M
- R8 J' U# x n5 \" d- f! V
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))/ v. O+ X; _7 B4 l: h
2 |# A, r! |2 O' _$ n我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
+ A1 o* H4 s# U7 A0 f% r" U* r
, F6 P% g4 d1 K) H! V损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
( l: B; c& w$ b n$ M# M* m) ]7 |. V! G
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足$ y2 { Q! v1 ~- J/ ?: O8 Z/ T0 N
$ \$ D/ V4 i& s; q0 i
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
2 u+ r# ^' h3 [( ?# `. U0 e: E4 K* U$ r/ |" ^# [
学习率 (learning_rate 简写为 lr)我们设定为0.5, x0 h& J" L5 L
; I# P% u" f* u8 E! E4 }. ^2 Z% Y
依次求解代求参数 _% `2 n- s B! B- m
$ k% D! y7 ~) x3 }. ww1~w8,以及b1,b22 U7 c _4 ?' t( S
6 k, F% h" [- a( n* ^跟
4 D6 F$ C, o" t( d4 r1 E, M) |5 z! }' D) `# L
损失值 (eo) 的偏导数% N# g1 m' ^: x; H
- C5 g9 B2 D9 o6 @5 }
再更新该参数,更新公式为% |" W* g/ s4 I) b' p* c
, g# a) j0 B! \3 K参数_new=参数-学习率*偏导(eo,参数)
5 @% z" m( C0 u! ]/ O5 `) N4 q, ^: E随后进入下一轮学习
5 e0 t' e3 A, p, v2 g
: Z: W+ O. G- u" g% K7 b0 F终止条件(满足其中一个即可停止训练)% P9 L1 @) z- S0 J" U
5 V0 v& e& a6 O; g2 D' D
1.学习次数达到上限
; i Y$ Y1 ^7 K0 v6 x3 j/ S
: J4 b6 X( A9 u, j2 s. a9 R2.损失值达到可容忍的范围3 R0 z' T6 \' P
, K" h6 I( n! G0 x导数5 j5 o4 Y8 ]; h6 A+ u
f(x)=1/(1+e^(-x))的导数是2 A: Y1 }. v- |1 l" S: O
f'(x)=f(x)*(1-f(x)); j8 x+ m# i/ C7 ?# h
源码$ f: n6 h" q8 [/ n8 i3 N* I# r
import math9 V9 C0 ]( {4 d8 o
9 v1 b8 ~- `' s
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】3 O& D6 L# L- d8 V" l, t4 y
#网址中图片有误,请看我博文上的图片0 P" m f- r! A3 F. ^4 u: C& {
1 Y9 e$ S" G! T& C2 ?
#输入层
1 { B0 j1 ?9 Y- j" x8 ai1=0.05* Y2 q2 [& i6 g A& a
i2=0.12 `: S: f; \' G# J0 `
#权值参数- k% f |5 Q: g% a( {7 v& C
w1=0.15
, ?: K6 b( S$ O1 h3 k# N2 u5 v. b% A3 tw2=0.2+ z1 Z- j2 O E% y2 L7 I: N5 k
w3=0.251 x; Z; ?+ e! d, q4 I8 V
w4=0.3/ T9 k4 j) E* @5 x9 K1 J# h& Z
w5=0.4
- ?6 O0 X: L0 {* pw6=0.45
. d, ~# X. K9 D {. Vw7=0.5+ ]% C! f& g4 Q8 g/ n
w8=0.55
: |" J' s6 Q1 C7 k! a8 K#输出层标记(即期望值)
2 ~0 k" O+ g0 q( c' n/ |3 N: |o1=0.01* F* |* e" `" n9 l( R' b3 D, O
o2=0.990 n! R- H& a* }5 D2 Z6 A- d; ^7 q
#偏置项参数: C% d C; F/ s8 B2 n
b1=0.35
( @* L( p/ k; I$ O6 ]b2=0.6
# l* T s) ~( y1 J$ O. u3 S0 Q6 x5 F) l
#学习率
! J- ?7 [% b3 R5 x. y2 Tlr=0.5! V+ X+ M& _2 a8 y3 t6 Z' G3 U
#学习周期
- |/ H% {& l7 c2 m# X" Olt=06 o" i0 S: B6 D
max_lt=10000# n) S5 ^' D! M4 z% l
#允许误差
4 H- V* l! u% J; t; Ueo_allow=1e-5" Y7 o# N5 {* Z, a; G
! [& r$ W$ n. r3 [4 m#线性转换0 L9 T/ B8 N" y5 M4 v1 d1 v& D4 h, i
def linear(w_one,w_two,i_one,i_two,b):$ h: X2 j4 h) x9 v0 i* _" e
return w_one*i_one+w_two*i_two+b) o) {5 V- J; Q8 F
#非线性转换
$ k0 W; K% w; o- T$ vdef none_linear(i):
# p6 p, V R3 E+ A: K' e/ N0 s( E4 L return 1.0/(1+math.exp(-i)) o$ A' f% e. W7 d
' D8 _* O0 I& f3 c" ~2 k! I$ K1 G
print("训练开始")3 r& }! ]+ n& a4 ^. N* x2 Y
#学习周期结束前一直学习
2 z0 b: p6 Q* S5 v8 v; Q5 H: Swhile lt<max_lt:
) |9 a( T2 X3 B9 \ lt+=1
5 I4 \ X8 L7 Z* t; \6 h #求h1和h2输入值1 E$ S; D- \& W/ C" Y3 F
hi1=linear(w1,w2,i1,i2,b1): L9 i; a+ N. g
hi2=linear(w3,w4,i1,i2,b1)0 w3 ~3 r8 s/ [$ e! D& e+ U1 ]
#求h1和h2输出值( l: c& y, G% a& G% A+ E
ho1=none_linear(hi1)1 I1 Z1 b" w8 M/ v( y
ho2=none_linear(hi2)
' [. n1 @( U/ f) z #求o1和o2输入值
$ z4 B {% I' ^9 J g& X9 ?' T( `, c oi1=linear(w5,w6,ho1,ho2,b2)1 }3 b& c5 J8 P% F7 V
oi2=linear(w7,w8,ho1,ho2,b2)
5 d( j0 X) [1 y8 {2 E) L% K' ? #求o1和o2输出值1 _' ?$ s1 q, i5 N! w J8 R, b" {
oo1=none_linear(oi1)
7 P5 b- S1 v% e" n) }8 ^) m oo2=none_linear(oi2): D6 T* Z c( ?# ~0 d
9 S k" F4 N( l #求当前计算总误差, I2 b* _( T5 ~: X+ q5 m: A+ X* g
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2& O- L* o1 R! I' o. M( K- \/ z4 b
print(f"第{lt}次训练,当前计算总误差={eo}")
2 ~- w# z1 u. `% V6 e #误差已经在允许范围,退出训练
% n- e1 C% m) [3 m& o* U& z if eo<eo_allow:9 v2 T' c7 b" t7 t4 ] u
print("误差已经在允许范围,训练结束\n"): [) f# P: s) [; v. X& j
break
. W I) T$ J/ E. R% x, c0 x' M #偏导
6 m6 h5 l# j1 b+ W5 }5 ]' E8 _ d_eo_oo1=oo1-o1
; Z- d# }) K: d) J7 b4 N d_eo_oo2=oo2-o2
0 C3 v0 o. m0 B/ _; R; I" Q d_oo1_oi1=oo1*(1-oo1)
' G! V2 N; U+ o8 k d_oo2_oi2=oo2*(1-oo2)
" E9 E; l L% q q" r7 w, L$ s5 y d_eo_oi1=d_eo_oo1*d_oo1_oi1
* h$ |$ _( w, I/ C d_eo_oi2=d_eo_oo2*d_oo2_oi2
# m# j6 B$ ~$ b5 t9 f0 G! Z #求w5_new/ D8 X: C1 c+ m
d_oi1_w5=ho16 r0 r! f# w8 k( K9 \. m% g
d_eo_w5=d_eo_oi1*d_oi1_w5
* M4 k: b/ T; M0 _- L0 D w5_new=w5-lr*d_eo_w52 Q0 X0 J d4 f) W) m4 N
#求w6_new- M2 ~$ N. c, C# }' {8 V
d_oi1_w6=ho2# ^3 t( e2 Y+ {- E) _: J5 }
d_eo_w6=d_eo_oi1*d_oi1_w67 s6 Z5 M) h# k1 F9 n5 ^" {
w6_new=w6-lr*d_eo_w66 H6 b7 k# v8 R' E3 E: N
#求w7_new
6 A2 M( _5 c2 F d_oi2_w7=ho14 Z9 @1 {# a* e4 ^5 \4 T9 S* C2 N6 O
d_eo_w7=d_eo_oi2*d_oi2_w74 J0 k$ C- C9 D
w7_new=w7-lr*d_eo_w70 q5 ^& i3 f4 K+ o
#求w8_new
( K1 O- F) P! b- d! v6 | d_oi2_w8=ho23 N1 A. ?9 m0 a/ j1 ~; ]3 |
d_eo_w8=d_eo_oi2*d_oi2_w8* H5 z$ n2 N6 g K
w8_new=w8-lr*d_eo_w85 X0 x+ @9 H, ~8 m- R- Y( L. F8 F
#求b2_new
# U0 c# a1 ] J- s0 \ d_oi1_b2=1
. s5 v: e; ^) ?) p9 ^ d_oi2_b2=1 }# P! g5 ]1 M* \" B5 u( X
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
) B) E7 Q: R5 M0 U2 x8 p. G8 c4 b b2_new=b2-lr*d_eo_b26 Q2 S! t% x0 Q+ C# e P
d_oi1_ho1=w5
1 \( Q( s- u+ b. t$ d1 v$ |0 Q d_oi1_ho2=w6
1 R' S; l& t- @9 c& u( V% D d_oi2_ho1=w77 N0 A% s" R$ `5 `2 S
d_oi2_ho2=w8. m9 E1 Y, j0 {
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1% i4 j, c' z; z7 C7 ^' b
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho22 X3 Y! a: Y/ ]4 ?* ]1 U$ p
d_ho1_hi1=ho1*(1-ho1)
% ~$ @/ `+ l0 B. c$ c( G O/ ~( W d_ho2_hi2=ho2*(1-ho2)
7 T# D. p2 d+ {! H6 u$ P d_eo_hi1=d_eo_ho1*d_ho1_hi14 W* w2 m. p, o4 p1 A( b4 t
d_eo_hi2=d_eo_ho2*d_ho2_hi2
& t0 h9 k' V0 `- H1 W, ^ #求w1_new9 y' B8 S7 ^# U: r5 B
d_hi1_w1=i1
0 C) u+ G2 I8 R d_eo_w1=d_eo_hi1*d_hi1_w12 n2 ~5 v4 k: J( g
w1_new=w1-lr*d_eo_w1
+ K( e! j7 ]( |- \ #求w2_new
( Z# @) p2 P6 a2 U$ `: S d_hi1_w2=i2' j+ l* Q8 \' `0 w0 R7 @
d_eo_w2=d_eo_hi1*d_hi1_w2
" ^3 @0 e$ K& P# E" P1 D w2_new=w2-lr*d_eo_w2
1 j H9 f9 F8 `! ~& V, a- i. W( \4 Y #求w3_new% i- ]4 L, G! U9 W3 U; i: e
d_hi2_w3=i1
' @1 {2 [" G4 t; K$ G; b8 p m( [8 v d_eo_w3=d_eo_hi2*d_hi2_w3
1 i3 B/ f' M$ o w3_new=w3-lr*d_eo_w3
! |; ^# v3 y* W- t9 M% Z9 t7 Y+ | #求w4_new
9 n' u. T; x: n4 `. K5 C d_hi2_w4=i2
% b$ H$ X0 ?0 U. [4 c, b1 @ d_eo_w4=d_eo_hi2*d_hi2_w4
4 O" ]0 M! d0 [ w4_new=w4-lr*d_eo_w4% Y: W1 }# q4 o1 o* b
#求b1_new
0 L# r0 E, K- \- C* ] d_hi1_b1=1
. [# |+ r/ r; t' s4 Y2 c" a d_hi2_b1=1
2 z7 b& c& Y+ H' a x( r d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b19 f. C+ F, @2 c9 m
b1_new=b1-lr*d_eo_b1
1 s8 g: B0 R0 r0 F #更新反向传播& X& L" `9 W5 y% V; e9 u
w1=w1_new p- ~$ w0 V; g9 m d5 r4 \' T
w2=w2_new: L1 W1 q3 h8 [1 l9 _+ `* F! R# a
w3=w3_new
" i; D# |, B |# x: v4 ` w4=w4_new; ]- }) O9 N; u- v
b1=b1_new7 T( m3 F% M( E( ~
w5=w5_new
7 `6 ]: p7 T/ h% V! h8 } w6=w6_new
0 ^9 y s! P& `- @6 O1 c# j5 J4 S w7=w7_new
9 A8 Z2 {8 } g; O5 p. K* N: r w8=w8_new& l- H4 ]3 v. X% ?
b2=b2_new
5 h/ e" {6 X( J. J: ~4 [" `: @print(f"当前计算总误差={eo}")$ }& C& o5 j% Z, G, \+ a: S$ q
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
) w! J7 Y7 B0 W! o& }2 [print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n"), b" ~2 x/ i& [0 T" r( G) a
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
6 X( S4 V0 p4 V, @: F% |# u( F
4 |8 j% o2 r/ |- T结果
2 F' ^: Y# ~5 R I, D( \
# P; Z. w0 ^# Q6 m& R
: E9 n6 g$ m+ i2 n+ ]结语
# z0 w* \" }$ `$ s: Q可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
3 U& P. Y+ }2 m) `1 O# X% I/ {9 c9 b
补充8 s+ y( H$ J4 @3 k! W
程序中d_{a}_{b}格式的变量表示a对b偏导
. b" |- t& z% m0 p$ T# h$ A3 n————————————————* a% O: B, \7 }6 M) p
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 H$ g/ B. ?, @. M* d w3 _. g* B原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
, H/ K4 q0 X8 ]
& C# F7 \& t+ m1 U4 ` B: o7 L
; p7 ~* I6 k2 o |
zan
|