深度学习(3)--反向传播算法

      由上一节的内容中我们知道了随机梯度下降算法,我们通过下面两个公式来进行更新,最重要的就是对两个变量weights和biases的更新,我们通过backpropagation来计算偏导数。

                 

 Backpropagation算法

     通过迭代性的来处理训练集中的实例

     对比经过神经网络后输入层预测值(predicted value)与真实值(target value)之间

     反方向(从输出层=>隐藏层=>输入层)来以最小化误差(error)来更新每个连接的权重(weight)

     算法详细介绍

           输入:D:数据集,l 学习率(learning rate),一个多层前向神经网络

           输入:一个训练好的神经网络(a trained neural network)

           1 初始化权重(weights)和偏向(bias): 随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向

           2 对于每一个训练实例X,执行以下步骤:

              2.1:由输入层向前传送

                                       

                                                                                                           

            2.2 根据误差(error)反向传送

                      对于输出层:

                      对于隐藏层:

                      权重更新: 

                                             

                      偏向更新 :

                                            

          3 终止条件

                  3.1 权重的更新低于某个阈值

                  3.2 预测的错误率低于某个阈值

                  3.3 达到预设一定的循环次数

   

 Backpropagation 算法举例

          

代码实现

    def back(self,x,y):

        nabla_b = [np.zeros(b.shape) for b in self.biases] #随机梯度下降算法,用于存储我们指定的minibatch中的数据的bias的总和
        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):
           # print w.shape,b.shape
            z = np.dot(w,activation)+b
            zs.append(z)
            activation = sigmoid(z)
            activations.append(activation)
        delta = cost(activations[-1],y)*sigmoid_prime(zs[-1])
        nabla_b[-1] = delta
        #delta 目前可能是10*1 的向量,而activation[-2]可能是784*1 无法直接点乘 需要转置后者 最终是10个784维向量 内部相加输出 10*1
        nabla_w[-1] = np.dot(delta,activations[-2].transpose())
        for l in range(2,self.layers):
            delta = np.dot(self.weights[-l+1].transpose(),delta)*sigmoid_prime(zs[-l])
            nabla_b[-l] =delta
            nabla_w[-l] = np.dot(delta,activations[-l-1].transpose())
        return (nabla_b,nabla_w)

  坚持一件事或许很难,但坚持下来一定很酷^_^!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
深度学习是一种机器学习方法,其基本思想是通过对数据进行分层抽象和学习,建立多层神经网络模型,实现对数据的高效分类、识别和预测。而反向传播算法深度学习中用于训练神经网络的一种有效方法。下面是反向传播算法的 Python 代码示例: ```python # 反向传播算法的 Python 代码示例 import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义神经网络的前向传播函数 def forward(X, W1, b1, W2, b2): z1 = np.dot(X, W1) + b1 a1 = sigmoid(z1) z2 = np.dot(a1, W2) + b2 y_hat = sigmoid(z2) return y_hat, z1, a1, z2 # 定义损失函数 def loss(y, y_hat): L = -y * np.log(y_hat) - (1 - y) * np.log(1 - y_hat) return L # 定义反向传播函数 def backward(X, y, y_hat, z1, a1, z2, W2): delta2 = (y_hat - y) * y_hat * (1 - y_hat) dW2 = np.dot(a1.T, delta2) db2 = np.sum(delta2, axis=0) delta1 = np.dot(delta2, W2.T) * a1 * (1 - a1) dW1 = np.dot(X.T, delta1) db1 = np.sum(delta1, axis=0) return dW1, db1, dW2, db2 # 训练神经网络 def train(X, y, hidden_size, epochs, lr): input_size = X.shape output_size = y.shape # 随机初始化权重和偏置 W1 = np.random.randn(input_size, hidden_size) b1 = np.zeros((1, hidden_size)) W2 = np.random.randn(hidden_size, output_size) b2 = np.zeros((1, output_size)) # 迭代训练神经网络 for i in range(epochs): # 前向传播计算输出和损失 y_hat, z1, a1, z2 = forward(X, W1, b1, W2, b2) L = loss(y, y_hat) # 反向传播计算梯度 dW1, db1, dW2, db2 = backward(X, y, y_hat, z1, a1, z2, W2) # 更新权重和偏置 W1 -= lr * dW1 b1 -= lr * db1 W2 -= lr * dW2 b2 -= lr * db2 # 每迭代10次输出一次损失 if i % 10 == 0: print("Epoch %d Loss %.4f" % (i, np.mean(L))) return W1, b1, W2, b2 # 测试模型 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([, , , ]) hidden_size = 4 epochs = 1000 lr = 0.5 W1, b1, W2, b2 = train(X, y, hidden_size, epochs, lr) y_hat_test = forward(X, W1, b1, W2, b2) print("Final Prediction") print(y_hat_test) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值