- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564444 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174556
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
人工神经网络——反向传播算法初体验(python实现)
, p( K' X. g8 }, y! @+ u
9 M7 F0 f- K( C背景
& k/ t7 b; Q) H; C& q初次接触反向传播算法,根据C语言中文网的站长提供的思路,照着做一遍找一下感觉,其中链接如下
, N7 r/ @& d& n! D U- g B5 k& L. ?$ S) O, U2 {
【神经网络分类算法原理详解】% F+ {2 ?" D/ ?' s5 Q
1 G# v' [; ^ ]/ e* }
注意
4 P5 ?+ C" r( h4 |( Q; N站长提供的图片有点小问题,我们更正如下 j; V# n+ L, b1 X
: U/ G6 J1 h. Z6 h2 p
; t; l4 N/ n1 r+ |2 h1 u) d$ W; ^6 k% s7 W( p
问题
+ v: i" A+ q, }1 L根据上图所示,我们有已知2 v) y9 m: `; L: P
: j2 _: R' ]. L* ^* x( i#输入层$ e# r; h2 ?$ y. H
i1=0.058 ]2 a2 D3 q; V3 u4 [
i2=0.1$ a5 _2 I" o9 V& p
: h: I2 M* E+ s* M1 P
#输出层
' i4 s! ?( F8 r- [5 C8 y; Lo1=0.019 M s8 v4 D8 ?( m8 F# {# |
o2=0.99
- y8 x) { c0 a! c0 p6 ?% @& i这个神经网络是我们假想的,我们假想从输入层[i1,i2]==>>[o1,o2]的过程是这样的
3 w/ }" S+ ~/ s& z/ T" x% K n1 T, k& }- U2 a1 t7 x
神经元h1的输入(h1 input 简写为 hi1)=w1*i1+w2*i2+b1
6 h' C, }4 E: _( g# k0 M2 m
& K) V! u. c- p! O. j& J. b神经元h2的输入 (hi2)=w3*i1+w4*i2+b15 r' f( v1 T8 e" ~/ K
2 T$ }8 x/ T, V: T神经元h1接收到输入后,通过非线性转换函数【这里选择Sigmoid函数】变换得到神经元h1的输出
' m2 y8 F( t5 C0 q3 o/ |# Y( `/ u" I( J; f
神经元h1的输出 (ho1)=1.0/(1+math.exp((-1)*神经元h1的输入))$ y1 }' d' h8 m: V; A1 r. L
5 O u: \$ Z6 }8 h& f
同理( Q+ v6 I9 v9 c9 P, k) w
$ j0 ?7 R% E; l神经元h2的输出 (ho2)=1.0/(1+math.exp((-1)*神经元h2的输入))
- {1 p" ?& Q. l3 v0 @, O9 h3 }6 l0 z8 U/ S, x4 Z
接下来我们再把隐藏层当作输入层,输出层当作隐藏层,类比推出有关神经元o1,神经元o2的一些表达式; |# f V3 q3 o
8 c% T2 s: }' g7 |* j神经元o1的输入 (oi1)=w5*ho1+w6*ho2+b2, A) N: o+ U1 T. L8 w/ N
! i1 h( y* ^* B w+ g0 \; J" ?神经元o2的输入 (oi2)=w7*ho1+w8*ho2+b2
$ E( r0 _4 W5 t/ T/ S4 t. k
4 W9 K: {9 J& S* K/ ]# `; ~4 H3 U再经过非线性变换Sigmoid函数得到
8 Y3 r! p ]8 P7 _$ c8 i# E- p0 `
9 E1 Q/ b5 M) C4 U! H+ W b. g神经元o1的输出 (oo1)=1.0/(1+math.exp((-1)*oi1))
4 \" L' ]! P0 _8 Y
8 l! ]/ O3 p4 u( W9 F; Y- G神经元o2的输出 (oo2)=1.0/(1+math.exp((-1)*oi2))( `: g4 D* w" p: a8 q
# l/ U" e% `% W
我们将得到的神经元o1输出,神经元o2输出跟我们知道的期望值o1,o2进行比对,定义其损失函数为3 S2 m9 l% U q9 V$ S7 E9 k. \
2 Q7 O/ j; K. V3 e: E8 j
损失值 ( error 简写为 eo)=((oo1-o1)^2+(oo2-o2)^2)/2
5 l6 A( t% A3 V+ J7 s- J/ X, m6 u8 j" M, Z
由于我们的期望值精确到小数点后两位,损失函数为平方,所以我们仅需让损失容忍度(eo_allow)调整到1e-5即可满足
, Y0 q3 _* g; J& Z3 J4 U! l" O7 r
- L0 S3 Q& W+ z学习次数 (learning_time 简写为 lt)我们限定最大为10000次
8 O- a' {5 C$ i8 M. l& ]( |' R5 c4 U+ o f$ s. o
学习率 (learning_rate 简写为 lr)我们设定为0.5
- B$ r0 F: `: i1 B0 j& v, {4 c6 |3 w% \2 \
依次求解代求参数3 y. n; t1 K- X0 w" x
8 f4 Y6 d8 a7 e) B( F9 J! u: x7 Hw1~w8,以及b1,b2
5 u& n% X, m$ A5 h4 c' {0 \7 @$ u
6 y1 c* w' [: L' Z* z9 ?. r. p跟
- }: _* ^& L/ Y4 y: _9 X1 Q( T- w3 O- r; \: E8 `1 e! q+ k
损失值 (eo) 的偏导数' b# ^2 h' i7 h# j
- A% n0 \. w" v2 A
再更新该参数,更新公式为
0 H* x* G# ^% ]& X6 k* s; _7 `0 y/ ^; u7 c$ E! l
参数_new=参数-学习率*偏导(eo,参数)
) x7 t* j" Q. H/ f1 r) \+ i6 J" P! K随后进入下一轮学习
, w* n+ q, T* Y1 G
# K @5 O x* a# @/ n9 _) ?终止条件(满足其中一个即可停止训练)
" [# ~) G- W# h2 Z$ c$ i
$ S5 }* N# f, p+ Z1.学习次数达到上限1 J! T+ j3 O3 S( X( E
* Z/ u) s; N' s2.损失值达到可容忍的范围+ S7 X6 O# c# q& W0 J' x, j
: E' c6 X% A& r [% w1 [
导数
, y4 C8 T6 F$ ?+ [0 g" ff(x)=1/(1+e^(-x))的导数是
0 [4 d! o9 ~. p' Q% U; a4 t, N8 ^f'(x)=f(x)*(1-f(x))6 L8 `2 F$ s3 _& b9 E. Q7 `& T
源码, h5 r) C" x. G9 m% u
import math
u, e: Y) |# @' R5 M8 u8 f0 o0 n1 F! G% _" k. m0 G
#参考自网址【http://c.biancheng.net/ml_alg/ann-principle.html】5 n7 S# Q0 n, E2 t3 O2 X1 z
#网址中图片有误,请看我博文上的图片
) L3 [& m% u: o% e4 \4 @# w9 T0 q9 ]: s# a2 c! S0 J9 V
#输入层
0 @' B5 Z, D/ [, [, Vi1=0.053 N: Q! k) f- E" |! f& ^
i2=0.1
& z- l, e; m0 P2 l3 \3 x#权值参数
$ `5 r: }! Q, t3 f3 cw1=0.150 P# `: m1 W% A
w2=0.2. k1 m6 ^" S; n6 m& G& t
w3=0.25
K9 q8 L, w$ Z0 t7 ~+ gw4=0.37 F$ @" G/ A: P6 G8 ]7 @
w5=0.4, o% _& T. N' V; k
w6=0.45
: |8 {) H4 v" Mw7=0.5
! A9 V' n: k4 q+ S" ?7 ]! c6 ?w8=0.55% A, j: n5 M# a& k8 |4 @3 y1 y
#输出层标记(即期望值)3 y2 q5 l3 m* r/ p1 V: h8 Z
o1=0.01
$ S8 Y4 l% M$ I' [o2=0.99' J4 V, w& z9 u; O0 h
#偏置项参数
- s/ O! z2 S+ I7 n) P; ^* F( A1 |b1=0.35. ^7 Z: }5 W7 I2 M" U
b2=0.6. s7 A; P7 u8 ~! p
5 O2 ]( d. s& {& D/ W#学习率3 v0 ]3 a9 f# Q0 j
lr=0.53 Z7 R) a1 e" L6 ~2 _) r/ w
#学习周期% C& l y9 A/ ~( ?7 Y+ q7 n4 X
lt=0
! E% h. f d. w% |$ n% F4 W$ ~0 Amax_lt=10000
; Z, S3 V# C$ n! K#允许误差+ L& }! L1 B a# t' j
eo_allow=1e-5' q- w( m( q* c- @. `0 w- N- F2 f
2 m0 m) k; j1 }. O2 d) s7 A1 ~ O#线性转换! U4 B9 |* {6 H
def linear(w_one,w_two,i_one,i_two,b):$ x* A+ N- }/ t8 Z/ B, d& B
return w_one*i_one+w_two*i_two+b
8 E& ] ~2 ^6 c% y#非线性转换9 z: w, v, u) d, ]4 Z3 _5 L
def none_linear(i):0 k, R% ^" M" S
return 1.0/(1+math.exp(-i)). K' y& @7 B0 f9 M
/ |, f: A! \0 j+ L$ R! O6 Kprint("训练开始")
) `9 c: P; A1 D8 [#学习周期结束前一直学习
% H5 G3 R) C8 i( P- v/ E4 Z; Kwhile lt<max_lt:
2 ]% a7 n4 ]. D8 \' n8 Q8 U lt+=1 d7 Y7 @( U- U/ h+ F% C
#求h1和h2输入值0 H( x/ o* `' c3 p U% x
hi1=linear(w1,w2,i1,i2,b1), m9 A* ~$ m, Q' o% \
hi2=linear(w3,w4,i1,i2,b1)3 u) O1 S1 i6 p; D% |* W" P: R$ E
#求h1和h2输出值
; P. [# k9 k" r6 n' \/ k; d ho1=none_linear(hi1)
3 s1 p! B( c. r" p5 Y k2 x ho2=none_linear(hi2)
6 R- I' n5 V( m" L( o+ L/ Z7 K #求o1和o2输入值' x+ i! O6 q8 p3 z: m1 G: D
oi1=linear(w5,w6,ho1,ho2,b2)
- f, K) D8 B4 s% V2 r/ k" q) \6 | oi2=linear(w7,w8,ho1,ho2,b2)3 X8 r- ^. Y% i) l% o
#求o1和o2输出值
* P L0 M9 w# p" o6 z, s& l9 x" J. T oo1=none_linear(oi1)1 a) U7 c# H1 R' {
oo2=none_linear(oi2)7 X) {2 f" s* L) w0 R( K# B/ T8 w6 r
# Q' \5 T% |! B
#求当前计算总误差
* b9 r' `* m5 _ eo=(math.pow(oo1-o1,2)+math.pow(oo2-o2,2))/2! s* y5 c) e4 u! Y& W9 \/ x. e0 ]
print(f"第{lt}次训练,当前计算总误差={eo}")
0 V4 k5 w b6 b# v: e2 m2 C #误差已经在允许范围,退出训练
& N' k' e( `: h9 [ if eo<eo_allow:) I9 {! C- w# b
print("误差已经在允许范围,训练结束\n")
6 u. s& i! z) T; A+ H break
. {4 Q7 k& A2 U) B, P #偏导, y- C: y9 g7 p3 v( Q$ B
d_eo_oo1=oo1-o1: s3 Y' O; u+ G, i5 C
d_eo_oo2=oo2-o2" M! l, j2 @# y' j
d_oo1_oi1=oo1*(1-oo1)/ ]7 {& o! L/ ?" M2 j
d_oo2_oi2=oo2*(1-oo2)7 g4 }& {1 ~7 }" y
d_eo_oi1=d_eo_oo1*d_oo1_oi14 I6 {7 g- Y p1 j
d_eo_oi2=d_eo_oo2*d_oo2_oi2
# s K% L: [* K7 L$ d. F$ D4 B #求w5_new% M" V& Q" F( b8 i" L0 Q# M
d_oi1_w5=ho1% ~1 T7 h4 e; U# d8 w2 i7 u
d_eo_w5=d_eo_oi1*d_oi1_w5
7 o/ S1 a0 s. \/ A, P w5_new=w5-lr*d_eo_w5
- e& n3 X( F% ` #求w6_new
0 r. R9 ~, f8 {: m, N d_oi1_w6=ho2. {- |+ P( \' u7 k5 ^ z
d_eo_w6=d_eo_oi1*d_oi1_w6; l4 p$ u+ {* f9 z( U
w6_new=w6-lr*d_eo_w6- ~' N: `* o' R* Q( e( ]& ^. Q
#求w7_new5 y. `" C* R$ f% L, i. h; [) Y
d_oi2_w7=ho1" h# T* ~5 C5 o- g! b6 ^: T$ n6 M; L$ \
d_eo_w7=d_eo_oi2*d_oi2_w7 O! F( Z/ J- Y/ I, O! s7 r
w7_new=w7-lr*d_eo_w7
$ t+ j. S; z7 `5 } #求w8_new
# O& y8 ]: p3 V. \( M ? d_oi2_w8=ho2
5 D H$ x/ P/ |; @, y: t d_eo_w8=d_eo_oi2*d_oi2_w8" S0 I: j; V# ]( ]2 c! b
w8_new=w8-lr*d_eo_w81 M( Y6 j2 o9 G# E/ y. n
#求b2_new
" o7 k' q! a3 T d_oi1_b2=1
% f3 G1 s3 R/ D' O: A% p d_oi2_b2=1
h1 y3 h0 f+ C) [3 E% k- N+ B M d_eo_b2=d_eo_oi1*d_oi1_b2+d_eo_oi2*d_oi2_b2* y/ p$ F/ d9 n' L
b2_new=b2-lr*d_eo_b2
; z9 Y2 S0 G `" ~, U d_oi1_ho1=w5
" H4 [& m. F7 g d_oi1_ho2=w6" n L- V* E3 M, t
d_oi2_ho1=w7
+ F8 ~5 W( ?2 m* z d_oi2_ho2=w8; @/ S6 E% D# d. c, f0 E& `, ]
d_eo_ho1=d_eo_oi1*d_oi1_ho1+d_eo_oi2*d_oi2_ho1
: e* G! _, N6 ~: a! s1 J- P d_eo_ho2=d_eo_oi1*d_oi1_ho2+d_eo_oi2*d_oi2_ho2
: F @! J% V2 k. J d_ho1_hi1=ho1*(1-ho1)
! U# s/ y2 ]5 f7 _2 } d_ho2_hi2=ho2*(1-ho2)- T7 z; m/ c% v7 r0 y: C% W
d_eo_hi1=d_eo_ho1*d_ho1_hi1
. ]& ~4 a. n" c2 Q: h$ e d_eo_hi2=d_eo_ho2*d_ho2_hi2
6 Z ?7 C8 n: c( L1 W #求w1_new
, U1 x2 W$ @( D7 A! K# c d_hi1_w1=i1. E$ H- C3 Z: G: s4 u9 m
d_eo_w1=d_eo_hi1*d_hi1_w1
- i2 v! c' `: w5 a3 E3 r w1_new=w1-lr*d_eo_w1, f3 y- y4 p6 O2 Z8 V' n
#求w2_new; n: R& K& I6 L! f; y
d_hi1_w2=i2
8 N& e; i% x/ E d_eo_w2=d_eo_hi1*d_hi1_w2
2 i- D* J, ~7 C. Q w2_new=w2-lr*d_eo_w2
9 p k+ g9 G2 A+ [ #求w3_new
7 X4 w+ T# q/ M* n/ ^+ a8 C u: }8 i d_hi2_w3=i1# t1 L3 [, w, H
d_eo_w3=d_eo_hi2*d_hi2_w3
% h& C( B: M- _4 ~5 g; l' i, `) X! m$ @ w3_new=w3-lr*d_eo_w3% K7 W5 |6 L+ G) H
#求w4_new, q' [# }; I* [0 H3 v
d_hi2_w4=i2
. E W& q* }8 g9 @ d_eo_w4=d_eo_hi2*d_hi2_w49 F) v4 |, F" _. Y0 l
w4_new=w4-lr*d_eo_w4
; {) t3 e* A2 P$ A; B #求b1_new) l6 `1 b2 s* b- r: o( b
d_hi1_b1=1' w9 `% k$ u4 M
d_hi2_b1=1
0 L' l8 }! H- u0 T# ^: P d_eo_b1=d_eo_hi1*d_hi1_b1+d_eo_hi2*d_hi2_b1
: h) n7 |" ^/ J b1_new=b1-lr*d_eo_b1" L) m; i, ^, u5 ?
#更新反向传播
5 V* Z; m& W# i3 s' v w1=w1_new
# Y# l) d: k+ V5 [" E7 }4 S w2=w2_new4 X" c$ h; H" N3 d& u7 |8 t
w3=w3_new
" Q) b$ y0 U/ k w4=w4_new. S+ o4 `. f8 M5 T) y
b1=b1_new& r$ \ f: p7 R# X
w5=w5_new+ m( n3 _( y9 ?4 H8 r) [
w6=w6_new+ g8 w2 @: N$ T3 t# U
w7=w7_new
( j8 T5 J" J5 j S# } w8=w8_new
! B8 S, }8 U* m. k b2=b2_new; Z6 ^$ Q4 [" _
print(f"当前计算总误差={eo}")
) z! [- ~# N' Q3 wprint(f"w1={w1}\nw2={w2}\nw3={w3}\nw4={w4}\nb1={b1}\n") R7 ^! ]* j. N8 k
print(f"w5={w5}\nw6={w6}\nw7={w7}\nw8={w8}\nb2={b2}\n")* T v7 j s7 U; a' b8 Y# z
print(f"期望值:[{o1},{o2}],预测值:[{oo1},{oo2}]")4 [0 c2 j) @; z1 }
% F- U- [" ^0 K. [6 P g8 y
结果
+ j. L! P! j) o$ |
. t5 N1 W. w- t0 H; d: R4 ~( s5 f& C. j, {4 g0 t$ {' v! e
结语9 H3 S3 i$ T& M: u
可以看到,在经过七千多次训练之后,我们找到了一组参数满足我们假想的关系,本次人工神经网络训练完成,反向传播算法体验结果良好。8 ~0 B# n2 b0 h4 M/ c3 s) h- [
) ]2 N7 S7 D3 U" ?) V/ f9 |: Q$ Q/ E
补充4 o; F+ h: d1 h5 e: s
程序中d_{a}_{b}格式的变量表示a对b偏导
/ ?1 @( S% \2 \————————————————
+ c/ F% m5 \0 z. m4 u版权声明:本文为CSDN博主「冰凌呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 h# |7 v/ Y) ?( O0 |
原文链接:https://blog.csdn.net/qq_36694133/article/details/126667954
! Z4 j8 y+ O( t& ?# `$ e7 x5 m4 u- X- V+ }9 m
3 N1 p( E! Y+ e3 A& h# S
|
zan
|