在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563344 点 威望 12 点 阅读权限 255 积分 174226 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
人工神经网络——反向传播算法初体验(python实现)
4 o% ^# p: {4 L 3 s% \$ d, V! M3 F
背景, q) p# O% f5 P# ~
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下* f* B' W. n$ R' n/ k& ~( r' e
& {( d# [9 }' v4 [% A
【神经网络分类算法原理详解】% j6 t: r* C$ L2 f* f
2 W, V8 `4 B# e7 I
注意
8 v2 ]: C2 D* R' }' ^9 L 站长提供的图片有点小问题,我们更正如下
' Z+ H% i0 c8 n; Z
9 D% T h: J" q' g( K Z j
8 Q9 U/ }. T' I+ ~6 ^ 3 ^2 } Y8 v8 K: z) X0 M/ h$ z
问题
7 w( B4 h" z" g$ Y 根据上图所示,我们有已知
! ~$ w+ j1 C- G y
: K# E* p" s! O3 V" A9 u7 S; x4 V #输入层
" J+ @# [* {/ [ i1=0.05 d( a/ ~; O+ D) b& n4 s2 L
i2=0.1
7 h% X: ]( g; M2 F
- N* F. T! H# |8 {9 W8 W3 _ #输出层
+ A* r9 F. ?8 d+ X2 } o1=0.018 s7 ]9 [/ `- O I
o2=0.990 C8 j. ^, M9 ^* e% f
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的3 ~# H5 }: }# N) w3 r
* d4 v. `2 I z
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b15 d; B. o* z% g5 ~- k+ z
! U6 }% N, p% n) G/ {# y: `4 x& n
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1
% w0 k) p1 U$ |/ ?" [
7 D1 E3 F6 R/ {$ L/ S9 f: e. a( V 神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出+ h# r7 R2 ~# V/ f5 R r4 g
C4 }4 D0 Z1 B- w8 I* {1 W3 C- z9 d
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
3 E2 H! e' Q% M' n& j$ X9 B ( \* s! O x1 v, r- M: H0 O
同理
+ H' F% W$ n6 l' N1 n6 `) @
2 ~1 |* @7 [1 D0 h 神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入)): ?- h4 P$ M" U3 m3 D2 d
- R: b0 Y; I9 h5 L c
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
9 S& A# P6 ~/ E- v6 j- A5 S& ?
q5 j+ q' ~4 W( U; D 神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2" w4 j1 h6 S) Y$ X+ U S+ {0 p M
2 d8 r0 x- e! z+ y- {" t0 ?
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2: r7 @4 j- u7 V+ s9 N' E& R: f' ~- D! G
" j) J) N) S6 G, K& q) S 再经过非线性变换Sigmoid函数得到3 ^7 l1 T- M! R) J/ W; c
. o3 G5 @2 C6 ]9 v# w& i
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
# |# H) B: y" O% L; v- A H( T" V # P, Z1 M( P6 n, f
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2)). y& r1 F" w; R2 R% q* ?5 {
2 J0 l. I* P N Q 我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
7 Z. n9 h, v: j6 L : d! T w+ x! k9 R6 c# Y% N" H
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2+ q8 ~, e3 Q9 t/ L
1 G" _5 _1 A/ l' w; t 由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
' x* y+ N- W3 Y4 ~3 [2 f# E
( y8 T5 [# b) g% S0 V( {+ X3 {1 X 学习次数 (learning_time 简写为 lt)我们限定最大为10000次
+ J+ G9 }8 }9 d/ W" p 4 V `- I4 C) W/ T5 W6 D" b4 |
学习率 (learning_rate 简写为 lr)我们设定为0.5
# A; U$ y. ~3 O% M
: w! G% n; w4 N 依次求解代求参数
1 s! ~( p; |6 L: ~# {% i# X, a
6 B$ n; K' \& d5 \ ` w1~w8,以及b1,b2
* f( j6 N. h; C( _( D' p$ R" H7 H
8 g: Z; ~/ X4 M. K1 C3 \ 跟
* R+ @7 f6 `/ A# _0 S2 F ) f6 u y4 |2 K( G7 K
损失值 (eo) 的偏导数
- L& B" B) G& q! s; [
4 C( K0 h2 r/ E' {' E( ^) a/ H% V# j 再更新该参数,更新公式为
1 H7 e+ b& c& }" E
0 N2 L+ p2 o6 ~2 h1 v 参数_new=参数-学习率*偏导(eo,参数)2 E/ x8 O8 X E; p; K: d5 Q3 E% X
随后进入下一轮学习 y' \" h0 g3 m) f, C% h: S
, U* J3 w8 r1 i; g8 @ F- }0 l 终止条件(满足其中一个即可停止训练)3 R$ x. B* E1 s
g% J$ a1 l8 s+ D7 W# D7 |6 ?
1.学习次数达到上限6 V8 O e; ]" m1 F( c
/ H# K/ \) [. t; J4 Y6 ^* S: N1 @. H 2.损失值达到可容忍的范围
2 m# n0 L+ p8 ^. E3 A5 p 8 g( S, H; T" v6 B
导数
2 l$ A6 }+ g1 Y% b- h2 o% m- } f(x)=1/(1+e^(-x))的导数是
& m$ O8 Z) ~6 i f'(x)=f(x)*(1-f(x))
" l. x- Z6 j' T9 ? 源码/ T' p1 r, O4 r% i h
import math' e0 `9 }1 [- [- Y% f1 r! R
. u' K& c I+ `( R
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】2 g7 o5 S& @, ?) B
#网址中图片有误,请看我博文上的图片
; B- e( x' ?8 a C, F% }
- e8 H0 G- ]9 I, } #输入层# o. B& h4 a# a( g
i1=0.05 w% B% e9 F- D' l& D
i2=0.15 V* S# {) U8 |# I- d$ E a6 D4 X
#权值参数
7 Y X8 {% v7 K0 y w1=0.15
& g( h3 M k+ P8 x8 \* {( ? w2=0.2
/ Q( p) L( M! Z+ B: z1 v w3=0.251 N1 d' v& y) c% O
w4=0.3
" v8 i- t- V+ ]2 Q$ ~0 H. T/ q) K w5=0.4
( N( e8 O# C5 M. b; t! ^! C w6=0.45
/ K8 V) m5 \5 |4 m0 {2 L w7=0.5
1 H$ q8 |, l3 I w8=0.55
1 p6 ^; C+ |& x5 } #输出层标记(即期望值)$ `0 l* h% ?8 I( I* u
o1=0.01, }, e/ C) K5 q" c7 F3 {
o2=0.99
& F: ~9 O0 v" J3 ^: x3 H7 G #偏置项参数
4 [1 k% q- M" K2 p) Z7 [ b1=0.35; q+ b3 O, v- _' c5 m
b2=0.6( X4 m4 N Y% `: N0 k; m1 _
6 f6 Z1 R5 d) w3 y #学习率6 J& m- d; k+ t2 ?# _/ [
lr=0.5
: e/ _5 N! l% M/ | #学习周期
4 y9 L0 \. F A8 l lt=0
& g5 U) Q+ G v; c max_lt=10000
& K. Q: A# q, L8 P2 W #允许误差
( M/ i% x$ y" g& ^5 I! [' Z3 X eo_allow=1e-5
" V- x6 C& e3 u9 ]9 u7 _1 _ 0 L4 k T1 E- R3 q
#线性转换, _7 w9 i) @- O" f! y( s! l
def linear(w_one,w_two,i_one,i_two,b):* [6 X9 L7 b% h# ]; D
return w_one*i_one+w_two*i_two+b
3 V" y3 ?- g; z# k% y# d! N #非线性转换" F0 f/ j7 }6 R# e9 p" M
def none_linear(i):
! ?1 h' }% h: H, \. j6 j0 y& ]/ Y return 1.0/(1+math.exp(-i))
* K+ z. |8 ]9 q4 g 7 t1 Q+ `9 P6 `% m/ y7 d4 f
print("训练开始")" {9 q; e2 Z: i) p
#学习周期结束前一直学习1 w+ u' ^% X! }- f0 D$ G0 P
while lt<max_lt:7 m$ E( G2 F! f, B4 D
lt+=1
% z" w% S$ Z( ] z #求h1和h2输入值; _- ^) g1 @2 H2 F+ y l
hi1=linear(w1,w2,i1,i2,b1); L$ z3 M) _9 U D
hi2=linear(w3,w4,i1,i2,b1)- n% Q$ C/ M K/ ^( s% G
#求h1和h2输出值
0 Q* C5 T9 z+ T0 ~# A0 `0 ? ho1=none_linear(hi1)9 `; h. Z9 t' s- g# T) p
ho2=none_linear(hi2)
: `) r' d$ L- C2 ~- ~$ A+ \6 _ #求o1和o2输入值! L4 k) A9 D% ?- N( ^! }1 q5 l
oi1=linear(w5,w6,ho1,ho2,b2)
4 _- \/ V- U' y6 @& a2 I, T; w oi2=linear(w7,w8,ho1,ho2,b2)
4 a9 v* o4 H: C5 ]# ^( \ #求o1和o2输出值( k5 {( r! `, e) k( m3 C6 Z' Q
oo1=none_linear(oi1)
0 d- h( S" J" {/ Z) Q oo2=none_linear(oi2)1 s4 m9 E: Q1 E) }# W3 i- M6 C
- O( y6 a' u6 q: b) j: v8 s# y
#求当前计算总误差
' V9 j# v/ D3 ~8 n. G/ w+ R- H eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2: H5 H* I) p/ ^
print(f"第{lt}次训练,当前计算总误差={eo}")
4 t. }# [, @) H: y #误差已经在允许范围,退出训练
" ? g/ C; {! K6 ~ if eo<eo_allow:
# X$ H5 V3 v1 Z* p# G print("误差已经在允许范围,训练结束\n")
8 b7 N( [6 E: A1 P. g# A6 w break# N- h* r/ X5 R2 C. }
#偏导) N/ e1 ~# X( R
d_eo_oo1=oo1-o1
4 [& G' k( h7 y5 n; i4 P# ~ d_eo_oo2=oo2-o2( \6 P. g, b3 r- M
d_oo1_oi1=oo1*(1-oo1)4 u( }3 o' N) L! h
d_oo2_oi2=oo2*(1-oo2)4 A( h. T5 s' P$ F( V! N& e
d_eo_oi1=d_eo_oo1*d_oo1_oi1
, w6 W. v" p$ } d_eo_oi2=d_eo_oo2*d_oo2_oi2
4 n# m9 L/ L' b' Y' U #求w5_new
# R. _1 ?7 P0 z( L* P; c d_oi1_w5=ho1
^& Y) O, C1 ^* t- n d_eo_w5=d_eo_oi1*d_oi1_w5* ^$ X9 L$ t- K4 `
w5_new=w5-lr*d_eo_w5) Y# ]# a# Y. Q$ ?' ~& T* M! N1 Y
#求w6_new! O" B- k& x0 U; S
d_oi1_w6=ho21 Z7 E, d* L$ h S
d_eo_w6=d_eo_oi1*d_oi1_w67 ?: |* @& \# B
w6_new=w6-lr*d_eo_w6) o% o! M2 C( p: X4 `
#求w7_new
5 q+ Q3 g3 x. \9 H0 Y d_oi2_w7=ho1
* l1 f1 J( @: P5 P! p d_eo_w7=d_eo_oi2*d_oi2_w78 k Z% @" z: ~, A, e: L, a
w7_new=w7-lr*d_eo_w7
* w/ R. `. T6 L n1 A; O8 Q( F #求w8_new* p- g& ~ ]1 A+ a1 a
d_oi2_w8=ho2
J& V: s( j: O3 `8 U, B& V# K# t$ o+ l! w d_eo_w8=d_eo_oi2*d_oi2_w8! U. n' z5 A0 Z0 M" D& y
w8_new=w8-lr*d_eo_w82 u6 j# o3 e3 z3 O6 i
#求b2_new+ Q" `, u- R" o5 z" R+ M
d_oi1_b2=1
1 }8 R$ j/ k) u% J d_oi2_b2=1
! V& f" M2 A9 U, _8 I d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b24 w) s7 J& a) S
b2_new=b2-lr*d_eo_b2: s- j1 w' }7 \' o8 S( t+ Z
d_oi1_ho1=w58 M) M. ]8 e" r7 Z1 x% U! O( t# Y
d_oi1_ho2=w6( _/ H* c; {. Z+ w7 x
d_oi2_ho1=w7, [( B5 s! d1 |" R
d_oi2_ho2=w86 J3 ~8 W# `' |/ H
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1* [1 p6 e; V2 C! ]! V" x
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2* T4 Y' `5 Y$ M. n8 W7 d8 \
d_ho1_hi1=ho1*(1-ho1)
6 K; _* F$ G! z8 \+ a3 p8 @. l d_ho2_hi2=ho2*(1-ho2)
& q* I1 y) N6 |: s# { d_eo_hi1=d_eo_ho1*d_ho1_hi1
# s4 w# B8 R$ e- _7 y d_eo_hi2=d_eo_ho2*d_ho2_hi2
" c2 Y2 U# v) u% A' I* u #求w1_new
- N7 m) G, e+ D% h7 @1 Z& p. S d_hi1_w1=i1
5 C1 G. d! x7 o6 W- W! G d_eo_w1=d_eo_hi1*d_hi1_w14 o& T5 v/ Z4 z3 \: n. n- H
w1_new=w1-lr*d_eo_w1
* L6 h, r. s& X6 E #求w2_new
3 z6 j4 P3 X! Q% [ d_hi1_w2=i27 }) q2 |. a$ M3 ^8 X6 c3 _+ j
d_eo_w2=d_eo_hi1*d_hi1_w2
0 B4 s( f# n+ R2 {4 e5 A3 ^ w2_new=w2-lr*d_eo_w2
. ?. z9 ~7 R0 `8 B+ E. j6 |5 T #求w3_new+ q1 N, e1 @- _# X* `% V9 G
d_hi2_w3=i1" i5 |* d, y& Y/ X" Z
d_eo_w3=d_eo_hi2*d_hi2_w3 y5 I. X a1 c8 G) M0 n& c
w3_new=w3-lr*d_eo_w3 I$ I+ Q' j. d5 y. e+ E, R- ]
#求w4_new) N0 W8 e; _$ k
d_hi2_w4=i2
$ ~3 o) S: r. a! q# } d_eo_w4=d_eo_hi2*d_hi2_w4* B+ X+ [. V% k
w4_new=w4-lr*d_eo_w4
4 _! i0 O h' L7 ` #求b1_new/ \! }) ]6 m0 k
d_hi1_b1=1% |* a# p% F; z2 ^- ]* g
d_hi2_b1=1
/ p* ?* o7 z! R d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
: w& j# T' F4 b S/ V b1_new=b1-lr*d_eo_b1/ g* h1 n# m; X" \6 v5 D
#更新反向传播9 W2 w! z- A/ e; D, C7 }7 @
w1=w1_new: x4 s0 U9 E& \7 D) s4 G
w2=w2_new3 A2 ^- F- V2 y0 D5 N/ q5 ?
w3=w3_new/ u" O! T% g, Q$ e) Q
w4=w4_new L5 @% Y& G) v* ], p9 |
b1=b1_new- Z. X1 M6 V o% m6 o
w5=w5_new, h$ M- O0 ]" V3 O% J9 m* Z* K2 u
w6=w6_new
/ \" x9 P/ ~* ]& W* N2 ~% V7 e& g w7=w7_new5 Q! b- |; x1 x+ j2 E; m
w8=w8_new
' m) c. A g/ y1 U2 L8 q/ b b2=b2_new
K$ ^- Y) F9 Q- P1 m: X* t8 e' W5 { print(f"当前计算总误差={eo}")
! _! v! w$ _# F print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
6 Q/ E v; w$ Y* q; y) j& h& D8 F print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
- v0 H+ E# S% r- M6 D- U print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")) r3 R1 C8 [+ {, e. a& w9 F% U# Z4 w( |
; V9 p8 L3 P: \+ {4 y+ U* v
结果0 H0 q8 v/ w O
, Q4 e- k" {# c- p$ C8 X
+ \, f7 z/ V5 }3 O3 n6 v, O" c) P 结语
- z& K" m9 u: [ 可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
- X5 ?8 s/ L7 Z' G6 n+ _
9 m3 }& S: s; `, ~4 G2 D' F+ e 补充
8 v- l* K& i7 S2 [- E 程序中d_{a}_{b}格式的变量表示a对b偏导, Y) s& u' f/ P6 P3 z5 x& p! ?0 l- ]
————————————————4 ?3 b. z+ ?8 i
版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 Y$ p& G4 ~3 e7 P% Y+ z
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
1 H! F. j4 C# J2 e' h7 {1 f$ s& c, f 7 }2 I4 Q& B9 I8 f+ w
4 w" q7 S* G$ v$ f: [- [
zan