深度学习入门--NumPy多维数组的运算
2019-03-22 本文已影响6人
爱吃西瓜的番茄酱
想要高效地实现神经网络,离不开numpy多维数组的运算。
一维数组
先介绍numpy一维数组:
In [1]: import numpy as np
In [2]: A=np.array([1, 2, 3, 4])
In [3]: print(A)
[1 2 3 4]
In [4]: np.ndim(A) # 数组A的维数
Out[4]: 1
In [6]: A.shape # 数组A的形状
Out[6]: (4,)
In [7]: A.shape[0]
Out[7]: 4
如上所示,数组的维数可以通过np.ndim()函数
获得;数组的形状可以通过<数组名>.shape
获得。
二维数组
In [8]: B=np.array([[1,2],[3,4],[5,6]])
In [9]: print(B)
[[1 2]
[3 4]
[5 6]]
In [10]: np.ndim(B)
Out[10]: 2
In [11]: B.shape
Out[11]: (3, 2)
二维数组也称之为矩阵。
矩阵乘法
根据大学本科学的【线性代数】的知识可知:矩阵的乘积是通过左边矩阵的行和右边矩阵的列以对应元素相乘后再求和而得到的。
并且矩阵A和矩阵B相乘积的前提是:矩阵A的列数等于矩阵B的行数。
矩阵的乘积用代码实现如下:
In [13]: A=np.array([[1,2],[3,4]])
In [14]: A.shape
Out[14]: (2, 2)
In [15]: B=np.array([[5,6],[7,8]])
In [16]: B.shape
Out[16]: (2, 2)
In [17]: np.dot(A,B) # A*B
Out[17]:
array([[19, 22],
[43, 50]])
矩阵的乘积可以通过numpy的np.dot()函数
计算。np.dot()函数
接收两个numpy数组作为参数,并返回数组的乘积。这里要注意,矩阵乘法没有交换律,即np.dot(A,B)
一般不等于np.dot(B,A)
。
利用numpy数组实现三层神经网络
这里将输入信号、权重、偏置设置成任意值:
import numpy as np
# 中间层的激活函数sigmoid
def sigmoid(x):
return 1/(1+np.exp(-x))
# 输出层的激活函数identity_function
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.4],[0.2,0.5],[0.3,0.6]]) # 第二层的权重
network['b2']=np.array([0.1,0.2]) # 第二层的偏置
network['w3']=np.array([[0.1,0.3], [0.2,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) # 输出信号
print(y)
输出为:
[0.31682708 0.69627909]
这里主要有sigmoid()函数
、identity_function()函数
、init_network()函数
和forward()函数
这四个函数:
-
sigmoid()函数
:中间层的激活函数 -
identity_function()函数
: 输出层的激活函数 -
identity_function()函数
:进行权重和偏置的初始化,并将它们保存在字典变量network中。 -
forward()函数
: 封装了将输入信号转换成输出信号的处理过程,这个过程称之为前向处理。
借助numpy多维数组,我们可以方便地实现神经网络。
每天学习一点点,每天进步一点点。