- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565658 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174920
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)% V1 I" [1 Y) R7 u
) ^# s6 s: \, H4 y背景- H) P9 G" R. K9 H+ G' q" F
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
. Z4 O4 ^6 p- Y9 F% w# T* u( }/ Z: E# h3 V3 ~, K
【神经网络分类算法原理详解】2 M1 n9 U" v: v1 K( ^; f
8 v( z; `( x; b8 E* `7 {
注意
) n" b+ r0 _3 S7 q# ^# o站长提供的图片有点小问题,我们更正如下& f1 a9 Q3 T3 T5 o! i- W; @
6 z! g' ~( G; A8 c) u4 p" e$ W% P
- {+ A6 c0 U0 q9 x& P
I8 s/ W* M* a( }$ B; ]# l问题
6 C( T" i. X7 u. [4 ~根据上图所示,我们有已知
. Z R! r4 U8 V: J7 O1 H' G2 p) |
#输入层7 J. _8 L% k: }6 j7 t( Y: ?
i1=0.05% R8 E" W* H4 M; Q6 I, ]6 o
i2=0.1) i& x, Y% ~; m( u8 Q' d
9 s2 G: ]3 [% c2 Y( J' T* g#输出层: M& V. V* q2 g; a, I) p# N
o1=0.01% b) [: \4 C# U* S+ T* I7 D
o2=0.999 [7 y, w5 Y% E# W$ W
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
9 a& C; v" T. W, p) e5 c; ~: v' p* l1 c& [: O8 ?& `! a o
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
% L+ w1 t5 c+ W, ~3 ~; R, {% D; E/ q( m# T {( I) ?$ O
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1$ P0 H4 J- y+ E8 T9 s8 s: {
8 y+ p& h& A( v. o4 ^5 S神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
6 n0 ~7 n+ u6 f/ ]# Z
$ U) s" i2 t# m+ @神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))% @+ i' [( t$ \% X: v) ?
7 P$ K5 q5 i. c( _" O同理5 E8 c3 C! l0 o$ q; D+ }) w. j
% P. x/ Z# O8 T2 i0 n! o神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
/ v$ L: g9 \+ u' H: H
a2 h. g+ `9 x8 N7 M接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式' U, z' d4 h$ X! w3 ~1 i; m8 j9 M
4 f+ e0 G9 t8 \神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2
3 F( Y3 i/ @" o% R$ ~7 s6 C5 d# F! P: K6 O5 d! X) k) o+ K" @
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b28 @- p: F4 Z# g7 @) T5 h
# m" w1 ]. l0 g2 L5 @$ b+ \
再经过非线性变换Sigmoid函数得到2 @5 D5 A: p/ ~
: T- e D+ u8 f1 d' \ F) N神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))+ i! G4 s2 V9 z
D, c1 S" X1 W1 P2 S6 J' P4 r% u
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))
; H, \% F6 g. P+ q2 t9 n
( ^$ L, M+ Y: z8 y我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为1 @0 B7 P1 C- J/ d
, b( }+ `7 I+ @, D8 ~* [
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
5 Q1 t& \/ y7 U v
6 Y+ R3 g! `) K z; F由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
1 h3 Y9 z$ t# W1 f
) B6 D2 w+ E+ X, b7 I学习次数 (learning_time 简写为 lt)我们限定最大为10000次. M+ e5 l/ |- U* f) f8 v. L
5 x9 z6 F' s. U, v% B5 Q' w学习率 (learning_rate 简写为 lr)我们设定为0.5
7 O+ \ l5 J5 v! w: ~9 P( F* N+ ?; S" T
依次求解代求参数
' S e% d3 {; i9 L7 a) A3 k& p; f$ r: i* p4 m) K, V
w1~w8,以及b1,b2
, ]8 `% R9 P% ~/ g: k" D2 O, V1 B8 F: C* c# z& {& G. l( x
跟
3 ]/ m) T- j; _$ t
1 ?: W( L& u& a. X$ u1 e" T损失值 (eo) 的偏导数+ p8 L$ p! ^# r0 H9 v( y! ~
4 f v' L) u' o9 @# v1 {
再更新该参数,更新公式为' W3 J! b6 l. X6 @0 k
F4 l1 C; G' _1 w1 [3 I D! B$ k参数_new=参数-学习率*偏导(eo,参数)# `! f; F: m' h& d8 b- L: f
随后进入下一轮学习
* R2 p8 _* l1 t- W, t2 i( _
: j( F1 ?2 U6 B终止条件(满足其中一个即可停止训练)
& e; K) L. H" ]) C( \4 T5 G, m; U# \9 W3 w3 _! m
1.学习次数达到上限9 n0 }$ t9 H0 j! `% y, L
$ E! K; Z* V. I7 \, k2.损失值达到可容忍的范围
$ F, f$ N% ]1 M! P& @. }" v8 S$ [: e
导数1 E% T7 q8 `3 W
f(x)=1/(1+e^(-x))的导数是
( W$ }3 ^. ~1 E: S# ^, x6 O) y. qf'(x)=f(x)*(1-f(x)): O; O' u( r, A
源码7 N b) y7 ?( I) ^, N. @- J% Y7 ~# {
import math3 M8 Q2 w4 T: o E# d; T
7 d; {& ^" x- @6 X: \# V- m
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
6 m' _6 d) B9 G, a1 w#网址中图片有误,请看我博文上的图片
7 K$ O% h% V% _8 c2 @% s
8 E; v! ]- w6 M- _ m#输入层" z+ o6 {% ]5 @
i1=0.052 G/ w4 G: H- a- ~
i2=0.1/ E, B# q4 m, }; p/ ?
#权值参数. O. T) Z! Z) i+ L6 _8 t4 w
w1=0.153 N5 \+ |% H u+ v& ^+ L+ h$ U
w2=0.2
" W( E- }: T+ i9 \. `3 X2 {w3=0.25
; c# F8 p4 e. J1 jw4=0.3' |" O2 `% p0 o: r# I( Q6 h
w5=0.4# P. E) x& u2 I3 p
w6=0.45
9 @. h3 Z) i L6 q0 T2 Bw7=0.54 A! \! o# w* i# i, B
w8=0.55
4 S- v/ f( c# X4 G/ s! c7 a1 f#输出层标记(即期望值)
$ u8 ]9 t$ _) g2 P8 Bo1=0.01- P. k% w5 i: f8 w7 v% F) k2 `. t
o2=0.99! V4 B- F" z/ D- e0 Y
#偏置项参数
3 z4 \' z4 ~9 G3 ^" I1 m! Ob1=0.35
1 `1 s2 B) M& U& P3 @b2=0.6
% b2 ? m8 Y, Q1 f# U' j% V K6 T# ]1 C/ d2 N$ @; U
#学习率* O& p) A) ]0 h4 l4 W
lr=0.53 ^; I, ?* g2 N. E/ L* @. T1 ]
#学习周期! e+ D% c- v( U2 T
lt=04 D# w+ F8 |6 o. T, A
max_lt=10000/ j7 G) |: }& E$ p
#允许误差
, t7 U2 E# v# R" {eo_allow=1e-5
3 d" L& q/ [- I) _9 E6 n
7 `6 `# f9 G. ^! d0 Y#线性转换. t" g7 d' L" g% ?& @
def linear(w_one,w_two,i_one,i_two,b):/ l+ A ]8 Z+ t7 g" Y2 V
return w_one*i_one+w_two*i_two+b( I' w4 y) O/ J& A/ g- Z- r: N
#非线性转换
7 C2 `% V9 i: R! Sdef none_linear(i):
6 U+ v# y$ I! v& M8 b" Z0 D return 1.0/(1+math.exp(-i))
2 r6 l1 v! U; i0 f; G6 W$ y: F6 V$ o. o+ {% C
print("训练开始")' @5 w% M7 X. d+ L5 V V8 ~
#学习周期结束前一直学习) F8 T6 `2 I5 f( g/ u
while lt<max_lt:9 W' f; M# h W9 v
lt+=1
: z3 U! L8 o+ q: ]6 p% c4 s5 q #求h1和h2输入值3 V$ \0 T" u3 C( U8 L4 x8 s
hi1=linear(w1,w2,i1,i2,b1)! X% i% R! F. S; F. J$ m
hi2=linear(w3,w4,i1,i2,b1)
/ C$ P, H* A; L+ \' V& @ #求h1和h2输出值& f% a- x$ w8 l$ J) b
ho1=none_linear(hi1), j* i8 Z% j# Z7 J; Q' v. M
ho2=none_linear(hi2)' A9 {' ~8 a; i9 J9 M
#求o1和o2输入值
; V) A1 S8 C3 G* K0 G9 r( m oi1=linear(w5,w6,ho1,ho2,b2)
% g3 r, F6 Z8 h' K) Z' k oi2=linear(w7,w8,ho1,ho2,b2)
3 C, S6 q5 G% h0 W6 ]5 v! _! o #求o1和o2输出值; \9 G8 p6 O$ t6 C% V! e0 W6 _+ n
oo1=none_linear(oi1)
: E$ l3 H! z) q0 G5 y8 _1 ~; d3 ? oo2=none_linear(oi2)
# @+ O4 D/ f. Q2 C" |3 q! x
7 z- k+ R6 J* w #求当前计算总误差
2 z+ C9 ^( ]: x6 s2 ? eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/27 j, F" R! Q3 ~3 h1 o
print(f"第{lt}次训练,当前计算总误差={eo}")
+ h$ b2 |9 V) K) R2 Q #误差已经在允许范围,退出训练/ K k! x, j# v! L5 b4 \$ [
if eo<eo_allow:5 L9 P% l3 X' M1 ?6 u0 V% q
print("误差已经在允许范围,训练结束\n"); i- o, b- B) J4 p
break
. T$ }, o) ]4 I' r #偏导
% c% b2 ^- }: T V; W# u5 p' s( a d_eo_oo1=oo1-o1- `9 `! u/ [+ R# _6 o+ R
d_eo_oo2=oo2-o2! Q6 x% _3 ~0 C) M# e
d_oo1_oi1=oo1*(1-oo1)
& F h/ c+ d, l# e X d_oo2_oi2=oo2*(1-oo2)' E2 U s, P9 \9 A. N0 z; ~
d_eo_oi1=d_eo_oo1*d_oo1_oi1
9 P5 q& A- l- @6 s4 t d_eo_oi2=d_eo_oo2*d_oo2_oi2
$ v8 Y5 R* ]) J$ X2 S3 c) l6 F #求w5_new. m* J h) ^8 k" d
d_oi1_w5=ho1
9 \1 l* c, r2 g4 |. t( K, ] d_eo_w5=d_eo_oi1*d_oi1_w5
6 y3 W9 M: i+ ^7 d2 v; z U4 R5 J w5_new=w5-lr*d_eo_w5
9 a9 _2 \) @7 o4 C _' H. b5 P/ e #求w6_new
' W( G& s4 I! @) \# v) b d_oi1_w6=ho2
8 i4 G0 [( l# ] d_eo_w6=d_eo_oi1*d_oi1_w6* s' {& G7 E6 I3 C
w6_new=w6-lr*d_eo_w6
# }2 B6 \3 }, x8 _" R! G #求w7_new
1 X0 s0 ~8 c6 |4 C+ E1 Y d_oi2_w7=ho1! t" w1 N0 N* i$ @6 m. u. U1 H
d_eo_w7=d_eo_oi2*d_oi2_w7
/ l4 |- ^/ l" [ ^$ g, s! b w7_new=w7-lr*d_eo_w7
; Y( u' j0 T1 H3 {# u- g #求w8_new
& t# y, v6 P! b. E" f O d_oi2_w8=ho2* w& Z+ v7 d7 r) l% U% B8 e- B
d_eo_w8=d_eo_oi2*d_oi2_w8( D- |% v4 c* | N3 F
w8_new=w8-lr*d_eo_w8
1 v$ A- Y( i* P& ?8 u4 n #求b2_new6 R- c5 y# k3 ?" |: w9 s; W
d_oi1_b2=1" e) C+ v8 q6 v' e. t' m/ Z
d_oi2_b2=13 ?( y# _* `. |& Y$ m& w' r
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
j/ |( g- e3 l3 Z9 E- x b2_new=b2-lr*d_eo_b2
$ w2 P: p/ _6 |: Q# X1 ]( |% ^6 w d_oi1_ho1=w52 y- v: q6 j3 m) |# N2 ~* D3 L% O
d_oi1_ho2=w66 b. L, ~1 l% M9 \9 v
d_oi2_ho1=w7+ @0 k; H* R, p5 O
d_oi2_ho2=w87 Z% d& {8 L" \/ Q7 n9 c% j! n
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
4 q1 Q; t& w/ ?( H9 a, ^6 O3 H d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
& s3 e! ~- a9 {. v d_ho1_hi1=ho1*(1-ho1)- F, s5 O; | d z3 C
d_ho2_hi2=ho2*(1-ho2)
% K- |$ p" J( A& A7 a d_eo_hi1=d_eo_ho1*d_ho1_hi1 C: @) Y, e, Q
d_eo_hi2=d_eo_ho2*d_ho2_hi2
+ O2 h! N r: v! I5 S #求w1_new" y3 M& s' g" e& K8 k# K! F8 ~1 N3 ?
d_hi1_w1=i1
# @3 T5 ^' y& X# T# `# N3 ?$ C- H d_eo_w1=d_eo_hi1*d_hi1_w1
: l& r |; x( O0 R" l% j, m w1_new=w1-lr*d_eo_w15 d9 ?2 ? v, Q0 h7 K/ [! r
#求w2_new
7 o# m8 @) r$ n: T% G d_hi1_w2=i2" B2 B9 l, Q9 J" u) W
d_eo_w2=d_eo_hi1*d_hi1_w2
4 P! d9 a+ {* W w2_new=w2-lr*d_eo_w2; l. ~! K7 q/ v8 ?- ?; U
#求w3_new! Z9 o: P" l+ e* I. x3 J- y1 I* V
d_hi2_w3=i1
! T% y" d u3 E& P8 J d_eo_w3=d_eo_hi2*d_hi2_w35 h$ e! U: {" h. H) G% D/ f/ w8 e9 ^
w3_new=w3-lr*d_eo_w3
* n9 f6 ]2 N. m3 F' ^( X7 c% ~: U #求w4_new5 g6 l2 c N, h" H% x# l
d_hi2_w4=i2
, q, P- w9 T2 u d_eo_w4=d_eo_hi2*d_hi2_w46 g; \- o0 F, c/ ?
w4_new=w4-lr*d_eo_w4
: @% b" Y b6 Z, B #求b1_new
2 A& H5 Q) d. j0 Z4 y1 F d_hi1_b1=1% F4 Y( i* x- @9 P4 L* N; a. ^
d_hi2_b1=1
! f( F7 m1 K3 t d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1* Y0 d. n/ Y1 P: ~; i
b1_new=b1-lr*d_eo_b1
; x* A8 V }3 i( T" ` i; \ #更新反向传播
- @9 W2 o5 E# ~7 k" l w1=w1_new. L( M r( ~3 V- N$ |, R9 s4 i
w2=w2_new( o$ m- ?, G7 [1 Z9 {4 N. L
w3=w3_new
/ x% N* ~( x" z# b w4=w4_new4 ^8 Y0 [# M( W; F2 Z# D* b2 v2 \
b1=b1_new
, D, f" j/ \2 N/ t* S6 t w5=w5_new
}, \; Q2 p; i9 \3 ~0 d w6=w6_new
" Z: _* M% Y! d; P w7=w7_new
% g6 K& z6 } x* z0 \ w8=w8_new( t4 U6 k8 l0 f) D5 e
b2=b2_new' h' Z' f8 C& u
print(f"当前计算总误差={eo}")3 n' A2 k, w' B" P. [4 H9 v! ]
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
( W& }3 g3 w }: t. m7 P, f% Qprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
8 G' A9 a1 C& ]( o) R3 @+ Vprint(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")& o9 g* y8 W2 D; B" |& B. d. w
& h8 H4 A+ D( A* p3 ]: e
结果
3 v2 M. z3 c6 I4 W- D
) F" b1 ?" C& T) U. N/ S+ [: V
* [. l4 A+ W; h8 ^& M结语
8 M! S4 x- {4 P9 G4 I& o, s可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。
9 J' Q6 W& G6 f' E7 `; Y9 u' s, G- J! F
补充
8 k$ V9 m7 Z. s( K程序中d_{a}_{b}格式的变量表示a对b偏导- c* t3 O7 ~5 d7 s2 v. L
————————————————
- G( {4 T; |" A. t+ G版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& l- |, ?" L6 {& R8 p* ~7 [原文链接:https://blog.csdn.net/qq_36694133/article/details/1266679549 B6 @- h* S$ ~+ `! l
$ d9 G2 p8 t. {- N5 \- }3 ^! T4 P- r& g. [2 Z6 z5 K
|
zan
|