零基础入门深度学习(3) - 神经网络和反向传播算法

  • 格式:pdf
  • 大小:2.15 MB
  • 文档页数:15

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算一个神经元的输出的方法和计算一个感知器的输出是一样的。假设神经元的输入是向量sigmoid函数,则其输出:

sigmoid函数的导数是:

神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个

我们可以发现它的规则包括:

神经元按照层来布局。最左边的层叫做输入层,负责接收输入数据;最右边的层叫输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的。

同一层的神经元之间没有连接。

如上图,输入层有三个节点,我们将其依次编号为1、2、3;隐藏层的4个节点,编号依次为4、5、6、7;最后输出层的两个节点编号为8、9。因为我们这个神经网络是全连接网络,所以可以看到每个节点都和

和输入层的三个节点1、2、3之间都有连接,其连接上的权重分别为

则每一层的输出向量的计算可以表示为:

首先,我们根据上一节介绍的算法,用样本的特征,计算出神经网络中每个隐藏层节点的输出然后,我们按照下面的方法计算出每个节点的误差项:

观察上图,我们发现权重仅能通过影响节点的输入值影响网络的其它部分,设

如上图,可以分解出5个领域对象来实现神经网络:

Network 神经网络对象,提供API接口。它由若干层对象组成以及连接对象组成。

Layer 层对象,由多个节点组成。

Node 节点对象计算和记录节点自身的信息(比如输出值

7.'''

8.s e l f.u p s t r e a m_n o d e=u p s t r e a m_n o d e

9.s e l f.d o w n s t r e a m_n o d e=d o w n s t r e a m_n o d e

10.s e l f.w e i g h t=r a n d o m.u n i f o r m(-0.1,0.1)

11.s e l f.g r a d i e n t=0.0

12.

13.d e f c a l c_g r a d i e n t(s e l f):

14.'''

15.计算梯度

16.'''

17.s e l f.g r a d i e n t=s e l f.d o w n s t r e a m_n o d e.d e l t a*s e l f.u p s t r e a m_n o d e.o u t p u t

18.

19.d e f g e t_g r a d i e n t(s e l f):

20.'''

21.获取当前的梯度

22.'''

23.r e t u r n s e l f.g r a d i e n t

24.

25.d e f u p d a t e_w e i g h t(s e l f,r a t e):

26.'''

27.根据梯度下降算法更新权重

28.'''

29.s e l f.c a l c_g r a d i e n t()

30.s e l f.w e i g h t+=r a t e*s e l f.g r a d i e n t

31.

32.d e f__s t r__(s e l f):

33.'''

34.打印连接信息

35.'''

36.r e t u r n'(%u-%u)->(%u-%u)=%f'%(

37.s e l f.u p s t r e a m_n o d e.l a y e r_i n d e x,

38.s e l f.u p s t r e a m_n o d e.n o d e_i n d e x,

39.s e l f.d o w n s t r e a m_n o d e.l a y e r_i n d e x,

40.s e l f.d o w n s t r e a m_n o d e.n o d e_i n d e x,

41.s e l f.w e i g h t)

Connections对象,提供Connection集合操作。

1.c l a s s C o n n e c t i o n s(o b j e c t):

2.d e f__i n i t__(s e l f):

3.s e l f.c o n n e c t i o n s=[]

4.

5.d e f a d d_c o n n e c t i o n(s e l f,c o n n e c t i o n):

6.s e l f.c o n n e c t i o n s.a p p e n d(c o n n e c t i o n)

7.

8.d e f d u m p(s e l f):

9.f o r c o n n i n s e l f.c o n n e c t i o n s:

10.p r i n t c o n n

Network对象,提供API。

1.c l a s s N e t w o r k(o b j e c t):

2.d e f__i n i t__(s e l f,l a y e r s):

3.'''

4.初始化一个全连接神经网络

5.l a y e r s:二维数组,描述神经网络每层节点数

6.'''

7.s e l f.c o n n e c t i o n s=C o n n e c t i o n s()

8.s e l f.l a y e r s=[]

9.l a y e r_c o u n t=l e n(l a y e r s)

10.n o d e_c o u n t=0;

11.f o r i i n r a n g e(l a y e r_c o u n t):

12.s e l f.l a y e r s.a p p e n d(L a y e r(i,l a y e r s[i]))

13.f o r l a y e r i n r a n g e(l a y e r_c o u n t-1):

14.c o n n e c t i o n s=[C o n n e c t i o n(u p s t r e a m_n o d e,d o w n s t r e a m_n o d e)

15.f o r u p s t r e a m_n o d e i n s e l f.l a y e r s[l a y e r].n o d e s

16.f o r d o w n s t r e a m_n o d e i n s e l f.l a y e r s[l a y e r+1].n o d e s[:-1]]

17.f o r c o n n i n c o n n e c t i o n s:

18.s e l f.c o n n e c t i o n s.a d d_c o n n e c t i o n(c o n n)

19.c o n n.d o w n s t r e a m_n o d e.a p p e n d_u p s t r e a m_c o n n e c t i o n(c o n n)

20.c o n n.u p s t r e a m_n o d e.a p p e n d_d o w n s t r e a m_c o n n e c t i o n(c o n n)

21.

22.

23.d e f t r a i n(s e l f,l a b e l s,d a t a_s e t,r a t e,i t e r a t i o n):

24.'''

25.训练神经网络

26.l a b e l s:数组,训练样本标签。每个元素是一个样本的标签。

27.d a t a_s e t:二维数组,训练样本特征。每个元素是一个样本的特征。

28.'''

29.f o r i i n r a n g e(i t e r a t i o n):

30.f o r d i n r a n g e(l e n(d a t a_s e t)):

31.s e l f.t r a i n_o n e_s a m p l e(l a b e l s[d],d a t a_s e t[d],r a t e)

32.

33.d e f t r a i n_o n e_s a m p l e(s e l f,l a b e l,s a m p l e,r a t e):

34.'''

35.内部函数,用一个样本训练网络

36.'''

37.s e l f.p r e d i c t(s a m p l e)

38.s e l f.c a l c_d e l t a(l a b e l)

39.s e l f.u p d a t e_w e i g h t(r a t e)

40.

41.d e f c a l c_d e l t a(s e l f,l a b e l):

42.'''

43.内部函数,计算每个节点的d e l t a

44.'''

45.o u t p u t_n o d e s=s e l f.l a y e r s[-1].n o d e s

46.f o r i i n r a n g e(l e n(l a b e l)):

47.o u t p u t_n o d e s[i].c a l c_o u t p u t_l a y e r_d e l t a(l a b e l[i])

48.f o r l a y e r i n s e l f.l a y e r s[-2::-1]:

49.f o r n o d e i n l a y e r.n o d e s:

50.n o d e.c a l c_h i d d e n_l a y e r_d e l t a()