- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566251 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 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 g9 I. l% {( l: G( i6 {' v
# ]8 H5 n: ~# f& f* G" h
背景 e" R4 ]+ I) y) w5 H/ Z9 ^0 {
初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下3 @0 n1 J8 `" d0 I/ V& i9 ~
7 E1 N* S2 ]! v6 R4 M【神经网络分类算法原理详解】
r, u. ?" _3 m, \5 F$ P V+ s4 Z- T- {
注意
# ^2 n: \7 o) f! p站长提供的图片有点小问题,我们更正如下
9 y* J; R" e! S7 r8 K
) Q( p7 G! \- h- Q0 f# a# D* ^
8 B3 N. m. ?% T. l& q1 H
+ L* d9 D, V4 m问题
& `- Q x, m+ b- d8 a. _3 L, g根据上图所示,我们有已知& j% Y" E* V4 j8 m5 _. n/ _
9 y0 Z1 h) _! J; c#输入层
5 l9 X& Q; u+ }' v0 ~/ I9 Ui1=0.05
; B |( T4 n. W& R" _5 U- hi2=0.10 Z# d4 F" |* ?4 a2 S
) g r. m9 x+ R$ j# ^#输出层
: u: J9 _2 a5 o& lo1=0.01
) j: y* S B- V) ~o2=0.99) D2 X9 j1 f/ T) z3 C5 ]) N
这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
3 \+ x7 o d) Q! d- F, m. w1 ?! x7 U o3 t3 J
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1. m2 P$ T7 b" R5 l
. ?7 i# B" o x% g3 V5 l7 X
神经元h2的输入 (hi2)=w3*i1+w4*i2+b1: E$ {3 I& e g; Z
* Q! z% ^$ e' q2 l- D3 p神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出" A0 t9 S0 o2 y$ O0 ^
" U3 q' ?' S* Q% _4 Q
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))
6 K1 Z- M& E4 T
# B: h6 O. C* x. I" u& [# I. E同理
" V2 Z4 S" M% r6 h# [ D' Q0 T$ m2 F9 d
神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))4 z( w# T- Y& H* V
& V g' N5 ^- F7 O; u$ u接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式
u4 A4 N# Q0 q& M
; t2 H1 ~: S# E神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2! J' F z8 q- q5 L2 c
& o- B) p: j% U6 v
神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2" m: n$ k' I! m9 H, K0 M" q8 K
/ K/ ^3 c6 J& K7 C
再经过非线性变换Sigmoid函数得到# i; V: p2 a/ ?2 C
% N/ n$ f3 F8 D
神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
* ^* B- C$ Y( i+ a4 X- T- U6 H* u) t2 Q7 Q& [- T2 I
神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))8 x0 T9 |1 [* A4 v5 Y" |
; ~4 |$ G- G+ v8 A我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为
5 o% E9 O0 m0 A( T- b, e& e2 a- O( Y1 X+ w) q# R0 s8 \5 j1 y4 |% T8 ?
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
1 i O$ B. h: ?* i) i; V
1 l6 z( H5 g7 n* M由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
, L1 R3 D4 D1 o0 \
0 ^: N6 b w; \6 Y学习次数 (learning_time 简写为 lt)我们限定最大为10000次9 ]6 {7 j4 H5 t
# F+ h* G+ J' z; i2 K" z/ O
学习率 (learning_rate 简写为 lr)我们设定为0.5
$ f+ [0 F( g/ A) b5 W& a: H. Y8 x+ S& y" q6 E9 B- W; V* j
依次求解代求参数
: t( o$ A& ]5 t6 ]6 U3 |$ M, |" x
' P9 \8 q( m/ i$ rw1~w8,以及b1,b2, E9 j8 i4 @' V( f& u4 M/ _
" k* T" g6 ]" R- m: T2 B: T' B
跟
! g( L4 F5 V5 J4 p6 @0 P. ?& d, S+ @' x- F( n& u0 Z
损失值 (eo) 的偏导数
6 Z( E: ^. g7 I9 _1 t
, {& e6 }4 l6 g6 w! d再更新该参数,更新公式为$ C' l7 E! k% J
: \3 S8 }6 _% V/ P参数_new=参数-学习率*偏导(eo,参数)
) }+ z. o( j7 e0 M- D1 l; I随后进入下一轮学习
$ A: u% M' C' Y. B! r
w9 w. F* s6 A. u0 x9 ^% i+ [" a+ e2 F终止条件(满足其中一个即可停止训练)
% \, t9 A' ]# I8 ]2 Z8 Z
5 l( v3 H2 W, X9 e1.学习次数达到上限
: v% @1 r% a+ e+ i0 C! C9 z0 ^
! _+ ]4 j9 E% a: w2.损失值达到可容忍的范围
# S' K' V4 {/ I: @0 P! F8 [1 t i- c1 @
导数
4 ], t3 }9 i% n4 @0 T( |: y- Jf(x)=1/(1+e^(-x))的导数是
0 [. e" m+ h* A/ P0 Z. ef'(x)=f(x)*(1-f(x))* O$ `" {7 c7 c
源码/ N A* l5 V; ? @2 G, h& w3 c
import math
3 l/ w2 B6 U+ c1 J9 h* v" @7 d/ Z$ ?0 M5 N. b, M' d
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】
4 l" v5 c- X* ^6 _- n( C) M#网址中图片有误,请看我博文上的图片
3 B0 I. J+ {7 x, }
* V0 X+ k* p: k7 j. N: `4 W. e#输入层6 l- k' r5 v# e; @5 ?
i1=0.053 ]6 b: J& g2 \4 [, H$ w& V
i2=0.1
a2 [) T- w( W#权值参数
! {# G6 ^+ w9 Lw1=0.153 ~. Y" b: x6 Y- w, c5 b% ~
w2=0.28 t3 m7 K2 X% I8 T% s- y% h
w3=0.25
( C) k5 l- H! g( M* Z6 g4 {w4=0.3
: ~# m* E% }, i' a3 aw5=0.4
1 J& N; d Q8 h! v7 o3 K, U( `" iw6=0.45
* x6 _4 \. k# Rw7=0.5# T O3 Y+ { U6 w X) d
w8=0.55
% v/ c) l, E7 T3 L9 C o0 d5 |#输出层标记(即期望值)
0 A2 k+ r; _7 p) n% h3 [7 oo1=0.01
! H! v2 o' ]; c$ b( b* Go2=0.991 F7 \- b# a$ a% }5 b8 ^% r* i
#偏置项参数
8 k n, e9 `# Q; ^b1=0.35
6 u8 X5 {3 _' _5 db2=0.60 g2 E$ S5 s2 N6 P) O2 n* ~: s
/ }" i6 ~1 d% Z" v7 x% }, u
#学习率
/ Q K; j: u+ N0 P; }: Wlr=0.5: e& E2 b2 F5 F; q2 `' T
#学习周期
7 P5 g6 W& x8 M* p& A+ `lt=03 l0 i0 j* r$ R9 N8 s' y1 w% y
max_lt=10000
7 [" N2 o; O9 J3 c" g: D#允许误差
' C2 x7 G/ ?, M# t+ a; C2 xeo_allow=1e-5, L! c5 M1 b' A" a
' q! e0 v3 `: n* f#线性转换4 @) G& R; ^, a5 U) Y, D
def linear(w_one,w_two,i_one,i_two,b):9 ]' Y) ^# v/ @) I7 [3 E
return w_one*i_one+w_two*i_two+b
7 t$ I; x! R s8 j#非线性转换4 R7 a7 T2 W' b# q1 v5 a
def none_linear(i):2 s% r( ]* L# P7 W& e
return 1.0/(1+math.exp(-i))
' \7 v4 L8 o* o$ H5 i2 q: K/ a0 E- e V9 z+ m' b
print("训练开始")
. w; E! o3 P8 J3 S: R1 v#学习周期结束前一直学习
8 R* o" C/ Q; G$ k- jwhile lt<max_lt: r% h6 x# B6 H1 g3 }
lt+=1
/ p% Y, d2 F% c, j; \7 y+ g q/ t5 i #求h1和h2输入值
/ w7 `: x0 P; O; e5 i$ [ hi1=linear(w1,w2,i1,i2,b1)
2 ~- x1 V/ U; c+ g7 i' H hi2=linear(w3,w4,i1,i2,b1)
4 S5 s: E( Z% y- o3 W #求h1和h2输出值8 \$ k3 d5 N' t& p7 P1 H
ho1=none_linear(hi1): N) E* _; `" a6 @/ ], F- `
ho2=none_linear(hi2)
" U2 ^) a& K3 Z0 U$ a #求o1和o2输入值
# q u2 \9 u |4 c# y) r# W oi1=linear(w5,w6,ho1,ho2,b2)
( P) {) j( h% ]9 ]. Z! G oi2=linear(w7,w8,ho1,ho2,b2)
3 L; I$ }9 k, v7 d& V #求o1和o2输出值0 R2 E7 h# [- y6 T) V2 R
oo1=none_linear(oi1)+ F( J- m: i# s4 h' \6 `
oo2=none_linear(oi2)
( ^9 o: [. ` s* z. C9 ?
8 y5 N5 n% \9 X #求当前计算总误差
( u4 p; ~. k4 |& X eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/25 { _2 W+ ^: G: _9 R7 J
print(f"第{lt}次训练,当前计算总误差={eo}"), w, i8 D Z$ ^9 T
#误差已经在允许范围,退出训练- K9 g5 W5 z! {4 E7 ^
if eo<eo_allow:" {4 p: q' E- n$ i
print("误差已经在允许范围,训练结束\n")
, R1 v2 K7 `: @5 @% e3 l6 t break5 V, F0 F4 x8 ~# W$ H( F
#偏导6 [ e; l0 P5 z# U% b. i
d_eo_oo1=oo1-o1; Y& d; h9 o5 y, C( }
d_eo_oo2=oo2-o2) e' X u4 _8 e0 h
d_oo1_oi1=oo1*(1-oo1)
9 K( {" ^) V- e1 A+ _8 a( n d_oo2_oi2=oo2*(1-oo2)
. l' h2 k# g* |* z, T% j9 C6 F d_eo_oi1=d_eo_oo1*d_oo1_oi1
" ?; I- A& A8 `; Q6 F d_eo_oi2=d_eo_oo2*d_oo2_oi2
0 c+ Y; _+ u9 _6 p+ x #求w5_new+ o% R: U: Q- U) b7 A, K z0 ?' {. r
d_oi1_w5=ho1
1 b1 @$ V# k, w% `2 j% X* E" X d_eo_w5=d_eo_oi1*d_oi1_w53 o6 S! a" F/ D) a7 [
w5_new=w5-lr*d_eo_w5
: P" t; F; d8 q1 {' x3 m# m #求w6_new- Z4 {; J- u% @4 {( L
d_oi1_w6=ho2
/ G& D. I* [% m: a Y4 d: H d_eo_w6=d_eo_oi1*d_oi1_w6: k; l! T6 T, A0 U' |- L
w6_new=w6-lr*d_eo_w6
9 I Z" o8 {5 q& q #求w7_new
: V' q I, N8 W* S h$ u# {4 V d_oi2_w7=ho12 f4 U: c' |* V+ l+ H- \
d_eo_w7=d_eo_oi2*d_oi2_w7
9 Y: n9 }' i" l) i w7_new=w7-lr*d_eo_w7
, ~; \7 q3 H% s9 ^* ] #求w8_new
) h+ t* b! i2 g d_oi2_w8=ho2; Z/ r9 i! Q |6 f1 T8 D
d_eo_w8=d_eo_oi2*d_oi2_w8( Z* M- L1 c& l* T) O4 w8 R
w8_new=w8-lr*d_eo_w8
( m$ O! B1 \9 Y+ B; F% G #求b2_new8 A) s7 @! P6 z) W5 O6 ]
d_oi1_b2=1
' j8 A) T5 F/ [" C+ s% P d_oi2_b2=1. x) u. e1 }8 A
d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2
' X3 N L) |& [1 U4 X% C b2_new=b2-lr*d_eo_b27 r' D+ M( c* \- d+ z( V
d_oi1_ho1=w53 x: u7 X5 K3 \- c- |* o3 \/ t
d_oi1_ho2=w6
' C0 i5 g9 d# k- |$ l- z/ A& e d_oi2_ho1=w74 ?2 }. I- r2 T, n+ m: Z' }
d_oi2_ho2=w8' P: E+ w# ?4 [- k* @
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho11 Q# w% g8 S* U
d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
* z( i# _% F* k" e: F d_ho1_hi1=ho1*(1-ho1)1 l, _. e1 A+ w7 Q
d_ho2_hi2=ho2*(1-ho2)- ^0 D3 K, X. g( q( F2 f2 b
d_eo_hi1=d_eo_ho1*d_ho1_hi1
# _: ^0 ?# [3 [ u5 `4 | d_eo_hi2=d_eo_ho2*d_ho2_hi2
( Q& S3 ^$ ]/ i0 O' e" z+ t& H+ C #求w1_new
4 m: K9 u) K2 o9 P1 F$ Y7 W d_hi1_w1=i1
8 }2 s" I' E2 L4 n7 w% r d_eo_w1=d_eo_hi1*d_hi1_w1
, F `! ?9 u ^5 v+ ?) G* T# b w1_new=w1-lr*d_eo_w14 w4 B5 w6 ~8 Y- f
#求w2_new
+ { X7 @ n s4 p: b d_hi1_w2=i2
3 m( b" d! T+ d( x d_eo_w2=d_eo_hi1*d_hi1_w2& s/ w& @/ }7 y5 ?
w2_new=w2-lr*d_eo_w2) | ^1 u. ]; B5 ^& C; \9 N" s
#求w3_new
7 T5 N! v# c) C" F( ? d_hi2_w3=i1
# U- G3 T- o3 \ r, u: Y4 i2 R d_eo_w3=d_eo_hi2*d_hi2_w3- K- u7 {* Z! t3 j! ]
w3_new=w3-lr*d_eo_w3; z: M1 a, S7 c; t L
#求w4_new6 P4 [7 H/ U# J1 h
d_hi2_w4=i2
; z4 C Z4 ^9 x/ z t4 g5 u, ]% K2 P d_eo_w4=d_eo_hi2*d_hi2_w4
+ N! n, L% W) \$ @ w4_new=w4-lr*d_eo_w4
5 N8 [% i* ]& F, s8 z- Q0 i1 e #求b1_new) _% K- F* A$ d3 x; n8 o) f& G, o. t
d_hi1_b1=1) T) x3 i4 S" `- @; |0 A: `( M
d_hi2_b1=16 d* A" D: Y k2 [' b
d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
P; w1 q3 ?7 u* [$ ]& J8 \) j b1_new=b1-lr*d_eo_b1
( b) J9 R# {' u #更新反向传播( o4 p0 @- y2 a4 ?4 L1 l# K' F
w1=w1_new) j# q0 s T, i6 ?% [
w2=w2_new; q% o \7 t# \) \8 j' ~; B
w3=w3_new
. t1 S# F3 Y3 H4 A$ ?) p# F- `# @% G w4=w4_new. [' K" z2 O, d/ t$ [
b1=b1_new0 W3 \. y+ Q) x& _+ D
w5=w5_new
* e3 ?* y3 S, W4 E w6=w6_new/ N, w) ]3 @( w
w7=w7_new$ i+ v i" i% |4 K8 o, m/ ~8 k
w8=w8_new" d* j& x7 Y v4 _; Y# V7 l
b2=b2_new
) | m1 s! t' z) O8 j4 lprint(f"当前计算总误差={eo}")3 W8 \8 f; V2 e# E! G
print(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n")
& e1 K! O4 Z& U3 j/ [1 _& }( rprint(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")
4 r+ V5 x! S2 m& c4 K4 X6 W: P' A8 [print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")6 J6 C& V- J5 Z/ Q/ |* W
8 K4 U% ^: M" X- I" K* y
结果
% @5 q x' t F | b. e/ T$ T8 H$ H; n- F0 _5 I
( x$ f# q% p+ B# }结语
' v; u8 A$ }% D0 ?可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。' [6 w8 n3 [, D4 r
9 L* D+ [/ @; t' {, h4 g
补充) h& A; ]; i+ W
程序中d_{a}_{b}格式的变量表示a对b偏导
1 Q! ~% }1 v$ |————————————————
5 f' Q; x( O* k7 Q# A版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; I' Q( T% {& F8 l5 g4 J
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
" s4 t) v. U5 A, l/ t) C9 Q- F- D4 o' @% b! r5 X* B+ s2 G
9 F }4 Z3 h$ l& T( o( j# R
|
zan
|