- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565654 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174919
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
8 P1 r6 X2 j! @0 H, `" b) T/ Z0 f/ E2 [
背景9 x3 f8 _" _# U$ c! i. q
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下. b: k4 S. T% p
, e1 O- P" P9 k# e4 ^6 M- Q+ O【神经网络分类算法原理详解】1 B, e5 g4 h7 ]1 x( H+ S
% k2 w& g/ l( T9 L/ V6 l' l- m注意* G2 g! `/ i B
站长提供的图片有点小问题,我们更正如下
- D/ l& e+ }- x8 O$ S% B9 y/ h& p7 U/ l, `
: y) d% ~* f- R+ n
9 ~) v6 x: E0 F
问题* l+ Q* @2 v; ]9 R7 x. d" ]
根据上图所示,我们有已知
* K5 Z7 A4 D& n1 B( f4 r" o
+ I* d- W U' N% G& N; o2 l) L#输入层
" Y6 Q" n6 _: yi1=0.05
8 g& H4 R: _ q- }7 n {i2=0.1
. R6 ^2 D0 H) u- W- K3 c3 ^2 @% U4 N) E7 ]! Y/ ^& ^0 M+ H
#输出层
) h/ i# y$ y6 n' X/ a% V" j( Y9 F, io1=0.01$ Z; \4 R( S" G* H) W
o2=0.99. a8 S D+ B2 I
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
8 K% a% c# s, i1 O0 v7 [4 {3 W" m% m! L
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b17 K. N4 w. Z0 l2 k3 U9 a
8 n# ^# }: Z( F6 d# q6 P# {
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1* i2 p4 N& F, X0 k7 o- g& @
4 [0 K) d' q1 {+ {$ I6 c
神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出! U# {4 Q$ x" G4 U2 x, S
4 S7 z# o: d% B/ F' w; E
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
+ x7 Y: U9 h1 Y7 m( h1 |' [+ h4 I. h& O8 a: u) u+ @! Q
同理
/ N; R* X1 |2 s5 w
% i5 W+ E0 ]2 \9 N7 B神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))) n Y5 l' O5 G# @
* p! H7 l* E9 r4 D. M9 H
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式$ Y0 R( [0 V9 u+ `- X
( q% Q# d% w$ r$ l+ M
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b21 }: N! c2 X* F4 H* T" S
* W& [8 B/ X; R# Q3 H) P
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
- y1 o; L8 I6 f; h& t$ u' `( _( l8 K. S% c, D/ L3 y6 M
再经过非线性变换Sigmoid函数得到
7 v& B s2 Y, b4 z2 G1 y, ?9 z+ u! O# ~* `+ z, a6 P/ |
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
$ k) N) f5 O2 v6 G, R( E4 M1 J# u3 l0 \) U
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
- r% t8 m, W# a& Z' \2 F" R( E6 {, {7 G
1 n ~6 d, F7 O9 V r1 N! C我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为 Z% a: V! Z6 ~: S3 o2 M! F
8 K1 h h# o2 m3 r3 H4 B! _: M损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2; {0 d/ _$ ]' X5 t: v
% f% ]& K* `& x8 O- n/ U" j+ @
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
) ?2 l( p. {7 y4 }+ y! Z& H! k# D1 S* I/ `5 \) H
学习次数 (learning_time 简写为 lt)我们限定最大为10000次8 g6 P, P% w- D- f- c6 H
$ A& O$ |8 i0 M& M2 [学习率 (learning_rate 简写为 lr)我们设定为0.5$ L5 m& P" o: E7 O# Q4 y0 K1 j
( O M* p+ P) u7 @" K
依次求解代求参数) V2 M$ G% Q8 c, \1 a G5 o
5 v; l: A* z- H/ _
w1~w8,以及b1,b28 G% Z+ g. v; P
$ j {2 |; P8 Z" f8 [. P
跟/ u. M+ Z9 W6 m4 S& y% C$ {* l8 f7 }
: r/ G7 H4 d/ Q. u9 S损失值 (eo) 的偏导数
8 w1 @; x& |" \6 A) J% ?& Q2 d/ E; K' r( H8 c
再更新该参数,更新公式为! O/ }, p4 ~7 B, S
/ Y+ b7 H( C+ |9 |参数_new=参数-学习率*偏导(eo,参数)
! v/ ~& `: y. d随后进入下一轮学习
7 X; n/ s% ^6 w0 H' H4 Y% k: f
& U# i7 P; x% T4 d' x* k终止条件(满足其中一个即可停止训练)
% e0 m' L4 {5 s v
- ^2 `* D# F% e1.学习次数达到上限1 I: `" C) W. ~2 w# R# ]& n/ R
) U5 d- P1 O9 J. Z' I
2.损失值达到可容忍的范围( k! D, o0 `: X. i6 y2 O* c
* D1 A$ J, a7 y! h9 I( X2 x$ h
导数# x2 g2 K" I0 @% T- ~+ B6 N
f(x)=1/(1+e^(-x))的导数是
: j1 ?' y' y$ T8 [8 D/ A3 c6 ?# Jf'(x)=f(x)*(1-f(x))
2 m3 E G" ?% f2 o1 H6 N源码5 Y/ v o* Y( Z
import math
3 l- y+ J9 [, j3 ~2 J4 S3 M4 ` e5 a0 v* u/ S
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】+ U+ Z" k) _$ f
#网址中图片有误,请看我博文上的图片
! k6 u- U; y# R7 u& D3 X* B4 {+ C( w, z0 l3 o
#输入层3 B0 Q/ ^6 U) ]+ V6 |3 s
i1=0.05/ K' ]: q2 E- z. B' E
i2=0.17 h* X. A8 r& z5 t
#权值参数 P; f7 {% e+ f% m
w1=0.150 k1 v8 G' K* u; \8 Q* F" I
w2=0.2) i- C& R) E: J3 h# ~
w3=0.25
6 O$ L4 {* ]' l- c! fw4=0.3
! O" V- B; C6 Q; q/ a$ Ow5=0.4& \/ m& O! y. a+ e& ^
w6=0.45
3 O7 h& g/ T$ e1 w r( i- Rw7=0.5
4 d) z7 r2 n3 i) t( F# Ww8=0.55
* N: G( R( P; o X#输出层标记(即期望值)' j/ e3 a/ c8 k y7 ~% O
o1=0.01 A% }4 f* e8 ^/ x& w
o2=0.99
, n6 o5 V' D+ A; N#偏置项参数
, D) `% H4 I. b( R; O- o2 W; qb1=0.354 h% C, q f" X) Q& h) v
b2=0.6
( t0 A Y" L5 ]5 C! }. u! n! q+ B8 q* L) D
#学习率" h$ A9 U, a2 o5 y( a: j5 n1 j: P: T
lr=0.5
0 Y. W- P! M8 y#学习周期
" m/ f. [/ ~$ k) r( e; K: k6 }6 v) vlt=0: j* J- {( j5 \2 s2 u, f2 R8 r' E
max_lt=10000% H, |/ [" y& R
#允许误差! p7 r2 G. q% V/ D
eo_allow=1e-5
2 P B. E: G4 p. b
" L6 o) L& {5 C- n" H1 @0 V#线性转换
- x, a7 J- k7 a( Z( cdef linear(w_one,w_two,i_one,i_two,b):
: z5 j, i+ W+ W0 K; U8 } return w_one*i_one+w_two*i_two+b3 I% T8 P, h1 R- w# H* b
#非线性转换2 w+ F. _' B3 K; ~
def none_linear(i):1 e7 h g' x4 h9 Q' N
return 1.0/(1+math.exp(-i))
. U8 N1 {2 z+ L4 ^7 |2 B& V3 i4 P+ Q: q! S# X3 E6 w
print("训练开始")0 i( E$ r1 _8 _; I
#学习周期结束前一直学习
; Y- q# d, T9 D! l% @while lt<max_lt:/ ^( Q" s1 K& c7 Z' q
lt+=1
9 A+ o3 O; w6 i3 j' D3 `5 f' R8 q; J #求h1和h2输入值
) e3 ?% K7 x7 d, i$ e8 t7 B0 z hi1=linear(w1,w2,i1,i2,b1)
5 Q/ g0 t" ^7 w7 @ hi2=linear(w3,w4,i1,i2,b1)2 G1 c- B, n a2 S! z) p! K
#求h1和h2输出值& v( e9 Z) U7 h( b# Q0 N4 v
ho1=none_linear(hi1)
1 _ ]% B% B! j' \) S! c ho2=none_linear(hi2)0 k" w8 @: E& Z0 d
#求o1和o2输入值
$ J3 M/ k/ b* n" M2 y oi1=linear(w5,w6,ho1,ho2,b2)6 Q U8 B. H( N
oi2=linear(w7,w8,ho1,ho2,b2) L) ~ c) h( e( a
#求o1和o2输出值
2 t4 I; q2 x; C- f5 Z$ n: h oo1=none_linear(oi1)
! @& R, E& n- S. U; a oo2=none_linear(oi2)( a6 P9 X; X( c3 f5 n9 J {
: q$ W: g1 Q8 E #求当前计算总误差 I# d! s- V' E+ x
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
1 N+ ~/ ~/ V, j; o5 V print(f"第{lt}次训练,当前计算总误差={eo}")8 B2 l s- R4 @7 K) D3 A. t$ r
#误差已经在允许范围,退出训练+ s% K1 k! q$ p4 `5 G% o
if eo<eo_allow:
) r3 L+ b1 `' w% C6 l print("误差已经在允许范围,训练结束\n")/ h9 o! V2 Z" i. Z
break
: D5 \/ n. R1 I8 C* A% G. G K #偏导0 p0 s" J# p1 x2 w9 ?( D' B+ T$ r
d_eo_oo1=oo1-o1% N8 O0 j! c9 [! z- f: v2 x
d_eo_oo2=oo2-o2
% @% f5 v: r3 Z d_oo1_oi1=oo1*(1-oo1)7 X: J( l* o& `; ^
d_oo2_oi2=oo2*(1-oo2)
+ v" R. U. x% Z d_eo_oi1=d_eo_oo1*d_oo1_oi14 q1 i3 {* }( q! U; c; B
d_eo_oi2=d_eo_oo2*d_oo2_oi2
& U- m# [' {* {' F #求w5_new
2 N7 ~0 h: L4 s- u& d- x4 W d_oi1_w5=ho1
) c& i* y8 `* w8 d+ l! N' k d_eo_w5=d_eo_oi1*d_oi1_w5
3 d1 E3 W; ?- }* V$ M w5_new=w5-lr*d_eo_w5
5 Y5 N& N8 X8 Z+ B5 E #求w6_new0 _/ \, k9 L/ w6 Y; j& M8 S
d_oi1_w6=ho2, t5 ~% {4 w, n! A7 c$ ~
d_eo_w6=d_eo_oi1*d_oi1_w6
5 I: E+ J1 D$ K7 U3 w C w6_new=w6-lr*d_eo_w6) [) M1 [" G" ?+ D5 o
#求w7_new5 d" d) m: `) V! X' r
d_oi2_w7=ho1
1 K, u3 \, j9 N# L( v- y: U d_eo_w7=d_eo_oi2*d_oi2_w7, H w5 ?* g+ S' Q( ?# g+ M
w7_new=w7-lr*d_eo_w7
6 b! Z0 n# o. k0 [7 E7 l #求w8_new9 A% S8 o" h& a# T
d_oi2_w8=ho2( z5 |" b( j- j. {: \
d_eo_w8=d_eo_oi2*d_oi2_w8& l$ m3 P6 l8 q. v$ M
w8_new=w8-lr*d_eo_w8
1 ~8 g+ B: c, J2 u& R: w2 B4 h #求b2_new
' y2 Y: z3 e7 e( b9 y, ? d_oi1_b2=1
6 j% B5 r" @" i, s0 v d_oi2_b2=1
) F7 r; F2 H/ D( M3 B5 C7 o d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2. e# I& f* s7 }- n$ C% G0 z
b2_new=b2-lr*d_eo_b2
& z1 [ m3 _$ L5 A7 k; E d_oi1_ho1=w5
2 p8 y4 t. ?3 [' A K. H V# L3 \ d_oi1_ho2=w6
$ d4 o6 Z5 J: _ d_oi2_ho1=w7 @7 u2 f {1 ?5 H7 z
d_oi2_ho2=w8
, W' X% H" s/ E( r( n* A% L d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1- x5 T6 C& \) H( E) b& a
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho22 b! X/ g6 E1 _) O
d_ho1_hi1=ho1*(1-ho1)
1 {, J0 N _, V( M4 ?$ R d_ho2_hi2=ho2*(1-ho2)
8 U; G4 \" W! W# A d_eo_hi1=d_eo_ho1*d_ho1_hi1) u6 |. i& O! \# w
d_eo_hi2=d_eo_ho2*d_ho2_hi2
5 v$ W K9 M' A+ k #求w1_new$ u# b" Y* B+ y- X
d_hi1_w1=i1
6 b) j6 |; G2 d D( z d_eo_w1=d_eo_hi1*d_hi1_w1
/ Y+ Y# Z- M1 U/ q8 D, T! s w1_new=w1-lr*d_eo_w1
6 s' u* `' P( i0 c9 A6 Y. A& C #求w2_new# @+ P! E# G6 T. u. I! x" ]
d_hi1_w2=i2
# ` N# d, i4 }& p d_eo_w2=d_eo_hi1*d_hi1_w2$ {2 B& l1 ^6 T, q% B. a' X# f
w2_new=w2-lr*d_eo_w2
9 ]8 L: t( x: F* _$ W" M: z0 h #求w3_new
4 Z8 G L, t" r& L. f" J d_hi2_w3=i1
& @3 S' c0 P @# j- T d_eo_w3=d_eo_hi2*d_hi2_w3. V- d+ m/ G' I" G9 S* q
w3_new=w3-lr*d_eo_w39 {# K. ]5 H3 q( g. F
#求w4_new
) P2 D$ p; h# Y$ U: W' r/ U d_hi2_w4=i2) c/ q. m" X6 Z- z7 {
d_eo_w4=d_eo_hi2*d_hi2_w47 V0 u/ Z% m& T
w4_new=w4-lr*d_eo_w4
5 [# A" @; I' P1 y+ q #求b1_new& m3 t) B4 `, b# B6 K
d_hi1_b1=18 P6 g5 l G. B( W6 O% u9 T
d_hi2_b1=1" I. r0 R9 N5 r- h* b- N/ ~/ e# O
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1# u! {, A( [6 F5 j: m/ d6 _( k0 i8 w
b1_new=b1-lr*d_eo_b1. S9 y5 {4 I5 {' ~/ z
#更新反向传播
3 c3 b j2 A- h7 |! p9 R w1=w1_new
/ q! N5 W& |+ F7 p$ a$ w2 y w2=w2_new; m) @# g* |/ G0 ~) |+ e B
w3=w3_new* g9 Y" }, a x% f% M0 q
w4=w4_new
; F$ D: @9 c+ X" k- d/ [% V* a b1=b1_new
6 U @6 `; u0 i& Y" Q w5=w5_new
s4 I2 V# N# f w6=w6_new
9 z+ Q9 {- m" u w7=w7_new
7 |4 h, _5 }9 ? w8=w8_new* R, m3 t0 V, _, V1 ~$ _
b2=b2_new
+ t& X5 m6 p4 T7 I6 Zprint(f"当前计算总误差={eo}")5 V. n' A7 Z" {6 V6 @! t8 @) ^
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
9 ` Y& g" Z8 z- ~, hprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")! ^: Z; s' k7 _ _
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")! c- b# o# @# _5 m
; s2 Y: ]! l7 I5 w: F8 u; A结果
* q( U% U) J* j, w0 p- w4 H0 c6 C8 k9 S8 ?& L/ e# e {
0 g" V* `1 O$ \结语
! V; {6 T$ o$ D/ p" _+ E可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
; I7 d. T3 P4 D/ Z4 P
7 V- M- S. t) q9 g补充
5 Z3 p( M, N- |9 [. e程序中d_{a}_{b}格式的变量表示a对b偏导
6 h: L) v }9 d& H+ ]————————————————
6 X& J2 W- o4 W9 _ ?, Y( d1 p: o版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- d1 ]8 N: y. B- Q% a( O, O$ G原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679544 T- J, f. O( V# i
9 a8 H( g' L) u
& ^2 o: p1 N* l0 Y* T2 z) J5 } |
zan
|