当前位置:   article > 正文

python实现标准BP算法_python 搭建bp神经网络

python 搭建bp神经网络

BP 算法(Back Propagation Algorithm)是一种经典的人工神经网络训练算法,用于解决分类和回归问题。BP 算法基于梯度下降的思想,通过反向传播误差信号来调整神经网络的权重和偏置,从而实现模型的训练。

BP 算法通常由前向传播和反向传播两个过程组成。在前向传播过程中,神经网络将输入样本通过多层神经元进行计算,得到输出值。在反向传播过程中,首先计算输出值与实际标签之间的误差,然后将误差信号传递回每个神经元,从而计算出每个神经元的误差贡献。接着,BP 算法通过梯度下降的方法更新神经网络的权重和偏置,以使误差最小化。最终,BP 算法通过迭代训练得到最优的神经网络模型,可以用于进行分类和回归任务。

BP 算法的优点是能够处理复杂的非线性关系,适用于大规模的数据集和多类别分类问题。缺点是容易陷入局部最优解,训练时间较长,需要大量的训练数据。同时,在实际应用中,需要针对不同的问题选择合适的神经网络结构、学习率、激活函数等超参数,以及进行模型的正则化和参数初始化等操作,来提高模型的泛化能力和鲁棒性。

下面是使用 Python 实现标准 BP 算法的示例代码:

  1. import numpy as np
  2. class BPNeuralNetwork:
  3. def __init__(self, num_input, num_hidden, num_output, learning_rate):
  4. self.num_input = num_input
  5. self.num_hidden = num_hidden
  6. self.num_output = num_output
  7. self.learning_rate = learning_rate
  8. self.input_layer = np.zeros((num_input, 1))
  9. self.hidden_layer = np.zeros((num_hidden, 1))
  10. self.output_layer = np.zeros((num_output, 1))
  11. self.hidden_weights = np.random.randn(num_hidden, num_input)
  12. self.output_weights = np.random.randn(num_output, num_hidden)
  13. self.hidden_bias = np.zeros((num_hidden, 1))
  14. self.output_bias = np.zeros((num_output, 1))
  15. def sigmoid(self, x):
  16. return 1 / (1 + np.exp(-x))
  17. def sigmoid_derivative(self, x):
  18. return x * (1 - x)
  19. def forward_propagation(self, input_data):
  20. self.input_layer = input_data.reshape(self.num_input, 1)
  21. # 计算隐藏层输出
  22. self.hidden_layer = self.sigmoid(self.hidden_weights @ self.input_layer + self.hidden_bias)
  23. # 计算输出层输出
  24. self.output_layer = self.sigmoid(self.output_weights @ self.hidden_layer + self.output_bias)
  25. return self.output_layer
  26. def backward_propagation(self, input_data, output_data):
  27. # 计算输出误差和梯度
  28. output_error = output_data.reshape(self.num_output, 1) - self.output_layer
  29. output_gradient = output_error * self.sigmoid_derivative(self.output_layer)
  30. # 计算隐藏层误差和梯度
  31. hidden_error = self.output_weights.T @ output_gradient
  32. hidden_gradient = hidden_error * self.sigmoid_derivative(self.hidden_layer)
  33. # 更新输出层权重和偏置
  34. self.output_weights += self.learning_rate * output_gradient @ self.hidden_layer.T
  35. self.output_bias += self.learning_rate * output_gradient
  36. # 更新隐藏层权重和偏置
  37. self.hidden_weights += self.learning_rate * hidden_gradient @ self.input_layer.T
  38. self.hidden_bias += self.learning_rate * hidden_gradient
  39. def train(self, input_data, output_data, num_epochs):
  40. for epoch in range(num_epochs):
  41. for i in range(input_data.shape[0]):
  42. x = input_data[i]
  43. y = output_data[i]
  44. self.forward_propagation(x)
  45. self.backward_propagation(x, y)
  46. def predict(self, input_data):
  47. output = np.zeros((input_data.shape[0], self.num_output))
  48. for i in range(input_data.shape[0]):
  49. output[i] = self.forward_propagation(input_data[i])
  50. return output

上述代码定义了一个名为 BPNeuralNetwork 的类,该类实现了标准 BP 算法的前向传播、反向传播和训练过程。在类的构造函数中,我们需要指定神经网络的输入层、隐藏层和输出层的节点数,以及学习率。在 forward_propagation 方法中,我们首先将输入数据 reshape 成列向量,并计算隐藏层和输出层的输出。在 backward_propagation 方法中,我们首先计算输出层和隐藏层的误差和梯

度,并使用梯度下降的方法更新权重和偏置。在 train 方法中,我们对整个数据集进行多次迭代训练,对于每个输入样本,先进行前向传播计算输出值,然后进行反向传播更新权重和偏置。最后,在 predict 方法中,我们可以使用训练好的神经网络模型对新数据进行预测。

下面是一个使用 BPNeuralNetwork 类的示例,该示例使用鸢尾花数据集进行分类:

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.preprocessing import OneHotEncoder
  4. # 导入数据集
  5. iris = load_iris()
  6. X, y = iris.data, iris.target
  7. # 将标签进行 OneHot 编码
  8. enc = OneHotEncoder()
  9. y_onehot = enc.fit_transform(y.reshape(-1, 1)).toarray()
  10. # 划分数据集
  11. X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)
  12. # 构建神经网络模型并训练
  13. nn = BPNeuralNetwork(num_input=X_train.shape[1], num_hidden=5, num_output=y_train.shape[1], learning_rate=0.1)
  14. nn.train(X_train, y_train, num_epochs=500)
  15. # 在测试集上进行预测并计算准确率
  16. y_pred = nn.predict(X_test)
  17. y_pred_label = np.argmax(y_pred, axis=1)
  18. y_test_label = np.argmax(y_test, axis=1)
  19. accuracy = np.mean(y_pred_label == y_test_label)
  20. print("Accuracy: {:.2f}%".format(accuracy * 100))

在上述示例中,我们首先将原始的标签数据进行 OneHot 编码,然后使用 train_test_split 函数将数据集划分为训练集和测试集。接着,我们使用 BPNeuralNetwork 类构建神经网络模型,并使用 train 方法对训练集进行训练。最后,我们使用 predict 方法对测试集进行预测,并计算预测准确率。

需要注意的是,在实际应用中,我们需要对神经网络的超参数进行调参,如隐藏层节点数、学习率等,以及进行模型的正则化和参数初始化等操作,来提高模型的泛化能力和鲁棒性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/327991
推荐阅读
相关标签
  

闽ICP备14008679号