如果掌握了NumPy多维数组的运算,那么神经网络的实现就变得简单了。
多维数组
多维数组就是数字的集合,数字排成一列的集合、排成行列的集合、排成三维或N维形状的集合。Numpy是专为Python提供的多维数组计算库,这里我们简单地给出一些相关的运算。
import numpy as np
"一维数组"
data=np.array([1,2,3,4]) #构造一维数组
print(np.ndim(data)) #获取数组的维数,输出:1
print(data.shape) #数组形状(4,)
"多维数组"
data=np.array([[1,2],[3,4],[5,6],[7,8]]) #构造4行2列数组
print(np.ndim(data)) #2维
print(data.shape) #(4,2)
二维数组也称为矩阵,横排列称为行,纵排列称为列
矩阵乘法
矩阵乘法,即二维数组的乘积,要求对应维度的元素个数要保持一致,如下图所示:
矩阵乘积的计算方法如下图所示:
Python代码实现:
A=np.array([[1,2],[3,4]])#(2,2)
B=np.array([[5,6],[7,8]]) #(2,2)
np.dot(A,B) #矩阵乘积,输出[[19,22],[43,50]]
神经网络的内积
以一个简单的神经网络为例,这里省略了偏置b和激活函数:
Python代码如下:
X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W) #输出[[5,11,17]
三层神经网络的实现
这里我们以一个简单的三层神经网络的实现为例:输入层(即第0层)有两个神经元,第一层有三个神经元,第二层有2个神经元,输出层有2个神经元。
从输入层到第一层的信号传递
从这里开始,我们把偏置b也考虑进来,首先输入层的神经元与权重乘积并求和,得到节点a(上一个专题讲过),将节点a传递至激活函数h()后得到第一层的输出z。如下图所示。
第一层加权和表示为:
从第一层到第二层的信号传递过程同上面的一样。这里我们着重讲一下从第二层到输出层(第三层)的信号传递,为了区分输出层的激活函数,我们采用了σ()来表示。
一般而言,输出层的激活函数要根据具体情况决定,比如回归问题使用恒等函数,二元分类问题使用sigmoid函数,多元分类问题可以使用softmax函数(我们会在下一专题详细介绍),这里我们选择恒等函数,主要方便大家对程序的理解。下面是我们介绍的三层神经网络的实现代码:
# coding: utf-8
import numpy as np
def sigmoid(x):
return 1/(1+np.exp(-x)
def equal_function(x):
return x
def init_network():
network={}
network['W1']=np.array([[0.1,0.2,0.3],[0.4,0.5,0.6]])
network['b1']=np.array([0.1,0.2,0.3])
network['W2']=np.array([[0.7,0.8],[0.9,1.0],[1.1,1.2]])
network['b2']=np.array([0.4,0.5])
network['W3']=np.array([[1.3,1.4],[1.5,1.6]])
network['b3']=np.array([0.6,0.7])
return network
def forward(network,x):
W1=network['W1']
b1=network['b1']
W2=network['W2']
b2=network['b2']
W3=network['W3']
b3=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=equal_function(a3)
return y
network=init_network()
x=np.array([1.1,1.2])
y=forward(network,x)
y#输出[3.19934969, 3.48486525]
init_network()函数对权重和偏置进行初始化,并保存至字典变量network中。forward()函数封装了将输入信号转换为输出信号的处理过程,采用forward单词表示从输入到输出方向的传递处理。到这里神经网络的向前处理的实现就完成了,接下来的专题将介绍输出层(softmax激活函数)的设计。
欢迎关注“Python生态智联”,学知识,享生活!