- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565671 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174924
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现) }' @, N2 a% |0 s$ R
6 U, M" r- y' f. g
背景6 y( s" i, G- o
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下5 J5 x1 W* e; I. Z0 S
7 C1 T5 X* ]* N% A4 {+ Z
【神经网络分类算法原理详解】
; ]2 _& _5 k: C, m8 \" \. N7 X5 C- o4 Z, M u. l( a) ~' Z
注意8 [# f! t$ D" {
站长提供的图片有点小问题,我们更正如下
8 I" W/ k5 H# K' l) ^* v/ S
6 b& i. ~1 k; U9 [4 F" Y2 j i4 T
& S) V+ O1 Y1 f" n: Q问题
$ e/ |$ O: k* p5 B% g根据上图所示,我们有已知 g) @0 ] \: P; ?1 F1 ^! ?
! l% c3 i5 X! Z# E
#输入层
5 J* b9 E* {1 Hi1=0.05
% @3 k0 U: ~' H# Z B/ R6 Ai2=0.1
- t2 m/ \; g4 C8 l3 Z1 z4 T" d
# y1 L- E' i+ g1 l0 M8 }#输出层/ @; A5 \2 a2 e$ U, K
o1=0.010 X6 D, ]6 I* h- E* V
o2=0.99
7 m4 K" E- w' a; c这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的 U' W! Z4 `, n
# @" Q; ~: P" t/ ?0 H7 I2 w神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
6 B5 M* N3 P7 I/ k1 U0 S" {- E& J5 O9 x7 f! h# G) C* ^- s2 \
神经元h2的输入 (hi2)=w3*i1+w4*i2+b14 E; X- y) g% W- {
5 y. I1 S( C2 A2 N神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
( Y2 Q$ m( V6 W; i/ O* Y) ~
) L2 k i U; Y, W4 d神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
- H+ ]2 R9 f% F. @5 b* }& I# }8 a1 W! s) t6 t I
同理
- \$ Y+ z D' P l7 d
C# Z) |' d$ ~. L: X4 k( U神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
- @* E5 ?( I! ~2 u5 I$ N
) R/ o7 G+ j5 W5 w接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
, D+ W% z2 j8 f. p+ E: d* b2 L7 o h% `: g- Z9 J
神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2% ~" Y6 v# ^9 J1 V3 ~4 E
. x4 d9 m+ b4 v8 \" C4 |
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2* u3 W& |! y+ C6 X1 E1 ]$ C( r1 C
' J! L8 c4 t. z+ U6 O再经过非线性变换Sigmoid函数得到
4 C" c2 N2 `: {% a! P/ A: Z% S: W( a0 w' D7 D% x4 O" e
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))0 o1 L3 }( `" ?
: N; q* Z4 z6 n% R* n$ X7 C3 W神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
0 b4 c- {- }# B, v' n' }$ [3 k7 v `: ?
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为* w9 k4 g5 ^2 W8 u* `
' i/ q p- J5 D
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
- J+ q* E% c$ [9 G; N+ p$ j
$ T; }0 `+ j4 l6 l* G! l由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足; f. h/ Y! A4 }. l8 X5 i; g
6 t( B! a @ H+ o+ L
学习次数 (learning_time 简写为 lt)我们限定最大为10000次
u* e& ?- X' ?1 S" r# D3 d M! W1 e- u
学习率 (learning_rate 简写为 lr)我们设定为0.5( ]$ L. L1 R0 ~. x9 o
1 y3 s# U2 B! ^+ @, I& d3 [
依次求解代求参数 `9 }7 l$ i2 e0 O7 s
/ @- p" U8 M+ U: q* n* dw1~w8,以及b1,b2
5 w- |, I! M. |" n t: n9 s( c
跟+ n# H$ G: r+ @; O
o. N9 j8 M# L1 |3 B& |, A
损失值 (eo) 的偏导数
# E/ Z# `7 e( [1 \' U( Q" s! A7 m! f* ?, k* m A/ x$ j
再更新该参数,更新公式为+ Y5 I% a S) D; B! E4 {+ b
0 j$ R1 Z( T9 N: a% }3 X6 X; g参数_new=参数-学习率*偏导(eo,参数)7 k9 S3 u! r9 t6 k e$ |5 l2 X$ ^
随后进入下一轮学习' @% ^: W E9 A$ |+ M) d4 R
5 L t3 P9 ~& V4 W/ {+ K8 C! F c" _& s
终止条件(满足其中一个即可停止训练)
% `8 q) l4 w* I; _% k, T) W' x9 b" P( v
1.学习次数达到上限
/ o2 C3 L: u. Y+ m* \$ K
, e0 m' o& N0 R8 u+ R& _) D; Y2 |3 t2.损失值达到可容忍的范围
' ]2 t! c# x) ^. q3 `3 a& K+ D
: f. v& C8 @* v0 p导数! v. W: n; e& `4 C3 q( \7 T. g
f(x)=1/(1+e^(-x))的导数是
\# ?2 m i" v. Af'(x)=f(x)*(1-f(x))
- Y- X' W! q8 k! A* f) W4 @源码, q* p, _; o( m3 S9 X' x* o
import math
. J/ f1 [" `+ Y4 w7 Q4 i! K" |7 h! Y4 o# o" V
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
1 ~( n3 [) p0 p; B#网址中图片有误,请看我博文上的图片. H8 o' L* s( K1 x
( h& u$ _' w! \0 b0 K+ W( b2 U% D
#输入层% z- A2 Y4 h6 E5 n. J, Q# i
i1=0.05
' u8 k& ]; n8 I7 k" k5 Qi2=0.10 _. |: {/ s9 F" L5 b$ l( x
#权值参数7 f9 r/ k1 y. `" w
w1=0.154 j8 \, w5 _& p
w2=0.2
w) g6 }4 e0 B+ s. aw3=0.250 B8 _/ q2 z5 D* K5 [! n9 @% w. z
w4=0.3
1 K( ^2 g) d+ Q' v+ Pw5=0.4* I1 t0 f8 z; v% P
w6=0.45
/ a& l4 N3 K8 Iw7=0.5
" J3 \8 k0 P$ n+ S" a% W7 Aw8=0.555 L0 v& o6 D) _& E
#输出层标记(即期望值) J4 K5 r c+ b
o1=0.013 w% x2 _- {' f4 b7 P l# }! j
o2=0.99 C) V. y2 `! v9 t3 w
#偏置项参数7 T$ ]- L0 p) M f: F) m. I
b1=0.355 W' ~# _* i# O% J5 b( h
b2=0.6
! ?3 Z- C. f0 S4 W+ e; y; r5 p6 ^; I7 w/ J* G/ o( b, `1 |* E
#学习率
5 J- A2 R' m4 E3 f& q+ Y: o+ L9 Klr=0.5
* _; {* ~6 a1 \. T6 j6 z#学习周期
( ^. y/ w/ o0 [! tlt=08 s7 O D. t# [. Q4 ]1 O
max_lt=10000
, V$ N4 Q6 |' @& T9 p9 B#允许误差
5 l/ f* i$ | I- n. w* aeo_allow=1e-5
/ z& b" Z: c1 O) z" [" \- ^- D' @! A6 Y# ?; w
#线性转换
1 Z/ I: C" U* Hdef linear(w_one,w_two,i_one,i_two,b):5 @- T B o9 }) O/ n& A9 s
return w_one*i_one+w_two*i_two+b4 e) D1 x: k) _. f2 u8 o
#非线性转换
* X% R s# Z6 }4 ddef none_linear(i):$ _9 _7 P9 z: A, q& x
return 1.0/(1+math.exp(-i))
2 f; U# \3 L8 F+ }+ C' |: e) }* {' W0 I0 i9 e, S6 z- E; e
print("训练开始")
, I' F( q* @ L. P# \#学习周期结束前一直学习
! t; g3 \9 t- T6 R- |& [while lt<max_lt:2 k8 ^9 F$ T0 w5 C/ T* O
lt+=1
+ b2 A. m0 U V9 S! S #求h1和h2输入值
2 P8 E( `; l4 C2 \8 N hi1=linear(w1,w2,i1,i2,b1)
8 F! k7 V2 u% q3 ~3 }, H! R hi2=linear(w3,w4,i1,i2,b1) o# w* m5 G: H
#求h1和h2输出值, M" _& m! W: z4 b4 L% \4 A* k
ho1=none_linear(hi1)
% w9 {' p+ }8 m2 @, A) f& _ ho2=none_linear(hi2)
) [! Q! v6 s1 g: v #求o1和o2输入值( W; R; |0 F8 {$ `, e
oi1=linear(w5,w6,ho1,ho2,b2)' C5 y- Y# l8 ~1 |- b4 X( T
oi2=linear(w7,w8,ho1,ho2,b2)
: I# P: l1 a/ p" b+ g& N #求o1和o2输出值2 [. E1 a3 f; C' U; ]2 [. e: r
oo1=none_linear(oi1)9 f1 ^5 Z* U7 p2 w& j
oo2=none_linear(oi2)
( }/ B) E, i3 _2 F5 C
) \3 y# @, Y0 Y' ]. _ #求当前计算总误差: b2 i7 w! D1 R# u; T) d& u6 y
eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2
2 Z0 m) T, w6 C2 }4 p print(f"第{lt}次训练,当前计算总误差={eo}")
0 T5 }) l' U8 Y1 z E# S4 J #误差已经在允许范围,退出训练. p- `; W0 q8 L9 L& T# {
if eo<eo_allow:5 `; k: ]2 c+ g7 f( {* V4 g$ b& v
print("误差已经在允许范围,训练结束\n")3 k$ x2 F8 |& D' e& v9 K- \0 ?; E
break/ [. ?3 j) b8 ^' |' S8 l/ j
#偏导
3 U" ]' I8 ~2 y6 b4 M1 a( X q d_eo_oo1=oo1-o1
+ G/ E7 D" \. j& i# ^3 g d_eo_oo2=oo2-o2
" o2 d* H# d% w; I d_oo1_oi1=oo1*(1-oo1)+ y; t5 F/ T# D/ o2 z) x
d_oo2_oi2=oo2*(1-oo2)
: z5 t- {$ s5 r4 B% d6 c6 l d_eo_oi1=d_eo_oo1*d_oo1_oi1: t, s! r" C' G7 m
d_eo_oi2=d_eo_oo2*d_oo2_oi2
- d8 @+ Q: j8 C #求w5_new
) }) s1 [0 Z9 [3 I. W d_oi1_w5=ho1
2 Q$ F) `( c$ W; q7 {/ _( X: O d_eo_w5=d_eo_oi1*d_oi1_w5
. z! [7 h, \6 o! S w5_new=w5-lr*d_eo_w58 f' C; b2 Z, k9 a7 c3 T. }
#求w6_new
; }5 |9 G, T* j# J3 m( V6 g d_oi1_w6=ho2
/ S1 J" g1 x+ ]6 j d_eo_w6=d_eo_oi1*d_oi1_w6
6 l6 T& \3 r) R1 U" H7 `/ @; `7 s w6_new=w6-lr*d_eo_w6! I* D/ C4 @6 n0 `
#求w7_new
; q4 I3 L3 g( F- }6 m, a$ ~0 ] d_oi2_w7=ho1
( f8 z1 {3 V# T' Z# X" V d_eo_w7=d_eo_oi2*d_oi2_w75 ?- C3 u4 c1 f1 c5 [
w7_new=w7-lr*d_eo_w76 A0 S& d1 H4 B, s% |% M
#求w8_new
5 w+ ?# _, A$ k d_oi2_w8=ho2
0 p8 ]: U! |. J: A" y/ n d_eo_w8=d_eo_oi2*d_oi2_w8
7 ?. F4 i9 r4 { w8_new=w8-lr*d_eo_w8
* b6 P% W; u: q' F* O #求b2_new, r' `$ Q& r' p4 z0 X$ }
d_oi1_b2=15 ^; _7 r' K. K
d_oi2_b2=17 ?0 n+ l9 C7 @$ p3 I* D- M& Y3 l9 o
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2- J' k* o( [6 k
b2_new=b2-lr*d_eo_b2
7 J* j8 K$ [7 |5 {, S: D$ f d_oi1_ho1=w53 I( \; {/ M; c
d_oi1_ho2=w66 j+ y J- K/ K
d_oi2_ho1=w7
9 C) e/ |7 V5 X; Z d_oi2_ho2=w8
$ O; E6 Z; I/ x/ B- z+ U6 d4 ~ d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
6 ^) M1 Y" K3 [& V* [ d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2* H, y2 d1 ]( ^: \% `5 G
d_ho1_hi1=ho1*(1-ho1)5 I- p0 r+ s# b6 X& L
d_ho2_hi2=ho2*(1-ho2)
# u# O) j& E5 @4 n5 _ d_eo_hi1=d_eo_ho1*d_ho1_hi1
# {' p( B" l. y, @" U9 ?$ Q/ {6 o# x d_eo_hi2=d_eo_ho2*d_ho2_hi2
3 R6 c' ^/ d' z. O% C! { #求w1_new! E, j% `, j/ ~7 U+ z
d_hi1_w1=i1- l r; r$ n* U8 ^3 x4 V" }
d_eo_w1=d_eo_hi1*d_hi1_w1( x7 e# @$ J# n
w1_new=w1-lr*d_eo_w1
! W! C- ~& N! N2 n) V! c+ W #求w2_new
q v9 g" r# H" C; q0 h d_hi1_w2=i2
0 x! R7 }' H/ F z1 T d_eo_w2=d_eo_hi1*d_hi1_w2( ~; V y; R+ d9 g& X9 y5 E' s
w2_new=w2-lr*d_eo_w2) L6 H! {. f9 a$ L/ i. L- X
#求w3_new
, p' g6 X! A( m d_hi2_w3=i1
! x* `$ @. Q" A" j' M% u d_eo_w3=d_eo_hi2*d_hi2_w3
0 r( M+ u7 K# c9 Q0 \' s- Z w3_new=w3-lr*d_eo_w3
: p+ c- n9 d! c1 @* h #求w4_new7 G8 X1 Z. d$ v( B% a
d_hi2_w4=i2
3 V; Y Y9 M: c- C6 P- y d_eo_w4=d_eo_hi2*d_hi2_w4+ g2 U3 y, K0 S
w4_new=w4-lr*d_eo_w4
5 A: D, q3 w2 ?+ |5 f #求b1_new( t! p7 T. }4 r* k/ G
d_hi1_b1=18 v4 G2 r/ q$ h+ s( _- h. A6 [2 w
d_hi2_b1=16 |% ^$ z. A) S( e% n/ }$ c1 c
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
+ {% u* j/ Q5 w' H; K b1_new=b1-lr*d_eo_b1
! I `1 O% M5 S2 N #更新反向传播& J( c1 q* ]+ D. w K; x: S' l
w1=w1_new
; i! \$ P7 Q2 R _ w2=w2_new% D0 O% w+ N4 ~# h6 C
w3=w3_new
% m$ i9 s) p8 S. H w4=w4_new
8 a; D' O1 |0 P" X1 y b1=b1_new
6 M7 A, Y+ |/ ~ w5=w5_new' T; `# f* w( C
w6=w6_new( a4 [; n- s+ [# q \8 o* Q2 L
w7=w7_new
+ V% J! j# G0 _9 U. z w8=w8_new
6 q( [' _5 R H& O9 U b2=b2_new
d, q) H4 d# A! J6 iprint(f"当前计算总误差={eo}")% r8 ]% N* E! |- v. h# Q
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
9 D w" p5 p$ Sprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")4 v9 E; `0 ] n4 F8 p/ h
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")
9 d9 O# j. `& {+ H4 W9 @; U
6 g ~8 g W) K" j5 }" X3 ~结果
' |; B1 i) L/ e' l; @8 G+ G7 k9 V1 Y4 k3 [
9 v, I- t/ l, h$ f/ J9 |$ X
结语% O; v: m H7 {% u7 [8 @
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
+ v. z( {) y7 ~, i( T3 O4 y4 M' ?8 D I' Q# _
补充
& y6 R- B0 {- D, j5 h' ]% g* Z程序中d_{a}_{b}格式的变量表示a对b偏导
3 C1 P- k9 \: w$ C. M+ t————————————————. M: r' N5 H( l8 k, P
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 T2 C2 l0 a6 G! I3 T c原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954. ?% I" `2 `, g) V
* i, e: F9 L. w* U! x" I2 t
; N8 H. p/ Z5 Y3 G" d" c% h |
zan
|