反向传播的全矩阵方法

之前在神经网络随机梯度下降计算梯度时,在反向传播时每个样本单独计算梯度,然后再求小批量数据的梯度平均值;而现在全矩阵方法是将整个小批量作为一个矩阵(一个样本作为一列)输入整体利用矩阵运算一次计算梯度平均值,用计算出的梯度平均值去更新权重和偏置。结果表明,全矩阵方法能够提升效率平均5倍左右,由开始的平均10秒到2秒
废话不多说,直接上代码:

# ⼩批量数据上的反向传播的全矩阵⽅法,并且最后更新权重
    def backprop_matrix(self, x, y, m, eta):
        """
        ⼩批量数据上的反向传播的全矩阵⽅法
        :param x: 小批量数据的输入矩阵,一列代表一个样本
        :param y: 期望输出矩阵
        :param m: 数据的规模
        :param eta: 学习率
        :return:
        """
        # 根据权重矩阵和偏置列向量的形状生成梯度矩阵
        nabla_b = [np.zeros(b.shape) for b in self.biases]
        nabla_w = [np.zeros(w.shape) for w in self.weights]
        # 第一步,设置输入激活值矩阵
        activation = x
        activations = [x]   # 保存各层的激活值矩阵
        zs = []   # 保存各层的带权输入矩阵
        # 第二步,前向传播,计算各层的带权输入和激活值
        for w, b in zip(self.weights, self.biases):
            z = np.dot(w, activation) + b
            activation = sigmoid(z)
            zs.append(z)
            activations.append(activation)
        # 第三步,计算输出层误差矩阵
        delta = cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])
        # 计算输出层的偏置和权重的梯度
        nabla_b[-1] = np.array([np.mean(delta, axis=1)]).transpose()
        # self.biases[-1] = self.biases[-1] - eta * nabla_b
        nabla_w[-1] = np.dot(delta, activations[-2].transpose()) / m
        # self.weights[-1] = self.weights[-1] - eta * nabla_w
        # 第四步,反向传播误差,并且用误差计算梯度
        for l in range(2, self.num_layers):
            delta = np.dot(self.weights[-l+1].transpose(), delta) * sigmoid_prime(zs[-l])
            nabla_b[-l] = np.array([np.mean(delta, axis=1)]).transpose()
            nabla_w[-l] = np.dot(delta, activations[-l-1].transpose()) / m
        # 第五步,梯度下降更新参数
        for l in range(1, self.num_layers):
            self.biases[-l] = self.biases[-l] - eta * nabla_b[-l]
            self.weights[-l] = self.weights[-l] - eta * nabla_w[-l]

最后在具体操作的过程在有什么问题,欢迎大家一起交流讨论。
在下编程小白,如果有什么错误欢迎大家批评指正!
邮箱:1916728303@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值