- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564695 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174631
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
0 U0 N0 u! x: z D7 J! N! b! o+ n( H
背景" m) R- q* _6 v9 {
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
& x N2 z8 _5 z/ J# P
# S: } D$ D+ c8 {3 E! m/ T【神经网络分类算法原理详解】# q" p ]( l3 F
' q" Y0 i2 Y$ ]2 b注意3 s# R/ \6 |1 T% X8 I# [: {9 ~
站长提供的图片有点小问题,我们更正如下. n! U5 @" k, C- h5 {9 ]
. x( }4 s0 s5 b( O, ]' G. ~* @' o/ f& Q4 D( C6 _2 J, Y
) n8 Z% @% H s0 f8 u2 E0 J! }+ g) M问题+ Y: }, V6 Z$ U% Q7 D) b' V/ d( \
根据上图所示,我们有已知4 q3 |% E- n9 Z2 f; `
# f$ o9 ?! w4 e' F#输入层
# x$ O6 d3 L( W+ y) Z; c3 V8 `" Fi1=0.057 G N& T/ ?7 y b
i2=0.1
% e% o5 _3 W7 G' m ^+ c9 C5 M# y" N7 P; p- z
#输出层: I4 Z D. H3 E1 H: e: |
o1=0.01
, w% O* O/ Y+ V% p1 v# L) qo2=0.992 A! h" O6 q8 t+ N6 i0 g# \
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
: B. ]1 K& J' M" _
, G2 E! p' R9 d6 I) Z, S7 N: S/ L神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1: z+ t0 M) E$ Z* Q3 z# x+ O/ U6 b
7 }& f f, n6 x2 k1 Y" v
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
. _# `4 |: g, [2 ?8 X7 Q; d8 L( G q
# E3 K* \- \+ Y. I2 r6 q% ]神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出/ L: ?% n& x" p% n# v
! ^# \7 }1 K+ f" b# c$ O8 ]
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))9 z8 Q, j; d0 M( ]
0 b$ U( ]( X0 }" U# f
同理
5 k& C+ _4 E9 M- x. ?+ B' G* P$ r- H/ H% T, }
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)); v; E$ z: A, H3 W3 \+ E4 C6 L6 M
# @2 P% `* f- | V. c/ k" F接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
% @, T. c- a; d4 g8 X2 \/ b$ @, q; E) T
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2/ U* k. @% k5 y j9 B3 R
+ g2 z2 p) @9 G [4 C" k8 q' G
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
% h; i! ?% D. w3 a! _1 k5 q/ `; _' p& L6 {& P
再经过非线性变换Sigmoid函数得到6 u# O# b; ?3 j! k
R5 P+ L) J. b$ n8 `8 q8 F- t9 D
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))& k/ {9 F8 R) i' [2 r
+ a8 P4 [& u' b( u0 C- h8 p
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))% G) S- W7 t. K W1 U p
+ w" f9 }& s' W' ?, v我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为* X* b/ j+ E* K$ S
4 p( O& z7 T4 a9 N3 S# U损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
$ ?* }2 `& x) v1 i9 H, q- c8 Z( P- N# E: ~6 _# `6 k
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足, P2 M3 ?# w( v# {) z, z- W* ?; ^2 i* ?
E* C \+ q5 ]8 e6 V+ ^. |
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
% F* [, {3 s; r: X1 V1 @
! `2 v' L! o) z8 ]2 \0 e7 v学习率 (learning_rate 简写为 lr)我们设定为0.52 |0 A% `% P5 Z/ \9 o* @, \
, z+ k. F% @2 P$ f
依次求解代求参数
( b- D) ^/ i5 _! a4 x
- q5 l4 d8 F4 W/ S$ Q- h; Z* Kw1~w8,以及b1,b2
6 t, Z5 t5 E1 x
. V3 l" [, n. Q" d( Q( g跟
[6 E/ J) u; O. {% z( U! p1 y0 @) T! T/ M( [
损失值 (eo) 的偏导数
, R9 t) A1 q0 k3 h( n" n/ ^8 b9 U3 Y( Z' s, k
再更新该参数,更新公式为4 h- ?( f! y+ n0 I
: D% y; w1 U0 R. ]6 G0 m( c
参数_new=参数-学习率*偏导(eo,参数)
3 t: q8 j' y$ T' D( E1 o. [: N随后进入下一轮学习
+ J& d) ^ Q3 | e _* ], w5 G5 T' ~0 U
终止条件(满足其中一个即可停止训练). R" T7 q7 c. j2 k
% N* C: {* J2 h" D m- A4 U
1.学习次数达到上限
# ^# |, U* }3 C) }4 {* v( ~# W# m
, O/ I* t9 T2 J* X3 O2.损失值达到可容忍的范围
# h; t. p+ V( z5 F2 l' H" a+ r5 \
; X: [0 a. x8 h" k) B导数
k2 x. ~& `( x* M1 |" Wf(x)=1/(1+e^(-x))的导数是, |5 U& g+ Q" z8 X; l+ ?. n! ^
f'(x)=f(x)*(1-f(x))
6 a1 [- W$ i( C1 K4 i% x. W8 r源码$ F- t; V) r. h* u4 L
import math9 {# g# w2 x* H
/ O3 C6 c9 z, y2 e; K& @#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
2 y5 a$ L) W6 |8 }6 z& j3 b( `#网址中图片有误,请看我博文上的图片 B, n( g6 q: P3 d7 {+ W
# q: y5 o5 Q, A- H& n, E5 l' }
#输入层
0 \ {4 H& w$ r* n$ S Ni1=0.05* s- N! `& w+ U: P
i2=0.1
7 [- K* a' T* b0 [8 _# k+ [#权值参数2 h! u, U4 R P; O! [
w1=0.15
; P1 Q+ D" v5 p6 Pw2=0.2
* V* U, B2 M0 s! o* I+ d9 T, mw3=0.25
& n. z5 ?! K$ g. [/ S. M& S1 `: s: gw4=0.3: x8 l, n( e" S& t. |3 X; p9 c
w5=0.4- N4 i ]# M' }
w6=0.45+ a. q5 T+ ^+ h/ \3 D
w7=0.5
; j" ~ y J1 c Aw8=0.55
* W" b: N7 u& b) s6 v2 E7 q#输出层标记(即期望值): G" Y) k/ v- ^
o1=0.01
1 H0 I" o5 F+ z- z, J8 ~0 wo2=0.99
8 p. e; u7 Z/ @4 }! \8 L#偏置项参数
0 J& P/ ]: D# f8 ~' C! l/ {b1=0.35
7 I( v0 v6 z; R2 o. ab2=0.6
( X# R$ `9 T8 a7 a5 A& e/ S' r o. z2 D- l' d
#学习率+ U- ~) i) ]. o2 Y1 @# G
lr=0.5
: k& p% j" l+ {) v4 u. ]1 ~#学习周期2 s: _2 y- D3 w, c; e
lt=0( Z4 b1 }9 U# z+ D( d
max_lt=10000) J7 r8 }, N4 \4 R7 }2 j
#允许误差$ M7 x# ~2 L/ O0 w# U9 \
eo_allow=1e-5
2 c! C% h) |6 \& o/ g. S& W3 x9 S
#线性转换
* s. C% ]6 Y' \ u2 o. H" _9 Kdef linear(w_one,w_two,i_one,i_two,b):
4 Y8 d- w N. u/ l; B( i return w_one*i_one+w_two*i_two+b
1 r% s& r5 s! u2 u" Y/ Q" C#非线性转换* b# H) i8 e" F, Z
def none_linear(i):4 ^% G& m( r7 ]/ h
return 1.0/(1+math.exp(-i))& B; H4 V: W P/ h2 u" j
: ^, ?3 T8 X; z M+ xprint("训练开始")
7 E) L6 H2 ]4 H8 H: L#学习周期结束前一直学习
8 n5 l6 T4 V, L5 s/ I3 I# pwhile lt<max_lt:
( @2 n4 r7 F7 F* o H lt+=1( x+ Q' v7 a1 L' |* \9 p
#求h1和h2输入值
" S5 O% V6 r( C/ A7 o' @3 C( ? hi1=linear(w1,w2,i1,i2,b1)8 d& l7 Z$ Z; V$ u2 E6 o" f' c9 T
hi2=linear(w3,w4,i1,i2,b1)2 ?" j: s" E8 o! k& Q
#求h1和h2输出值" Q( a& ^3 |0 v
ho1=none_linear(hi1)
, d. ]& q2 v! ~! h ho2=none_linear(hi2)$ {( Q8 A$ o( o. h' L3 m. q
#求o1和o2输入值! Z5 U# y8 m4 h+ N8 ~; N
oi1=linear(w5,w6,ho1,ho2,b2)
2 l/ |. E P( B8 K7 E/ F9 ~ oi2=linear(w7,w8,ho1,ho2,b2)
; g. F* l# Z5 x% K #求o1和o2输出值
* v) ~. I* p6 `1 V oo1=none_linear(oi1)
- b) l+ E$ {- @! \: E# e oo2=none_linear(oi2) G+ x) i3 @. ]2 i
: ~4 t' {+ m; ?& r #求当前计算总误差7 ]( V, Y6 \+ R U7 } m6 q
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/28 |$ G. I( b* E( r8 A5 F
print(f"第{lt}次训练,当前计算总误差={eo}")
4 ~$ G" a/ y, b+ x$ B; J #误差已经在允许范围,退出训练 E i. L7 l' t) E6 B. ]* d; J( [. S
if eo<eo_allow:, ^# r5 U/ B# u, n% M4 R4 q4 E
print("误差已经在允许范围,训练结束\n")- Y6 |, R* i7 b" }$ N8 R! I* T: R
break4 ~; Z* u i7 f+ b
#偏导$ B$ ?( D, C# T; h3 {9 m L% |
d_eo_oo1=oo1-o1
~& E2 G; Q1 v% @ d_eo_oo2=oo2-o2$ H5 z: R% i. b
d_oo1_oi1=oo1*(1-oo1)
* R; U% N5 L! m% Z. X9 o d_oo2_oi2=oo2*(1-oo2)+ j. ^% X2 ?) f! s
d_eo_oi1=d_eo_oo1*d_oo1_oi1
4 L" C0 ^3 f) j; V" {1 w d_eo_oi2=d_eo_oo2*d_oo2_oi2
p9 p) d: S" C8 A& M+ d/ | #求w5_new: o# @; o. l, u1 D% \
d_oi1_w5=ho1
0 O% b5 `* e- ?9 R& t d_eo_w5=d_eo_oi1*d_oi1_w5
# [; t( _" j/ B/ N w5_new=w5-lr*d_eo_w50 F, o- V3 P/ @" p' R
#求w6_new
5 N8 v! q# |) H! F0 P, Y( Z d_oi1_w6=ho2
3 @' @: `) `( } d_eo_w6=d_eo_oi1*d_oi1_w6, W& t; V: A. r. }8 s
w6_new=w6-lr*d_eo_w6
% Q* s* q; S; F7 F! C) g1 @5 O #求w7_new
! m/ J9 Y0 ]: }& X! X d_oi2_w7=ho1
, A+ f8 }2 ?4 t3 f d_eo_w7=d_eo_oi2*d_oi2_w7% C8 \0 q A% ~
w7_new=w7-lr*d_eo_w7
7 c3 B, @4 @ b" [' m #求w8_new- G+ J% I7 G9 Z1 K
d_oi2_w8=ho2
+ t" A& b) b- Q& p d_eo_w8=d_eo_oi2*d_oi2_w8+ S5 i& ]$ l4 p
w8_new=w8-lr*d_eo_w8
$ e: e! Y3 T5 A6 S #求b2_new
( s0 T; k+ e: a* b- p d_oi1_b2=1
6 q2 h$ [8 Y: [2 q% x; p d_oi2_b2=1
9 T3 m0 F( O- X# w1 m d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2) G+ K8 O; f$ C, y4 Z$ d% [0 M+ i
b2_new=b2-lr*d_eo_b29 E( s1 w# i5 h, D- @
d_oi1_ho1=w5
n- P4 n" o$ F7 u d_oi1_ho2=w69 g. r4 _6 P5 h
d_oi2_ho1=w7; C; ]; j) [* L$ N. I8 U! [7 p
d_oi2_ho2=w81 @& C: x* ?# [7 w5 @# l- Y, Y2 b$ z
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
9 A( _0 q" f& u3 M d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2. f) k9 H# A. V
d_ho1_hi1=ho1*(1-ho1)
4 n {- Z, w, w* l/ B% k d_ho2_hi2=ho2*(1-ho2)
9 u2 k) s, H( G/ X2 G5 a9 u1 I1 G, @ d_eo_hi1=d_eo_ho1*d_ho1_hi1& L3 q2 G% a2 }. \! y' N4 F
d_eo_hi2=d_eo_ho2*d_ho2_hi2$ T; S9 ? N6 J: r
#求w1_new
' _# d2 H' G9 ?5 f; j& Q d_hi1_w1=i1$ B6 r) n T2 }' f/ A
d_eo_w1=d_eo_hi1*d_hi1_w1
# D5 n c+ z9 k; A {0 b" j w1_new=w1-lr*d_eo_w1
8 T6 J1 ~/ u- B3 q #求w2_new
& z. P( w2 h6 m; p) P0 @1 @, H$ s. } d_hi1_w2=i23 B0 a/ r0 e1 c& [
d_eo_w2=d_eo_hi1*d_hi1_w2) t) i9 l/ i9 E3 o) J: e
w2_new=w2-lr*d_eo_w23 d5 [# C$ R2 w3 @7 L2 o7 i; r& s
#求w3_new) |5 _% f% o4 Y
d_hi2_w3=i12 ^$ n$ }7 }3 X3 y! m7 x* {
d_eo_w3=d_eo_hi2*d_hi2_w3 ~7 e( y+ J9 e G! y9 m' J, n, N. g* D
w3_new=w3-lr*d_eo_w37 ?$ Q; X1 P3 f- m8 K0 a. W: p
#求w4_new
r& m: l# Y( e5 o. d$ @' q* k d_hi2_w4=i2
8 R s2 g0 i* z! Z- F1 [9 D# A d_eo_w4=d_eo_hi2*d_hi2_w4
+ e+ _+ D) ~+ Y4 `# u$ d- [ w4_new=w4-lr*d_eo_w4
: B) k) H: p5 ^/ C% D( t #求b1_new
+ J9 b; x; b; x& ` d_hi1_b1=1
" q) S8 u/ @- J+ {0 D d_hi2_b1=1
# E* X0 A/ h* ~; l W3 v: M d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% Y" s! s; c/ K7 E
b1_new=b1-lr*d_eo_b1
1 g4 {3 w3 r! q' ~0 j& H #更新反向传播+ C4 P0 O" ]9 Q3 l6 C9 P
w1=w1_new8 i" x$ @6 I) j4 V
w2=w2_new/ y) v8 J5 x# H0 `! C0 _
w3=w3_new9 C- Y; R, W& M, c$ l" R4 \& k" F
w4=w4_new) ]! h. X" y1 C" [- Z9 K
b1=b1_new1 }% x: R: F. r5 e$ ]8 k
w5=w5_new
$ F( Z# D. t8 F u: s; d w6=w6_new
, S( O) g8 C& b9 M. q w7=w7_new
& T8 H: R3 @, R8 ^ w8=w8_new
; m+ ^0 H+ }, X6 P- u b2=b2_new
+ E2 s% f; p9 d2 k9 v6 `$ A! U( hprint(f"当前计算总误差={eo}")
, k7 T: f& C, e, w1 A Tprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
. @. I6 x6 o6 @/ o j! [# qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")' | d4 L9 K' ]1 _4 v
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
0 C9 }5 B. T% J7 ?7 ?& b% U0 h
8 @1 A: l4 ?8 |0 }! [结果
2 A" w2 u4 g, N# I7 ~% D0 N) u# h4 h, z! Y- Z& h
) { D% W& B6 W0 M结语! R3 u! P9 C7 Y* f9 ]
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。3 i1 s: N2 h( c0 @) [
% {3 j* B$ T; U, L7 p
补充( s! m1 _/ `& [$ J/ p8 ?# @5 ?: @8 K
程序中d_{a}_{b}格式的变量表示a对b偏导
( y6 ^0 i: i% N6 |- \& V————————————————# l# ] v3 T2 R- R( a
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- g# `6 j( O1 w2 S4 V原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954, G" y/ ^6 X- D( e+ I0 _' \
4 V. m4 J( I J1 z. l
9 o% u" f# J0 H) k |
zan
|