- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569630 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176112
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
, @" @) \+ d7 S( k7 d. U% D; k: K, V
背景7 j& I3 c o$ A
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下" B d/ h f# C, k2 c' W
8 R; y2 E1 z! `( f6 ?4 M【神经网络分类算法原理详解】
2 u2 z/ r" P7 w% d1 u" W( J1 d7 ?! _( G
注意
4 t4 R) N9 Y3 X) D+ Q9 j% I; h站长提供的图片有点小问题,我们更正如下0 v* b4 P3 Q+ F; i B2 g
- W5 g+ Z. O- d8 Q; h% ]( y1 W' t$ N# l5 A
" K u8 u, Q# Q3 X: D: p
问题
. I7 M% h% ~' C根据上图所示,我们有已知
3 S- X. B4 I, R3 I* F# r6 k# P. U0 a
#输入层1 A% M7 P' a! P
i1=0.05$ w7 [1 @1 D' h9 V& U0 e' M, ~
i2=0.1
- i6 r8 h5 K1 _5 |6 p" s/ H% x r/ `
#输出层1 [! n: c! k8 }: T4 @0 p
o1=0.01
9 T' ?. ^, [' ^) Mo2=0.99" v& c& C$ P9 Z. ^5 f3 k, k
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
% E6 }0 A9 p. q L! ?6 @* C) h: g) t1 F8 S H
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1- l0 N: I# U b
@5 S+ R$ X( w6 R' }" s( `0 y
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1, F3 Z1 e. ?+ |( F) s' N5 R w) b
8 t& d* b. r- \' }) S% n; a神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出) B" v C* O7 J" |. A/ f% N0 J2 R
9 h. B9 d1 N6 u神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
3 ^# w% w# u5 ]0 T) V; A
4 O% C6 K5 e1 g1 s9 \$ Z) M5 `同理
; [- e$ {9 ?( O/ n( u7 @
0 J+ n) A/ D; F+ _8 l神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))" W$ A a/ Z8 R, z O2 P; \
/ L3 b) A2 p% s j5 G& J接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
" i; i5 E- H6 [2 f) ?" f [
" A+ X- \, O3 Y M神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2. Y L& d# D! D/ t9 k& ?
. B9 s3 P) q+ P' g* t3 [. v8 B2 h神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2: t) R6 v0 A; N
5 j0 M' Q6 L/ k9 E1 @; e
再经过非线性变换Sigmoid函数得到0 y; {) `6 }, G Z8 a/ I2 M& ^1 \
* B7 ~. z7 v3 w2 c# i" r
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
2 g' B" ^, E [) K/ V
1 y. Q0 F/ G u# M7 P2 y$ ] w神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
7 u( y/ T O$ W0 E+ p$ Q6 h, P6 c! f0 b
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
& ~* z7 D+ ]# F* }
/ p& J* P: o2 J" V9 C+ E损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2" @0 c: e9 Q1 `( H! O. d1 e& W# n
2 m( ]9 y* ?' D0 H. z: s+ H
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
) z* d5 h: F/ T( {* Z
t* A N- s( c. K/ E学习次数 (learning_time 简写为 lt)我们限定最大为10000次( g8 h, A1 S" Q& C ]
1 }: A! j6 _6 \, `. x) D6 N2 S
学习率 (learning_rate 简写为 lr)我们设定为0.54 e% D! t d: T- @7 M
6 J: H' x" w+ j1 d& d2 x3 o依次求解代求参数
) t/ W1 [" f$ m7 R" a! o/ F0 T
6 u4 X" u$ z$ \. cw1~w8,以及b1,b2
+ U3 ?2 z7 h j9 `4 n* v) O" \ i1 _1 m- \. G3 Q, x4 F
跟* N& e. v& R# D& K; Y+ v
9 k d4 M; c7 ]+ t+ a
损失值 (eo) 的偏导数% }( F* L. O; @" T% u/ `* C
: x5 v; y+ o3 \4 t: b4 _ H" y再更新该参数,更新公式为+ \4 \" }) m; [
7 s+ X& P" j; o4 z/ {6 {4 b参数_new=参数-学习率*偏导(eo,参数)# O- v( _9 X% Q' Y# U
随后进入下一轮学习( c8 J: M, R- r$ j B" q
6 d$ ^0 g4 h+ z7 N& |# `
终止条件(满足其中一个即可停止训练)$ c" C3 Z. P# t+ _
: U: A- e! x2 Q( w! i" x
1.学习次数达到上限
2 m) Z7 y+ a6 B5 R" K- V
, R, R( ?8 F) t: m9 y2.损失值达到可容忍的范围
: P- b4 q" X \- e
! k: n$ X2 ]5 i! l3 t& z1 ~导数& w' p1 @/ T: @( N+ m2 x
f(x)=1/(1+e^(-x))的导数是! R, |" B4 _5 q4 [/ |
f'(x)=f(x)*(1-f(x))
6 `" Z4 Y( X" [% @6 R8 h/ z源码" ~2 ^' S' R% t4 y
import math
# H8 U# o& K8 Q) i5 G% P8 i" S5 U: N. b4 M2 r/ u4 b( e4 {
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
; z+ K6 M# h, D" h#网址中图片有误,请看我博文上的图片8 K& J# R. @, @: u+ `
3 J9 D; V( r5 ]0 Z+ ~. C' L
#输入层+ W) g2 }% f' a" g, M
i1=0.056 q0 ^* I% n- d' K% a
i2=0.1
8 R4 O8 | i+ r! M6 k% c8 Q. m#权值参数2 @8 l9 H$ m) q% L5 j' A( I% X/ y
w1=0.15% V) h) R- @ u/ |
w2=0.2
' \- n# |9 Y" p+ S) Gw3=0.25
- R5 W) _" }( mw4=0.31 m. r, X* p3 w2 u; u D
w5=0.4' P) {% W8 T0 N( n
w6=0.45
8 P7 J. c5 _6 F8 z% D5 ow7=0.5
$ h( x* @& g% z) E4 R% Q# nw8=0.55: Q I; V" n" C* w
#输出层标记(即期望值)
! ~7 o- W0 P. K. N ^o1=0.01
* Q% W+ l& ^; v0 x, uo2=0.99+ m/ g# ^ K7 Q5 T5 P3 ~7 ^
#偏置项参数
. v0 Y. p. o/ Q6 j- ?$ \8 T! Nb1=0.35
4 n6 q% c9 C& Xb2=0.6$ }* c; i; X- f; f- z* L" j; R8 m/ N
0 w% Y/ X$ ^# t, j- d5 h) e#学习率
( k; q7 ]9 ]9 B: O, w! s) elr=0.5
* d% P: Q) m7 n+ ]8 h/ {+ P, I#学习周期$ a7 m9 |+ ~3 Q1 W9 v
lt=05 N( a, y) K- @; r
max_lt=10000
/ B1 j' V7 U# t1 @/ j; `3 S#允许误差8 U3 X& j1 f$ ^+ [
eo_allow=1e-5; S7 X6 t- A, u+ W0 X
/ r6 ]- v8 N5 h8 s" Q. g9 E# m; b
#线性转换
/ E! E7 l3 J; w' T5 Z; U6 Gdef linear(w_one,w_two,i_one,i_two,b):
7 u3 h+ P' M. e return w_one*i_one+w_two*i_two+b
7 K9 K8 f6 C7 u. I, S& }#非线性转换* s& _, c$ `: i' Q5 j q
def none_linear(i):, g; ~; _7 L6 J
return 1.0/(1+math.exp(-i))4 L' a* K3 z% D' \
; t0 N1 ]7 }3 j v1 C, e! e* C2 Vprint("训练开始")
9 U6 Y& Q7 d R' M#学习周期结束前一直学习
3 z- ~& E- C, P" U4 P" Ewhile lt<max_lt:3 j* |$ }: C% {5 q; Q
lt+=11 [( i6 z; R; J4 h
#求h1和h2输入值
- m8 [6 Q( j$ }8 f8 t hi1=linear(w1,w2,i1,i2,b1)
/ {$ c- N2 Q1 `$ ]. e3 c' Y2 N hi2=linear(w3,w4,i1,i2,b1)
2 H3 d& A: D8 L8 [# k #求h1和h2输出值
9 q* ?& |' _+ E' G1 j, P6 b ho1=none_linear(hi1)" ?7 q6 Q# h) O f; n/ I s
ho2=none_linear(hi2); g' \: k( Y v f( ?2 P6 J% X( i
#求o1和o2输入值6 {- i, |! J. r0 s& L7 d5 k
oi1=linear(w5,w6,ho1,ho2,b2)/ n- a1 h5 I7 V6 d* p, Z$ \
oi2=linear(w7,w8,ho1,ho2,b2). b' N# J( o$ D h R' N6 [7 j
#求o1和o2输出值
' G9 T$ [2 k: K oo1=none_linear(oi1)
, C8 ~/ U/ H! f C; X! c0 A, x oo2=none_linear(oi2)
. _" c! q% `1 }9 t0 X2 L3 z# y. l( |
: h) T( p6 [) q0 _ #求当前计算总误差" ]0 Z/ `) H8 |9 V3 ^9 e' Q7 p
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2! U* K8 n5 x% E0 e. M
print(f"第{lt}次训练,当前计算总误差={eo}")0 y/ L: e- B# \8 f# d& s: u
#误差已经在允许范围,退出训练$ h5 o5 X, U* D) \
if eo<eo_allow:; c. J( d2 v6 J* x/ k& T5 {+ X1 e
print("误差已经在允许范围,训练结束\n")- J1 j/ {& V1 G
break4 y' B% X0 ]& U& X
#偏导- s2 I3 O; S: y5 b
d_eo_oo1=oo1-o1
: U3 V& H M2 u3 | _ d_eo_oo2=oo2-o2
2 A: {6 ]; S3 I B8 q3 R d_oo1_oi1=oo1*(1-oo1)
0 X# q/ S6 S8 D0 I _ d_oo2_oi2=oo2*(1-oo2)
" J0 L% v; u% Z5 G* p, U d_eo_oi1=d_eo_oo1*d_oo1_oi1
& r- i, S% U/ P, N d_eo_oi2=d_eo_oo2*d_oo2_oi2
9 k( O$ N9 E9 l5 F/ |9 P; c9 ^ #求w5_new8 w B+ y( O' N# d2 V- G; j3 a, o
d_oi1_w5=ho1# B9 h0 E/ H! q1 Z
d_eo_w5=d_eo_oi1*d_oi1_w5$ `4 T5 ?) C6 Z$ _1 J) `8 X! {
w5_new=w5-lr*d_eo_w5 P; i2 C& N5 D$ `
#求w6_new
; D: |' H3 O2 ]* ] d_oi1_w6=ho21 t8 v. W" ~. j8 V2 f
d_eo_w6=d_eo_oi1*d_oi1_w6
" A5 J: A$ r. a3 X5 L- \4 o5 g w6_new=w6-lr*d_eo_w65 c; k8 t8 ^ N0 ]# n$ E3 m
#求w7_new$ l9 N& y0 s9 I
d_oi2_w7=ho1
+ t* B' H6 f3 }/ b5 a+ h d_eo_w7=d_eo_oi2*d_oi2_w7
* a: @3 G/ A' E w7_new=w7-lr*d_eo_w7 @# e' o1 q* U+ D+ }
#求w8_new2 Q% ^, G0 X$ v' M0 L- ]
d_oi2_w8=ho2. F2 k5 e; P9 B7 o3 B
d_eo_w8=d_eo_oi2*d_oi2_w85 e% I8 c( ?7 J
w8_new=w8-lr*d_eo_w82 l8 @1 I# L: |6 W
#求b2_new- L5 G! l3 H4 v r3 H& a
d_oi1_b2=1+ B5 p. N2 U+ Y) n" S; N
d_oi2_b2=1) X! b0 b/ T2 z7 J
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
( y& V2 E3 e; l b2_new=b2-lr*d_eo_b28 n9 B0 r- m8 w% ]# g
d_oi1_ho1=w5
; H+ a$ t0 ] H7 x% X d_oi1_ho2=w6. r+ C& p+ z i0 B, i. |! C" e9 M
d_oi2_ho1=w7! D5 f' a) z7 {3 I$ }# h7 u: E* }
d_oi2_ho2=w83 ~8 E& [! I' Y- W
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
8 H: w$ O) }2 m" C# f d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2 x" L+ A% ]1 i* P
d_ho1_hi1=ho1*(1-ho1)
1 R$ |% N- s9 i7 r& \6 y d_ho2_hi2=ho2*(1-ho2)
* V1 p' T1 K J5 v6 h) x, I+ S d_eo_hi1=d_eo_ho1*d_ho1_hi1: c/ J+ d6 p+ v6 [1 }5 L3 @
d_eo_hi2=d_eo_ho2*d_ho2_hi2
4 z. k0 G( a1 k% [2 `" T #求w1_new( Q9 q' N& `: O
d_hi1_w1=i1
& F% \) m* A% r0 J d_eo_w1=d_eo_hi1*d_hi1_w15 l/ l ?! u0 j: F% p$ B1 y$ x
w1_new=w1-lr*d_eo_w1 I$ G0 f6 Z) [$ {
#求w2_new
1 j e3 m* A0 ]* s0 H# E; F d_hi1_w2=i2( E, r1 }$ ^! r0 N( {, ?9 ~+ u) O
d_eo_w2=d_eo_hi1*d_hi1_w2
$ [9 _' Z; p: N* x w2_new=w2-lr*d_eo_w2+ b Y% z6 e5 Q. F8 V4 }' F. ]
#求w3_new
$ Q# M6 Y- A m% | d_hi2_w3=i1' ^: k2 @6 x" v0 ^% g7 ]
d_eo_w3=d_eo_hi2*d_hi2_w3( Y" D# ^( a7 o& Y1 y' C' ?
w3_new=w3-lr*d_eo_w3& E' o5 B& i' r9 L& e V
#求w4_new
+ q; {3 |$ y9 \0 } d_hi2_w4=i2$ {, M0 G: r! W+ O: @( r
d_eo_w4=d_eo_hi2*d_hi2_w4) o6 g# ^8 ]# m
w4_new=w4-lr*d_eo_w4
; E, w5 _ f* `0 o9 w #求b1_new
" C% L3 \: J2 [4 A i# h d_hi1_b1=1* P" F H* S, W) F4 q0 l m
d_hi2_b1=1* q! K$ f& E( S* Y# x0 ]- x3 }" Y
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1% j( p/ ~, Q l _& z
b1_new=b1-lr*d_eo_b1% t7 a7 \, x' X; u: X* ^
#更新反向传播; D- v. h% k8 U7 {8 [% I9 m
w1=w1_new+ s& _3 R0 B& N2 b, s9 E- f
w2=w2_new5 y- P' ]% @4 f9 r. a4 p
w3=w3_new" K( I' ]5 j+ c7 B
w4=w4_new5 h' c9 x* P5 D: x0 B, N
b1=b1_new
) f. R5 g* B+ q* A7 r" m w5=w5_new1 y( j5 G4 l1 @* X5 \6 C% s0 I
w6=w6_new
* B2 E* U. X9 m9 ~: N* ~) S w7=w7_new, N9 [2 |' S( h/ J4 t
w8=w8_new
# z: R% m/ ^1 u4 j0 G* Q4 a b2=b2_new. N" I( }. c. `7 U. ~$ u9 d
print(f"当前计算总误差={eo}")1 d, o% \ |" p1 s; M
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
2 S6 t: z. F, i7 R% V+ qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
% z8 D0 }; k& V$ L' S/ Oprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")9 X: a& k. y3 ?0 t6 l+ N
9 v3 R# a D- Q
结果
( p4 n* f" t& Q
% p, h- o1 q9 H5 ]
: X, ^# m# ^% }' E+ [$ {+ V% d结语/ \. j7 @2 \8 ` w
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。* t: S& z/ {' s* ~8 d& ?* A
! v% o. h( O! l7 i
补充
@( I0 m6 z+ z7 D/ c8 `6 T! |' V程序中d_{a}_{b}格式的变量表示a对b偏导
4 R6 w) M6 r. ^5 o ~2 X————————————————, ^5 U, @. S" o) y$ e7 r6 ?
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 s' z, F4 I2 ~, r$ p( y
原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679546 e- w1 r$ L: `2 @& b) l
& z* J* p' {# t3 X2 x# [5 o0 L
t7 |: L$ `% W0 J/ a. ^ |
zan
|