最近学习神经网络,自己参照源代码把误差逆传播重新写了一遍,其实挺简单的,关键是要把逆传播的几个过程搞清楚以及每一步是为了得到什么,然后知道numpy的矩阵运算操作,废话不多说,直接上代码:
# 反向传播算法
def backpro(weights, bs, x, y, nums):
"""
逆传播计算参数的梯度
:param weights: 权重矩阵列表,每一层一个权重矩阵,直到最后一层,整个网络构成一个矩阵集合
:param bs: 偏置向量列表,每一层一个偏置列向量
:param x: 输入
:param y: 期望输出
:param nums: 网络层数
:return:
"""
# 构造两个空的梯度列表,形状跟每一层权重矩阵和列向量形状相同
nabla_weight = [np.zeros(z.shape) for z in weights] # 每一层权重的梯度矩阵跟权重矩阵的形状相同
nabla_b = [np.zeros(b.shape