作者:Harkerbest
声明:本文章为原创文章,本文章永久链接:https://www.harkerbest.cn/p/890, 转载请注明原文地址,盗版必究!!!
全系列文章目录请参见:
简单全连接层的实现
本节将会构建一个三层的神经网络,并演示如何用矩阵运算表示神经网络间的信号传递。神经网络的结构如下图所示,前三层最上方为偏置神经元。
Numpy实现矩阵内积运算
Numpy自带矩阵内积计算功能,下面是计算矩阵A和B的内积的语法演示:
import numpy as np
A = np.array([[1,2], [3,4]]) # 定义矩阵A
B = np.array([[5,6], [7,8]]) # 定义矩阵B
C = np.dot(A, B) # 计算矩阵A和B的内积并赋值给C
print(C)
# 输出: array([[19,22], [43,50]])
神经网络的矩阵表示和信号传递
神经网络每一层的传入参数、权重和偏置可以用矩阵储存,神经网络层间信号传递可以用矩阵运算表示。根据神经网络的定义,假设上一层传入的数值为矩阵X,上一层到本层的权重为矩阵W,偏置为矩阵B,那么传输到本层的信号数值为(用矩阵A表示):
A = XW + B
得到矩阵A后,经过激活函数转换便能得到传往下一层的信号数值(用Z矩阵表示),下面是代码实现(sigmoid已在上一节中定义):
A = np.dot(X, W) + B
Z = sigmoid(A)
三层神经网络的信号传递
上面已经定义了层间神经网络的信号传播方法,只需要重复上述传播的步骤,即可实现三层神经网络的传输,下面是实现三层神经网络传输的代码(定义an zn bn wn分别为第n层的传入信号、传出信号、偏置、权重,x为传入层传入的初始信号值):
def init_network(): # 初始化神经网络的各项参数,返回一个储存各项参数的字典
network = {}
network['w1'] = np.array(...)
network['b1'] = np.array(...)
network['w2'] = np.array(...)
network['b2'] = np.array(...)
network['w3'] = np.array(...)
network['b3'] = np.array(...)
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
z3 = sigmoid(a3)
y = identity_function(a3) # 恒等函数,与y=a3等价,这里后续会替换为输出层的激活函数softmax
return y
network = init_network() # 初始化神经网络各项参数
x = np.array(...) # 定义传入参数
y = forward(network, x) # 完成正向推导得到输出层输出参数y
print(y)
小结
至此,我们已经实现了简单神经网络的正向传播,后续会讲解输出层的实现。