- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569618 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176108
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)! d1 b7 j, f/ V( U0 }5 v: n
* T4 Y" {) c0 _& D5 x* ]背景$ m: c! ?$ ~8 u
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下9 c7 X, r2 y6 N5 y; h+ I' M; V
- {2 ?+ F- y+ _5 }- ?0 q! K# k) T【神经网络分类算法原理详解】
7 i0 {7 \$ q* a/ \* j8 D3 ^) j ?2 j
注意& `% ~8 b& Y$ K0 p- g* K6 {
站长提供的图片有点小问题,我们更正如下- n* h4 Q/ z1 k' Q, Z3 G7 e
6 O2 ~/ H1 f8 Z% F8 _% O, V
* m3 h5 K8 _8 B* U
' \/ G* E& f+ X1 B) Z+ l" |& z) @5 N问题
' H% h& m" o7 k$ z$ x" w% k# s根据上图所示,我们有已知' w1 n% n9 D# j! c1 f
8 M4 |# z5 K) P1 I' C) E#输入层
1 ?7 z& \) S# `+ vi1=0.05
' O( r9 `- n/ @$ f& V! ~i2=0.1
! K' c) x' e& t4 v: k' a- |" b. D; U' N
#输出层* X3 {% U5 ]+ m' V/ _2 {
o1=0.01
; T6 }- L1 r9 m4 \o2=0.99
1 F; |/ l, ]- t( o$ L) \! `这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
2 m5 w5 w0 `* o$ I
: g. @0 R5 J& D4 R8 v神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
1 e& ~5 X; D$ ~8 z6 K
. O3 k( m( F- U. A5 }: V; E神经元h2的输入 (hi2)=w3*i1+w4*i2+b1* T. u) |: i( x. M7 W' a; t7 I- G: q
J( c) l* u: j# }% Y: W$ L V
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出0 ^5 j' P; k0 q9 l) f
3 Y* i4 s2 s4 S1 K- i
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))7 a2 k4 {2 m7 U& M8 e
: g' w- I4 B5 p6 H6 ~# p7 J7 S同理
/ R! _0 m7 m( D4 s; p' y4 J" V' K1 h, y5 A5 X; t. N
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)) J* W1 k9 W, ^& t/ n$ R% Q
8 i3 z3 u& @" L$ I, @
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式: E) d8 H9 F, @$ M$ ^
. [5 W, U* c: F7 A( O( d; ]
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2, E4 m9 E- f8 [' T
4 B# Y9 O# t1 {
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2- h3 A8 \2 f! x5 s; b
6 G4 ^/ E; l) g. f" x
再经过非线性变换Sigmoid函数得到
" c9 a7 Z. u, o/ w- q2 R) b
$ o: f# @ z i; Q ?0 o神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))8 i0 u$ F$ y! }$ X7 o3 @( [
. l r. k8 ~ ^
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 g* n" ~/ N2 m. r
E$ ^- `& U5 o. T/ o我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
) Q& m, D3 I0 e }! H3 \2 C( f9 u. A0 e
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
" R1 t! X+ k8 @5 D% j* ]; n2 h2 C
7 o' \# M" X5 @/ B" H由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足0 R6 l/ Q0 X; m+ u
7 E% W" r+ j$ R* ]. Y学习次数 (learning_time 简写为 lt)我们限定最大为10000次+ n2 e, h& s ~7 l% E3 {9 C' `
+ Q1 B- j# o+ f" E( i: q w
学习率 (learning_rate 简写为 lr)我们设定为0.5* C- ~, @& p: f# ?
# f! f v2 V5 u; A% L& J# G3 R
依次求解代求参数
! j% X0 Z, h9 O+ p- u' l6 `' V3 K
; I" m/ c5 c& o& Hw1~w8,以及b1,b2, }4 F" Y' a8 }
$ u& C' s/ K8 t, L5 ` m! s z+ U7 W: w跟: m. P; E3 t, W$ p; W/ d' E: t, v4 X* N
! Q3 p! t6 z, b0 e
损失值 (eo) 的偏导数
" `3 G+ V3 T0 B: L6 H1 `
/ P2 g2 [& P5 g2 d, N3 c5 v5 V4 V再更新该参数,更新公式为
2 B( N8 M+ P, m1 @! t \$ e6 R2 l/ M( ?2 q \- N4 c
参数_new=参数-学习率*偏导(eo,参数)
9 J2 L9 [" E; B7 ]随后进入下一轮学习
7 [& B% _& L2 D" M6 h. {' V+ ~8 M" d1 P I, s/ @
终止条件(满足其中一个即可停止训练)
& q$ k! m2 }0 ]+ m, p; Q
: Q7 y/ p/ O* |' Z# F) j! g1.学习次数达到上限
! N2 v- z6 F# b$ M
# h; Y7 W, T# h( d+ V2.损失值达到可容忍的范围4 S ]3 n) E$ G( Y9 ?8 h7 ~
6 x. e# K3 C8 _; K2 Q3 C
导数5 s' w1 i6 M5 x) w/ \3 g6 L8 p
f(x)=1/(1+e^(-x))的导数是. H. k! t$ W; U) U- `2 @
f'(x)=f(x)*(1-f(x))
7 \* S" B( n* m( H0 V源码
2 X' }( Y1 J( l! j7 d1 t4 K, N0 Yimport math
4 G! o& q4 w& I5 G: H- G+ _8 ~* b" d% c+ U& H" Y1 V
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
! k, T8 [9 J R7 w# }#网址中图片有误,请看我博文上的图片
. k8 ~) |$ \( t3 H
4 U. l2 S! X0 j: U0 S#输入层9 |+ ^- z) V- s4 r
i1=0.050 c7 B9 ~ o9 V4 B
i2=0.14 k% a: L' a, X1 T9 C7 R! Y0 z
#权值参数( {6 h9 j. F5 U( E
w1=0.15
; d/ w* P( m" ~; q) u& u3 Cw2=0.21 T, F) [; s: a' P0 U% ?
w3=0.257 s8 r2 f: l4 }" B
w4=0.33 S, w/ ~. e. Z
w5=0.44 _9 _, C9 D" {0 Y
w6=0.45
- ~" k6 R0 _9 g' K4 @5 X6 Dw7=0.5. j) t5 P# }' p7 |5 j: _4 Q. V
w8=0.55! a- N; u" N! K
#输出层标记(即期望值)
) h9 b6 ~: I3 ]4 A7 u7 w8 no1=0.01
$ y, D# f% W! \5 N" V5 g+ io2=0.99
6 `5 P2 e3 |% c0 M/ s+ u& W1 B8 W6 d#偏置项参数
# l5 Z# Q. z* W/ Ob1=0.35' ?( K8 A8 i/ x# r/ [) P i9 N
b2=0.6
; M2 ^- o/ [4 t
8 D# F# {: q5 L' m& c6 a k1 b#学习率1 x. K) P. O& p6 _
lr=0.5! u5 y* S" g0 P1 C+ c/ \$ ^
#学习周期; U2 i5 w, c; n* G
lt=0' ]8 y+ l8 |# Y7 n- \9 g2 l% n
max_lt=10000
/ S* b/ n, ?$ {0 ?, L# |5 R#允许误差
4 y5 e( n( E! P% Z _! q9 aeo_allow=1e-53 d* t& I$ R# y+ N" c& G4 F
+ M- x: f$ ~6 ~8 {) H$ A- g1 k#线性转换1 b, E4 R4 Q1 l! |1 o" `
def linear(w_one,w_two,i_one,i_two,b):
& S3 ^: P! w- J! H$ f9 ~% y* P+ c return w_one*i_one+w_two*i_two+b
: z, C; \5 v* h#非线性转换
( B" {* ?$ O1 t Q8 Y& Xdef none_linear(i):
P0 N" }" C" y0 R return 1.0/(1+math.exp(-i))3 G; x1 P1 N# J M
5 g% x' n& x( \- B& R4 |; f& h/ Z
print("训练开始")3 r6 w+ v% u' ^& d. z8 p! A g J
#学习周期结束前一直学习1 Y# Z1 h7 ?8 Z1 d. \
while lt<max_lt:- [& n. D1 s F2 q- c, Q
lt+=1
8 R. o4 e# P2 [ #求h1和h2输入值' [: X' K3 |' a5 y
hi1=linear(w1,w2,i1,i2,b1)
W) u, ?9 D8 W! z" p' N N4 g/ B hi2=linear(w3,w4,i1,i2,b1)& c# Z$ ~. m. p7 u( U
#求h1和h2输出值- o1 E; X: P" E7 U' ?( n: O T
ho1=none_linear(hi1)7 n' n$ o5 q: C* h/ |9 ?" s& D
ho2=none_linear(hi2)
% E% A. L" C8 }, V3 d #求o1和o2输入值
2 C, H' |" O2 l5 d+ J oi1=linear(w5,w6,ho1,ho2,b2)0 k7 i& l. o* [1 t2 { |! @
oi2=linear(w7,w8,ho1,ho2,b2)
, E" J% `) k U #求o1和o2输出值
2 f4 | y K2 `# t5 T7 b& L; a oo1=none_linear(oi1)$ {; P @2 {7 S$ K
oo2=none_linear(oi2)
4 ~4 w: f8 C5 k% B; H' j
5 B* \% J+ ^- g2 U6 l #求当前计算总误差$ ]7 d/ l4 p! O* D/ O% f5 g/ y2 N
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/28 G6 \$ b$ v0 l" Y$ I6 d+ G
print(f"第{lt}次训练,当前计算总误差={eo}")/ e* \7 B! J8 V7 }) U
#误差已经在允许范围,退出训练# a* R" b4 T$ i, o8 h# ~
if eo<eo_allow:
" ~1 i& R& i5 o0 o% H9 y print("误差已经在允许范围,训练结束\n")
4 L% ^4 y' S8 k2 L) t) G2 d break
; @% |9 @) s4 h& h0 X1 Y #偏导
, R/ `6 |/ l! Z+ Z9 J+ ^3 e d_eo_oo1=oo1-o1! |7 t. I0 h2 V8 X% n$ W
d_eo_oo2=oo2-o2
/ {* P/ Y! B( \; u) V d_oo1_oi1=oo1*(1-oo1)/ y" @ d: J9 _8 u U% j& P
d_oo2_oi2=oo2*(1-oo2)1 K5 A4 z( o& l, c
d_eo_oi1=d_eo_oo1*d_oo1_oi17 H Q: b2 C+ u" @0 m" W2 W
d_eo_oi2=d_eo_oo2*d_oo2_oi2
& ]2 u& L) M9 x; r5 Z #求w5_new, Q" a1 W r4 M2 V
d_oi1_w5=ho1
( z# a' N1 a& n d_eo_w5=d_eo_oi1*d_oi1_w5
5 K) M5 c6 L2 q2 s6 z w5_new=w5-lr*d_eo_w5
, q0 @' E3 U6 l0 P) o6 V #求w6_new' Y0 v& }3 I: D8 N$ S5 t
d_oi1_w6=ho2
0 _0 j. F# Y T0 y9 ~4 A3 T d_eo_w6=d_eo_oi1*d_oi1_w6) Q y2 Y0 m: a$ @6 B
w6_new=w6-lr*d_eo_w64 A1 F: `/ q5 P
#求w7_new0 ^! ]" Q8 I, U( T8 r6 G* n
d_oi2_w7=ho1, K2 {3 s5 r/ y7 m: K; j
d_eo_w7=d_eo_oi2*d_oi2_w7
r7 ^3 v. R, X w7_new=w7-lr*d_eo_w7
9 J3 F2 }7 d! X8 c/ F #求w8_new
q6 z7 s- [0 `) ]% q d_oi2_w8=ho2# C9 Y) m7 K* A7 V2 t+ U7 @
d_eo_w8=d_eo_oi2*d_oi2_w8
. k: d( b8 i c; `3 z w8_new=w8-lr*d_eo_w85 f) O. |. ~& H
#求b2_new
& {! Y" m1 n; X. ` ~2 [9 \ m( U d_oi1_b2=13 ?4 B6 o3 V5 g7 U
d_oi2_b2=17 @. [1 x. L4 j" d& X' ]
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
$ g4 k( g7 ]. h, L9 c& B; U# K% L. M b2_new=b2-lr*d_eo_b2- b1 k' ~4 J9 _9 L9 o: I* H+ k
d_oi1_ho1=w57 t' t7 a F# e* j I
d_oi1_ho2=w6
7 L& q( G/ m6 d" H4 a1 u d_oi2_ho1=w7
' e" I% h" s6 @. f5 M4 @ d_oi2_ho2=w83 W8 B3 P7 b6 c
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
$ {& \5 F2 U1 U d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2/ z" ~6 i. Z5 m9 |+ X1 s
d_ho1_hi1=ho1*(1-ho1)3 y: r; X6 U0 H1 M9 O1 i
d_ho2_hi2=ho2*(1-ho2), k5 u1 Q: ^; I7 U7 L3 L
d_eo_hi1=d_eo_ho1*d_ho1_hi1
8 ]- _7 g3 [% [& Q d_eo_hi2=d_eo_ho2*d_ho2_hi24 d9 v! ]8 X" w+ H9 |
#求w1_new
3 k z! {! p; w* ^: M& B9 } d_hi1_w1=i1
5 i5 T# I4 n& V6 w" W. m d_eo_w1=d_eo_hi1*d_hi1_w18 ^4 K5 @8 b8 e- C
w1_new=w1-lr*d_eo_w1
+ f' V% z5 P8 x9 |* w9 T #求w2_new
. @% t. @# W+ d! H d_hi1_w2=i2
/ \6 K" i7 |/ T0 b d_eo_w2=d_eo_hi1*d_hi1_w2
3 y! k C4 }$ m w2_new=w2-lr*d_eo_w2
k: q- N3 x1 r6 u6 u6 z) ~$ U #求w3_new
, B, r# y6 e/ T d_hi2_w3=i12 v4 S7 i' t, g# p
d_eo_w3=d_eo_hi2*d_hi2_w3; F- a5 S2 ~6 |" M" O- g6 x
w3_new=w3-lr*d_eo_w3
% M+ E) a j2 ?8 J$ q7 _ #求w4_new
7 r' H. [3 J( z d_hi2_w4=i2% T& f, k- K8 J
d_eo_w4=d_eo_hi2*d_hi2_w4
" z& }% ^7 E! ?$ W& L: L; P: y w4_new=w4-lr*d_eo_w49 n- V) y* `# p
#求b1_new3 F1 {6 P. r1 m4 R; a
d_hi1_b1=1
8 { w1 s. M- s7 b5 ^/ M d_hi2_b1=13 v9 D7 v+ l# d% O) q/ ~
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
7 W. o$ r0 K% i7 ?* B, t b1_new=b1-lr*d_eo_b1- u6 t o& | h, B) C! I* v1 R
#更新反向传播
* \( ^* t3 b) T8 v! Q/ p w1=w1_new
# m, m' P: Z7 H5 D/ T; j6 [2 l w2=w2_new) ]9 }9 X; Y" O7 ~# e1 L( h
w3=w3_new( s) U, o% q% c
w4=w4_new' ~% [2 y( }8 d
b1=b1_new
# y2 O7 V1 L. F1 x( u% y w5=w5_new* v5 q% I' k) _+ g9 ~& o' B
w6=w6_new
5 s) i; U0 N6 ]7 W2 H w7=w7_new# B( a) {( {' c) Q( e1 |8 |
w8=w8_new, r2 l) x7 V9 f8 `
b2=b2_new( X4 A3 T& ^- S6 M; w8 z$ r3 K0 N6 y
print(f"当前计算总误差={eo}")5 x8 X8 C$ R8 {* L# X4 B
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
' J' j% }% M. @9 J' u( t; _print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")) \% |$ d: A" j2 Q! \: t
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
! s2 ]1 L& t- [8 s W) f3 _" D9 t! Q
& l B1 q6 T# S' y5 j% w结果
9 i: L! V: [9 o8 D
; u& z0 x) r8 w/ A2 c2 m) u" D7 u# r' t3 W# }& H/ o
结语
: `+ D. Q4 ~6 Y& t8 y9 t8 c5 F可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
; e+ h3 i+ Y% U. I0 J
4 G# C* o+ b( E补充
% D* ~0 l; h' g- m8 |程序中d_{a}_{b}格式的变量表示a对b偏导
0 W2 Q/ k/ k' @6 P- U! t————————————————+ W+ C4 a+ L' { q( y# c
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 o, m2 M2 y( \5 J9 ^原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954' P: L* V- n) M- R
C( _0 q% Q5 L4 s
( R2 V* J8 g- Q
|
zan
|