- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569584 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176098
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
5 p3 }: r% R% R1 U7 B6 h
. s8 d( J% V% _5 @背景1 ]3 g2 h/ J1 f
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下& ]( V) g' A1 C! A
1 s5 c# v- r3 J2 M4 S4 E【神经网络分类算法原理详解】
+ X$ l4 d3 f9 m' I5 J. S, a& G' J
注意2 i# f. K- I [1 U6 m1 ~ b
站长提供的图片有点小问题,我们更正如下
! z$ ?3 Y( n7 @. ~0 s% ]
' `, r; M- ^6 P; S' U8 c% D8 v; t: P) z+ W2 J1 U
3 t* R+ k* C& v: N) s问题9 d' l2 `7 X0 m$ u. \
根据上图所示,我们有已知
: y1 |( F# {5 M, {; g/ s6 |% Q$ m" ?+ B
#输入层
4 W1 C! F+ H" ei1=0.05
4 f! _# x2 e* |i2=0.1. l9 f& c% U) W# ^) S
5 _' T- K) }7 S
#输出层7 g% u; h$ d! q/ n- N4 u3 b
o1=0.01
" H1 I2 l8 Z D0 P, B" Po2=0.99. e* A6 j6 |3 _+ y% ]
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
7 |2 {$ \6 g# @) G/ c3 ?! K) B- f$ r3 _% z \; h( i
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1 N8 m. x0 f! q! e- ~
2 D! }0 r" G$ ^* O1 g神经元h2的输入 (hi2)=w3*i1+w4*i2+b1# z. P: p' {! V- c! g/ F$ r
, G2 Q, |( J7 E0 _. W8 k+ ~6 y神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出4 u6 W3 k, ?7 M
9 i. r* a2 k3 u: `
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入)), L5 r' q+ u1 S/ m" y
5 b+ R' P+ l$ B0 G- ]: e
同理
& H' W6 i1 }0 |4 v; l" L; Z+ A. }4 W' ~$ Y) ^" A% T0 I
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))! N5 f; @$ } O) N( x! }' n6 a
* N7 B: u4 e% D: ^1 b: b0 w5 M接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
% b. s8 O% M) _# `$ _! q, j+ f- e2 O
: w; l% q5 m: q神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
0 l, X9 D2 a1 B) {# a# v% | [
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2' o5 a f; l# l5 e O% K9 p; g
& S8 x @! L+ N) a
再经过非线性变换Sigmoid函数得到
0 o- p2 o; B* C2 e) N# Z2 W* G
1 m1 t1 z- ?0 t+ D神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))- o9 _1 G- ^% A) _& h, Q
/ i* d) R. n" l+ r9 L3 Q神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
" \6 Z1 ^. C- z$ J( @1 T
' M, }) N x( B J4 Q9 \6 d# I v我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
8 |$ c2 }7 a. B8 c4 D9 G" N" Q) n2 D2 i3 d8 e. B0 B+ k2 E
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2' O6 k0 O3 k, w9 E6 [0 }
, r" J+ ^! z( M& U1 E% w& n9 T
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足. ]- L$ r4 j' b4 l8 @) Q
3 L7 n2 Z" l4 y. w6 c' u$ ~学习次数 (learning_time 简写为 lt)我们限定最大为10000次
5 W3 [0 S0 C V U$ l: i7 Z. X
]2 Z; ?2 c4 N$ {- ~学习率 (learning_rate 简写为 lr)我们设定为0.5
5 V9 `) o5 q6 T& h
/ Z/ \+ m" t8 E* U! A3 R依次求解代求参数. V6 S" H _* q! E1 m
" W. n& W8 C8 a6 O( I
w1~w8,以及b1,b2
) @+ m- |+ V ]; h5 s' ~" \$ q& `* ~( D9 G2 e g) Z( O
跟
0 G8 F, g( H' c; e$ `
2 G) {/ n: }# E3 W. k8 ~( M( h损失值 (eo) 的偏导数. p5 X8 l8 A% U, H# M- p; z$ a2 ?! s) u
6 B% j0 V; B/ }6 W/ H
再更新该参数,更新公式为9 g; G+ |9 k2 f. n
" X" c# W+ S: {4 f" m: ?$ ?0 W# f
参数_new=参数-学习率*偏导(eo,参数)
6 \1 H y* w- K, A* v随后进入下一轮学习
: ]! J5 f) z- z" [# w% T- R1 h, c4 r( I* T0 u5 X% [6 I
终止条件(满足其中一个即可停止训练)
], A# r% n% K% j) ~/ p g a; a% N: z
1.学习次数达到上限/ b8 @9 y$ N" s( h* P
! |" Q: ~+ U" i. t4 R! c! @
2.损失值达到可容忍的范围1 u1 Y% l$ ^6 }/ L8 a$ }% b0 X; r
+ F3 P* D2 ?% x7 Y9 b2 @
导数. f: H( O9 \$ B1 ]+ M" P. Q
f(x)=1/(1+e^(-x))的导数是& f0 p4 |1 [, _0 @) X7 y
f'(x)=f(x)*(1-f(x))
4 K; g8 |8 S) s, K源码2 ]2 Z- q( }* J) m5 ]
import math
: g- \$ k( g* s4 N. H1 }8 S8 l5 |& Z7 b- n) E
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】! `- J7 k; [' i% p1 }! m
#网址中图片有误,请看我博文上的图片
! B) T0 y1 e* M( b9 q* O$ F3 `5 ?+ F X
#输入层; U: c2 d5 u; u5 s) k1 D: ^ a+ {) o/ n1 f
i1=0.05
. t4 L X# [3 b, ji2=0.1
$ n k2 T) T( u9 P/ t4 N#权值参数
9 N$ G: r8 Y* o- h' Gw1=0.15* K0 K% D2 |' S& v7 P1 z
w2=0.2; d& Z2 F! u: v, Y8 ^& g9 O) Y% u- f
w3=0.259 p% w) E3 M6 o
w4=0.3
: S. X& D# T- p2 a4 Sw5=0.43 r2 K4 |) }( g. x. }
w6=0.455 ?" k% ]# N: U, u
w7=0.5
6 s& F5 w' [) f3 c# E! ~3 Hw8=0.557 h+ i, n5 h) @
#输出层标记(即期望值)) |4 T! ]) b* H! h- x1 H2 P! h! b
o1=0.01
3 p9 \& w: M; s! x& uo2=0.99
% Q' S2 p- @7 X' P E#偏置项参数
# ]$ t8 X3 G5 z* Jb1=0.350 b' Z: `& `/ x- |1 W
b2=0.6' b" Y# Z) q$ f6 X' b' N
* k5 c5 Z' D+ t; [1 h' Y! m4 Z#学习率
6 V! I$ T1 V! H! G# Xlr=0.5
2 w6 i: I& ?: n/ W4 j y#学习周期4 w0 x" g$ |, c' z
lt=0 Y4 m' }' M0 Z* M, g
max_lt=10000
& A2 S: r7 ~ l! r#允许误差$ \' @. X ]0 {
eo_allow=1e-5
D$ J4 q4 y. ]- t! T3 B3 M) k- A/ t3 `
#线性转换
' q5 q8 F- b& r* b" y+ jdef linear(w_one,w_two,i_one,i_two,b):
; f3 |9 M- P3 e8 D3 z return w_one*i_one+w_two*i_two+b, b; `; V" o9 c) z4 t. P
#非线性转换
; o+ m* F4 E# b" Adef none_linear(i):
8 g1 r0 G( `7 j9 [# K0 R. A/ Z return 1.0/(1+math.exp(-i))
2 \1 K' r5 C2 N4 I; u/ L# L3 a% V) ?" u5 X$ h- |
print("训练开始")+ N4 x. x+ v2 ~" H1 q' N6 k3 p* v
#学习周期结束前一直学习+ o- |% V* n4 n% {) ?
while lt<max_lt:0 S) E# I7 K& U* O( v: H
lt+=1+ @8 ?3 {1 l& {' E* q/ s6 Q7 c
#求h1和h2输入值
: W4 ?. b0 ]( l hi1=linear(w1,w2,i1,i2,b1): ]( w8 Q5 j2 J- Y I
hi2=linear(w3,w4,i1,i2,b1)3 D' x3 b) }/ i" s3 ^- X& t
#求h1和h2输出值
& p" ^0 x% U: H8 N7 p* V2 w ho1=none_linear(hi1)
% m3 W; F1 d) Y) c9 D: s ho2=none_linear(hi2)) Q6 f6 q: w* L; p5 y5 A; i
#求o1和o2输入值1 O4 s6 _$ k# I8 F2 V+ z+ B# h
oi1=linear(w5,w6,ho1,ho2,b2)+ b, S. j9 t( T& \$ H, b: Q4 T" Q
oi2=linear(w7,w8,ho1,ho2,b2)
; [ d! H. L* R& x! V #求o1和o2输出值
) F: j) j1 I5 ]+ R& |! Q1 u# m oo1=none_linear(oi1)4 ?5 \' F1 Q" p$ O& f# I. T
oo2=none_linear(oi2)
0 |4 ` g, o, N: W1 W# Z
8 Q P$ j1 _: M0 C( S' M" T' w #求当前计算总误差
; M9 a A5 v/ d( e& U eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
- L* w' F- a" j% X9 l print(f"第{lt}次训练,当前计算总误差={eo}")9 r1 S/ K' D: j3 V
#误差已经在允许范围,退出训练# M9 \2 J% {$ L v% V
if eo<eo_allow:
- E: e6 f! b9 B print("误差已经在允许范围,训练结束\n")
' R7 b3 J `1 y9 _9 ]# N break
% l6 l1 Q M1 _8 M) i2 v #偏导
. @4 G4 e, ]9 O. Y# Q/ B d_eo_oo1=oo1-o1. {8 w0 O- e. W9 e
d_eo_oo2=oo2-o2
( \7 B$ F: t1 P; [ d_oo1_oi1=oo1*(1-oo1)
8 J r" D# j) P3 M% F( {5 T8 b! e d_oo2_oi2=oo2*(1-oo2). f6 P& d O" q
d_eo_oi1=d_eo_oo1*d_oo1_oi1
( S* {2 O' D* z0 h d_eo_oi2=d_eo_oo2*d_oo2_oi2
) `) E9 c. f& l7 }- w! q% ^# c) k #求w5_new
( H' p d7 Q0 S d_oi1_w5=ho1" a3 t+ e; o9 d* F& u
d_eo_w5=d_eo_oi1*d_oi1_w5
|' D6 L4 y' w w5_new=w5-lr*d_eo_w57 E* |+ O' b. P& a* `
#求w6_new
; T$ r( ^* q# [* `7 s% E d_oi1_w6=ho2; c1 }+ v- U$ V1 p
d_eo_w6=d_eo_oi1*d_oi1_w6
. W2 H" V) Z* K6 G9 k' K7 h* u' w7 J w6_new=w6-lr*d_eo_w6
! H& B) K# o8 `0 E( r #求w7_new
2 v y* |1 y6 X- U% h d_oi2_w7=ho1. t+ V- r3 I% ^, q0 ~; F
d_eo_w7=d_eo_oi2*d_oi2_w74 c& \- r, q9 ?& }; y. Y
w7_new=w7-lr*d_eo_w7& Q5 _( Q% M) K: t5 h
#求w8_new
) ~" r0 Z/ ?. @) e8 t( u" Z d_oi2_w8=ho2
0 e" X0 E+ @; M3 t d_eo_w8=d_eo_oi2*d_oi2_w8
# i, d0 J7 m; U1 Y. L4 w w8_new=w8-lr*d_eo_w8
0 |6 |* v9 B3 c0 N0 R: z #求b2_new
( p" E }1 ^. o d_oi1_b2=17 q- f+ U% ]" ]
d_oi2_b2=1& \; x3 H; r- s/ D
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b27 L( r7 z( ^5 l0 t) S
b2_new=b2-lr*d_eo_b2
0 ` X( l& U5 A7 e d_oi1_ho1=w5
+ Y$ t1 _0 ^) D3 M& ^# r d_oi1_ho2=w6( h3 Y( [+ u' A3 r& n. G
d_oi2_ho1=w7
$ J9 L: y+ H5 u& j w. | d_oi2_ho2=w8( C1 w3 o: \& y# x$ U. s y) _
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho12 z* m$ @, \( `/ H" O& X
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho28 l1 n% v; b" e2 }5 B! p9 \+ o1 T5 K
d_ho1_hi1=ho1*(1-ho1)
1 t1 K) E3 }; [1 ?% F/ U3 }# U9 A z d_ho2_hi2=ho2*(1-ho2)
$ w V4 j' [5 b5 X d_eo_hi1=d_eo_ho1*d_ho1_hi1
) g" E& u3 Z/ d- |; l7 a d_eo_hi2=d_eo_ho2*d_ho2_hi2
% R( I, `4 i5 @% `1 B( p% f #求w1_new
* x. ?* N; q; J3 e8 y3 u d_hi1_w1=i1
1 r4 H; x+ V) \6 b& v/ w+ n/ y d_eo_w1=d_eo_hi1*d_hi1_w1+ k) B- O; y% D+ g* Q8 t. n
w1_new=w1-lr*d_eo_w10 h7 u% p& A9 |1 d7 S e. L
#求w2_new
/ x8 ]& \& o) w d_hi1_w2=i2
# m# { H% g, n5 u P d_eo_w2=d_eo_hi1*d_hi1_w2. t; p( e. L' R3 x% s) `" o/ O
w2_new=w2-lr*d_eo_w2
. n# h, X" X) W& U/ \( N3 ?* z #求w3_new
: `6 j7 \& u8 d+ g; e6 t d_hi2_w3=i1
1 G) ^: @: b* p) U d_eo_w3=d_eo_hi2*d_hi2_w3$ x# j/ C! U; O7 U8 G
w3_new=w3-lr*d_eo_w35 ^) C; J! q, S- k. Q1 Y3 h+ _
#求w4_new2 U9 e5 n' W% Z: ]/ i
d_hi2_w4=i2
c- [, K' Q: K d_eo_w4=d_eo_hi2*d_hi2_w4
, ~3 ^9 A ~5 z* q/ ]( P w4_new=w4-lr*d_eo_w47 {" Z8 e3 S) _- O, E5 e; p, J
#求b1_new
# U5 X" I; `2 j1 G+ Q% f d_hi1_b1=1
6 U1 Q# R. o( s4 } d_hi2_b1=1
# n' R4 S/ m* ~7 {3 f d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b15 J5 B6 ]4 a' l) \
b1_new=b1-lr*d_eo_b10 c8 U$ N! p' O- o, [! t$ t
#更新反向传播
2 S5 \/ C! ?$ w" x* [2 k6 X w1=w1_new
|/ }, [$ j' R5 C4 Z w2=w2_new9 B) R( V# [8 ^1 ^
w3=w3_new9 I/ o+ k" b* a: N
w4=w4_new
6 R/ O }* s" J& ^ O b1=b1_new; x# A2 S% P t/ w4 q, G
w5=w5_new5 d ^6 Z) _% n! ]
w6=w6_new# m) d! r4 G/ l/ i7 S/ h
w7=w7_new& W2 I7 {9 w% V! {1 s3 o; ]
w8=w8_new
0 f: H5 Z3 q1 t8 } b2=b2_new5 t8 \& J, ^& {0 c& u9 v, z7 f7 n+ l
print(f"当前计算总误差={eo}")! G, u8 i, T( D3 E0 P* u0 a- _8 ]
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
9 |% L8 E+ s8 q- Mprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
4 E' p# D: @( j' l- n4 f. n7 _9 E' zprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")# ^, I; Y' t. w* }9 M
) I7 {. O3 R% J9 N8 A8 w结果
' ?, ?( L( d( R( d; t# a5 t; a* T" [9 Q: f
! U1 F- s& ~2 {1 r结语0 r) _* q9 O# w* i: [
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。7 z& o$ B# C8 ~
$ i& [8 A9 Z2 S0 W. t, }
补充
% N9 K8 V- U! h- W+ m; f& v [2 M4 W程序中d_{a}_{b}格式的变量表示a对b偏导
* M3 P& ^; q2 g/ l! Q" G————————————————# y: W v' B$ u1 E4 k9 D( a
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 d6 v3 Z- B1 r, o# B, v# n原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679542 B! `* |- O* Z, ?0 O
$ x; w) D4 v* }" T4 L( {" v6 I
0 d( G5 Q- ] ?$ ^( o' F! S+ \ |
zan
|