深度学习入门之3层神经网络的实现

深度学习入门之3层神经网络的实现

参考书籍:深度学习入门——基于pyhthon的理论与实现



前言

对神经网络进行简单的python实现,以3层神经网络为对象,实现输入到输出的前向处理,利用numpy的多维数组,尽可能减少代码量完成神经网络的前向处理过程。


一、3层神经网络是什么?

3层神经网络拥有一个输入层、输出层,同时拥有两个中间层,也称隐藏层,该网络拥有3层的权重参数,如下图所示:
3层神经网络

二、符号约定

在进行神经网络中的处理之前,对相关的符号进行一个约定:
w 12 ( 1 ) a 1 ( 1 ) w^{(1)}_{12} \\ \\a^{(1)}_1 w12(1)a1(1)
注意:这里只是为了方便阅读,对于这些符号的约定,可以自定义,后面内容重点在于神经网络的运算作为矩阵运算的打包,神经网络各层的运算从宏观角度上来看就是通过矩阵的乘法运算打包进行的。
符号约定
权重参数按照头顶权重层号,下踩前后连接关系,也就是说头上的数字表示该权重运用于哪一个层,下面的数字表示该权重连接了那两个神经元,顺序就是神经元索引顺序排列

三、层间信号传递

1.第1层信号传递

从输入层到第1层神经元的信号传递过程,如下:
参数传递
参数传递过程,就是矩阵乘法的运算,运算过程如下:
a 1 ( 1 ) = w 11 ( 1 ) x 1 + w 21 ( 1 ) x 2 + b 1 1 a 2 ( 1 ) = w 12 ( 1 ) x 1 + w 22 ( 1 ) x 2 + b 2 1 a 3 ( 1 ) = w 13 ( 1 ) x 1 + w 23 ( 1 ) x 2 + b 3 1 a^{(1)}_{1}=w^{(1)}_{11}x_1+w^{(1)}_{21}x_2+b^{1}_{1} \\ a^{(1)}_{2}=w^{(1)}_{12}x_1+w^{(1)}_{22}x_2+b^{1}_{2} \\ a^{(1)}_{3}=w^{(1)}_{13}x_1+w^{(1)}_{23}x_2+b^{1}_{3} a1(1)=w11(1)x1+w21(1)x2+b11a2(1)=w12(1)x1+w22(1)x2+b21a3(1)=w13(1)x1+w23(1)x2+b31
第一层信号的传递过程,就是一个简单的运算。
第2 层、第3层传递过程也和第1层类似,就不赘述。
如果使用矩阵的乘法运算,则可以将第1层的加权和表示成下面的公式:
A ( 1 ) = X W ( 1 ) + B ( 1 ) A^{(1)}=XW^{(1)}+B^{(1)} A(1)=XW(1)+B(1)
其中,
A ( 1 ) = ( a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) ) X = ( x 1 , x 2 ) B ( 1 ) = ( b 1 ( 1 ) , b 2 ( 1 ) , b 3 ( 1 ) ) A^{(1)}=(a^{(1)}_{1}, a^{(1)}_{2},a^{(1)}_{3}) \\ X=(x_1,x_2) \\ B^{(1)}=(b^{(1)}_{1},b^{(1)}_{2},b^{(1)}_{3}) A(1)=(a1(1),a2(1),a3(1))X=(x1,x2)B(1)=(b1(1),b2(1),b3(1))
接下来使用numpy数组实现上述过程,这里将输入信号、权重、偏置设置为任意值,代码如下:

代码如下(示例):

import numpy as np
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
print(A1)

输出结果:

>[0.3 0.7 1.1]

对计算得到的加权和数据,进行第1层神经元的激活,使用激活函数sigmoid对第一层激活.

代码如下(示例):

import numpy as np
def sigmoid(x):
	return 1 / (1 + np.exp(-x))
A1=np.array([0.3 0.7 1.1])
Z1=sigmoid(A1)
print(Z1)

输出结果:

>[0.57444252 0.66818777 0.75026011]

第一层信号的传递过程下图所示,第2列中的每个元素按照第一个的运算过程进行计算,得到了各自的数值。
第一层信号传递

2.第2层信号传递

第2层信号的传递,和第1层没有多大的区别,只是每层神经元中的元素不一致而已。运算过程如图:
第2层信号传递
运算过程,使用numpy数组矩阵计算,一次计算就可以得到结果,第2层也是有偏置参数,但是图中,并未将其表示出来。

代码如下(示例):

import numpy as np
def sigmoid(x):
	return 1 / (1 + np.exp(-x))
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid(A1)
W2=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
B2=np.array([0.1,0.2])
A2=p.dot(Z1,W2)+B2
Z2=sigmoid(A2)

3.第3层信号传递

第3层信号的传递,和第2层没有多大的区别,只是每层神经元中的元素不一致,其次就是使用的激活函数不是sigmoid函数,此处可以使用恒等函数作为激活函数。运算过程。
代码如下(示例):

import numpy as np
def sigmoid(x):
	return 1 / (1 + np.exp(-x))
def identity_function(x):
	return x
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid(A1)
W2=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
B2=np.array([0.1,0.2])
A2=p.dot(Z1,W2)+B2
Z2=sigmoid(A2)
W3=np.array([0.1,0.2])
B3=np.array([0.2,3.2])
A3=np.dot(Z2,W3)+B3
Z3=identity_function(A3)

四、代码小结

至此简单介绍了3层网络的实现,但是之前的代码格式不符合神经网络代码的格式,需要对其进行适度的整理修改。

import numpy as np
def sigmoid(x):
	return 1 / (1 + np.exp(-x))
def identity_function(x):
	return x
def init_network():
	network = {}
	network['w1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
	network['b1']=np.array([0.1,0.2,0.3])
	network['w2']=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
	network['b2']=np.array([0.1,0.2])
	network['w3']=np.array([[0.1,0.2],[0.3,0.4]])
	network['b3']=np.array([0.1,0.2])
	return network
def forward(network,x):
	w1,w2,w3 = network['w1',network['w2'],network['w3']			b1,b2,b3=network['b1',network['b2'],network['b3']
	a1=np.dot(x,w1)+b1
	z1=sigmoid(a1)
	a2=np.dot(z1,w2)+b2
	z2=sigmoid(a2)
	a3=np.dot(z2,w3)+b3
	y=identity_function(a3)
	return y
network = init_network()
x=np.array([1.0,0.5])
y=forward(network,x)

总结

主要介绍了神经元的各层信号之间的传递,简单用python代码实现一个3层神经网络的前向传播过程。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值