- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174907
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
* i5 l7 V6 z$ q0 h8 @& ~: W3 g- N; u
背景3 n4 k8 N; Q# b
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下: n8 `$ z- N9 @4 G
$ |( T# N8 V X& ^: y0 W【神经网络分类算法原理详解】
- p* E$ u+ A! x( Q5 P1 s/ ~/ A
( ^7 p( }" { s# J1 d注意
: t" W |8 `: m1 N% ?, R: b站长提供的图片有点小问题,我们更正如下$ g$ y: b0 v) n' ~. G' P+ }( @6 {- M
6 G$ x3 c. }" G) V* H
% U. k5 N, Y1 R+ R
2 `1 q" i# r, g) G问题
0 M" ]5 u+ }/ m4 {% L根据上图所示,我们有已知
" L/ i* V4 h% b9 W# O2 {0 J$ S0 U# V: N3 R% y$ S0 {
#输入层
- J& M4 C( s/ { ^/ Qi1=0.05! m3 @7 S; E3 R0 N
i2=0.1
# f% S) G R! }. p, x& I9 S( E0 @+ L2 E1 R2 u
#输出层
7 n1 E! M" f2 V% |+ b- p& @! d4 Wo1=0.01% p. C& G; X9 J0 ]8 [9 G! z# \
o2=0.99
; m* I& @' v2 `0 y" }这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
8 k; m) E. ]. k, b* n. x0 @ {7 `; R$ \* g! n* }2 D
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
3 _; B; O# l+ B, ~+ q, Y b) a' ?7 Q# X( ~' D0 N9 w
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
' \. a/ }; T) b, Q
# G9 Y' K. o3 o8 q% p神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出/ c& n& |- {6 i6 u# {! N: h: \1 ~* ~
3 A) x! R" q# e1 z+ u G神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)); m- U/ s7 s- o/ l9 V/ G T
5 u8 O3 X6 }; P7 e4 p5 g同理% V, h' z, E1 {0 v1 _ h- F; A; H
$ W) o( p5 y A4 N神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
: o1 c& e$ V* ]2 v# \; ]# y1 Q+ E- U
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式8 W& ~" u6 f( |* M3 M5 ?1 L/ w. N
" U q6 b. \$ L8 B& H1 u- c; K
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
1 d. O7 z! `- V5 U* |! Q8 D; S
7 v/ v+ { k s* j9 t! I0 C神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
3 T: }+ T1 d: N; Y0 ^1 B; ]) q
; A1 M( y4 n. ]再经过非线性变换Sigmoid函数得到/ X4 @% \! } G5 u: U: e" q0 u( A
* q8 a% P2 J% ?* @1 ~0 |4 Y神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1)), S0 U9 {! J) q; u. M8 U+ W
" n4 E b. v j! S3 F8 M神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))! ^( u' @/ F: H8 D& g# z
7 D% V* U; H2 t! E: F3 \' @( Y4 j7 {
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为4 q+ s. K+ i6 D+ T. L7 N- c3 ?
) z) S' r. x/ W) R1 _" n损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/27 x( o( W& S. [' I
/ J" p4 p) z: \
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
7 O% Z$ s% J }/ W! v7 f3 C ~6 n0 p& g2 r9 f
学习次数 (learning_time 简写为 lt)我们限定最大为10000次$ \) b: D4 n% {8 C
$ {! ? t# {2 D# G学习率 (learning_rate 简写为 lr)我们设定为0.5- c" P4 O0 v8 s
0 |0 |( F0 l2 j' r- d依次求解代求参数$ M0 U; q8 t$ P
8 k' F; [& J2 J0 P" w* \% ?! i
w1~w8,以及b1,b2
& p$ U1 H6 `# z: i, A: v
" L) N" q7 m0 W9 F1 {跟% m* y+ p/ N7 Z8 m* N
8 L1 v+ V0 P. @7 A5 \
损失值 (eo) 的偏导数* c% z- D& a I2 B
. H/ }: m8 g5 C( x
再更新该参数,更新公式为! Y" b/ v/ M# S/ c' p5 o0 |5 @
9 D l( H, a: O1 P/ [- ^
参数_new=参数-学习率*偏导(eo,参数)9 j5 A$ J6 V6 t4 }
随后进入下一轮学习: [' V; v- y" A) h" q
, }! m2 E) o4 y7 J& h/ |! _7 I8 d |
终止条件(满足其中一个即可停止训练)! L( H% t! I# l$ r( X3 s; `: n9 S
+ y4 c2 Q" n0 `0 q, t- O
1.学习次数达到上限. ^% {. y: M6 l2 z, m# j% c2 j
+ d* p! e0 ]+ k7 O" F7 I: Q2.损失值达到可容忍的范围, U6 ] j/ n8 V/ g/ N8 P" x# J
. Z9 U9 f9 a, l导数
1 @2 Z; o& L/ A6 P. Kf(x)=1/(1+e^(-x))的导数是* B: l5 Y' k% W
f'(x)=f(x)*(1-f(x))& Q0 d. r, ^5 x, X7 L+ q: f, H/ ^; J
源码
. _8 H9 G9 K# U( |4 G( n* O$ x* ]import math& v! O* t$ d1 O+ [
( D/ t" u; V9 N/ Y#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】9 ]& T3 P' n4 G8 }: |1 r; w
#网址中图片有误,请看我博文上的图片
# I' I! c# Q) K! z! @% k- h1 {" V# Y# p0 g% r( ~
#输入层
7 R& L9 Z# S- S7 v6 C1 j" ni1=0.05
0 ]; @: a$ ~) F& _i2=0.1
$ O. x3 f. ~3 ]# f; ~#权值参数
( i" v" t7 b5 i; gw1=0.15
3 X5 v8 l) V h5 z, m$ o/ jw2=0.2
5 U6 a4 @) h, x, b Fw3=0.25 z0 j8 x. }( t4 d/ y, ?( Y9 \. k
w4=0.3
3 [5 l& _7 @" w. ?0 Q4 C" U9 C; p$ D: n/ sw5=0.4+ r- k0 Q* F* O* K% l
w6=0.45
5 b) M, a# }) ww7=0.5
9 f* b2 ^3 D w: F) fw8=0.55: B- N5 |% w" f) g! ^- d0 S
#输出层标记(即期望值)8 h) e9 z8 v$ v; e: ~5 B0 p( U
o1=0.01
" t6 b# a9 W \- `+ w3 ^6 Q2 wo2=0.99
$ d8 A! b, L2 I5 e9 g: S#偏置项参数
# H l) X+ _' S7 L" Wb1=0.352 _9 _+ C, c5 x% B' ~
b2=0.6
. N5 P7 q0 v6 V. ~! [$ t; F4 |! q3 d7 ?! o `
#学习率
7 X1 L# k7 J& nlr=0.5
! e v+ T# j( W#学习周期# R8 l; G0 ~7 M+ B
lt=0
3 x b* J1 q! R8 H Fmax_lt=10000
1 t7 E& g& H3 W5 Q4 M#允许误差
& {# E; a! ?: j+ feo_allow=1e-5
" k& P8 H5 {- v, [- H" K+ {! j/ a& Z) [( @3 y
#线性转换* i: Y& O/ @& C# K
def linear(w_one,w_two,i_one,i_two,b):/ e' A5 r* B {( O) Q$ X; P" d( D" r
return w_one*i_one+w_two*i_two+b+ |7 E. V9 _" T
#非线性转换& @( }. a% R2 `
def none_linear(i):
. M8 w; a9 {% X- @& t" L return 1.0/(1+math.exp(-i))
+ [4 h- s( k0 e( R7 C1 |7 Q. L0 g' F0 V0 P. }
print("训练开始")7 G1 w m y6 Q0 \7 a7 C0 u
#学习周期结束前一直学习
7 ^0 V8 w( N2 N: [- n* n1 t! D* F {while lt<max_lt:' n* s) x T! ]/ e1 [& z" j
lt+=1
% X* N' x5 a0 F8 d #求h1和h2输入值
$ F2 Y+ g, z. H" L5 O& q T$ D hi1=linear(w1,w2,i1,i2,b1)
3 Q' P; C" r0 } hi2=linear(w3,w4,i1,i2,b1)
* ?" Q6 E u f3 W0 v #求h1和h2输出值2 K% R l8 y9 X; v, \! X
ho1=none_linear(hi1)8 ^( ~8 n. p0 \2 A) z2 X
ho2=none_linear(hi2)
. A, F% [ Y1 M# n$ |: g6 q5 U+ r E #求o1和o2输入值/ `1 ^) [3 R& c: P) S
oi1=linear(w5,w6,ho1,ho2,b2)7 x7 X' K0 G+ t6 ^7 R5 p' [5 S
oi2=linear(w7,w8,ho1,ho2,b2)
( H7 J$ T- @1 ?! s5 o( V* _ #求o1和o2输出值
, e1 b% r; \* U5 T oo1=none_linear(oi1)* R7 [+ ]. r3 o q: s, ]/ x* H
oo2=none_linear(oi2)
0 f* n5 m; ^9 G1 h4 v! Q) s, p9 `4 x' J8 t
#求当前计算总误差3 y; U3 A3 O. f) X9 H( J
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/26 s1 x1 ?9 s3 w+ @) O
print(f"第{lt}次训练,当前计算总误差={eo}")% K+ q D& s! m
#误差已经在允许范围,退出训练
$ [" [9 O3 @- _2 J1 M) f; i if eo<eo_allow:
+ }6 d6 W/ u" ~3 G1 j print("误差已经在允许范围,训练结束\n")
0 S& Y( V3 i6 p! ~/ i break
" l2 S- s! n5 Y9 \ #偏导
- ~' K. x) V. N+ x d_eo_oo1=oo1-o1, M8 |4 ~3 Q! F
d_eo_oo2=oo2-o2) x/ g* [* E1 L! h% I$ A# V8 M6 x% K B) F
d_oo1_oi1=oo1*(1-oo1)
$ R% r* U2 _4 Y8 d( m. k; C3 W d_oo2_oi2=oo2*(1-oo2)
8 a7 E( [' b& o0 Y- I d_eo_oi1=d_eo_oo1*d_oo1_oi1
8 z2 |. g2 |6 l2 V d_eo_oi2=d_eo_oo2*d_oo2_oi2
+ Q$ x8 K7 ^) h9 t4 r) ` #求w5_new
% m d; R' D) i, C: u5 E" Z d_oi1_w5=ho1: ^5 W; c+ K0 f* N& f" }% r! z' `. C; Q, k
d_eo_w5=d_eo_oi1*d_oi1_w5
1 \9 o$ Z; \7 U2 t$ |8 D8 ] o w5_new=w5-lr*d_eo_w5
8 j, |1 }7 U1 ]) H; u$ c #求w6_new
0 B& y# O& y! A& O* G0 K y d_oi1_w6=ho2. l2 D F" x9 I; j
d_eo_w6=d_eo_oi1*d_oi1_w69 r. x$ j0 \0 W8 ?1 [
w6_new=w6-lr*d_eo_w63 h2 D: B; V2 c
#求w7_new
% X {2 J3 C+ O/ W6 o/ N6 E d_oi2_w7=ho1
( F+ ]. Z m, W d_eo_w7=d_eo_oi2*d_oi2_w7 g1 Z* u6 s2 o8 t& U& N9 M" D
w7_new=w7-lr*d_eo_w7
6 [) n% O4 o/ b' x# H& k7 v' V #求w8_new6 ^; K5 p+ g0 H+ z8 G% n
d_oi2_w8=ho2
$ h$ q$ C9 B2 S& S* @, m3 U d_eo_w8=d_eo_oi2*d_oi2_w8
- Y" Q/ U$ j, z! V" n/ b5 J w8_new=w8-lr*d_eo_w83 m7 ^& k3 E1 r/ b
#求b2_new6 h$ ~8 A5 Y) P$ A$ D O
d_oi1_b2=15 L3 _) D: M; Z$ z# k2 [4 V4 d
d_oi2_b2=1
7 k9 c' q+ V; G/ p r( C2 f, t d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
% _8 d- c. _5 i; I( a0 y b2_new=b2-lr*d_eo_b2# V* A6 F7 x" Q2 ]3 Z A- G) ^
d_oi1_ho1=w5' _/ R- X# f# W
d_oi1_ho2=w6
& i8 s4 V" d+ m- { d_oi2_ho1=w7; l3 J( u0 h: m6 Q, I
d_oi2_ho2=w8
1 l; p6 b3 n5 @, Y d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1! b0 b. v) p8 o. L* V& O4 G
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
# `7 S$ C h% p! k! l. T d_ho1_hi1=ho1*(1-ho1); l1 f$ L. }2 j# a9 q7 L
d_ho2_hi2=ho2*(1-ho2); A9 p G* o5 ^# I- S, j
d_eo_hi1=d_eo_ho1*d_ho1_hi1" j# x2 i9 J. O
d_eo_hi2=d_eo_ho2*d_ho2_hi2
; I3 ^3 [" t! l! b( @% ?7 L6 t #求w1_new
5 o6 ~: G+ K2 v5 J! [% ` d_hi1_w1=i1
" x7 c1 x) w1 ]6 L7 v: ^ d_eo_w1=d_eo_hi1*d_hi1_w1
! T; A& F1 Z: Z w1_new=w1-lr*d_eo_w1
5 q- @2 O5 F- I f% ^7 A! r #求w2_new
( I, E3 X8 l7 M( S, S- V) l8 e. V d_hi1_w2=i2" H$ I2 w$ _% v! J9 J8 N
d_eo_w2=d_eo_hi1*d_hi1_w2
* K5 [! l {/ x& i6 V5 u0 h) V" J; p w2_new=w2-lr*d_eo_w2
4 L1 M# d7 i7 x, Y; } #求w3_new" e+ M+ M' U p2 n$ o: l" @
d_hi2_w3=i1
0 L, Z7 u* r: { d_eo_w3=d_eo_hi2*d_hi2_w3) x0 Y% a2 z7 j
w3_new=w3-lr*d_eo_w3
9 s! I: k, v+ D, o" O. Y; M #求w4_new
\/ ?% y8 R! e5 R p1 l. _& G d_hi2_w4=i2
, K7 Z2 v% X: R6 h( |+ s9 d4 h$ r( i d_eo_w4=d_eo_hi2*d_hi2_w4
( |. q- d% Q* P% @; k w4_new=w4-lr*d_eo_w4
) p2 [3 ~! e3 |; j #求b1_new4 }. K* ^, _' E
d_hi1_b1=1# b; _; ~! C# f
d_hi2_b1=15 i6 X9 J; H! x+ E; F2 m5 v% R- Q2 k+ j
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
' p1 u, H2 V- U# [3 j A0 X b1_new=b1-lr*d_eo_b12 }& O; J* Y, z% p h) j2 R' T
#更新反向传播
; q5 o$ Z: g6 j) Y- T: M& M) q w1=w1_new& n! Q( J; c" i1 x
w2=w2_new P" E/ v( P$ T l. t% S
w3=w3_new& Z. {, ^4 T8 ~ W% z0 l
w4=w4_new
) {4 I* J K# J9 Z4 d* y b1=b1_new* |/ C* M0 w) }, Y4 L q7 p8 l
w5=w5_new
; B- L0 D# z+ K: ]* G# d' {0 D w6=w6_new+ P M3 r6 K' ?7 {; j* T& Z
w7=w7_new) u. d; X7 ^2 f- l2 M) c5 I! E3 h2 ~+ v
w8=w8_new8 w8 z5 y2 u$ L5 I
b2=b2_new
* f$ U0 I' v- A' r5 w* Y7 Yprint(f"当前计算总误差={eo}")
* }0 J0 x3 }* Yprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")! z3 |: _/ ?* R% e
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")) k! w0 p U) Q; Z/ y
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
! H& e8 S: e3 I4 F) X( H5 w
+ ]7 k. B# w. v5 a0 x2 H结果' L" j7 b5 K1 ~- E5 u4 O/ X! x8 k
: j" S, }7 g# E& T3 X' I
' z: Y5 `: u }# B, }3 m结语, |/ H7 O! O# v7 E |# E* \. y% H5 J- S5 r
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。5 e% C/ C. ?( G0 s4 D/ ^
6 i9 B3 a" O/ \9 H! j
补充
/ I7 y3 s' F9 F: `程序中d_{a}_{b}格式的变量表示a对b偏导# n. W4 ^+ S7 {
————————————————# c- Y) A" V+ t6 @; Q& `
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 G: m2 e6 x) _# K+ l0 s- e( X原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
0 f7 ]1 {) ]4 _8 L- P6 X# p, T- c$ W, j4 n( u- U, ^9 G' y
. c4 N, m1 Z7 Y5 q |
zan
|