Python实现BP神经网络:代码详解及示例
{
"title": "Python实现BP神经网络:代码详解及示例",
"description": "本文详细解释了使用Python实现BP神经网络的代码,包括定义神经网络类、激活函数、前向传播、反向传播、训练和预测等关键步骤。并提供示例代码演示如何训练和预测神经网络。",
"keywords": "BP神经网络, Python, 神经网络, 机器学习, 代码详解, 示例",
"content": "python\nimport numpy as np\n\n# 定义BP神经网络类\nclass NeuralNetwork:\n def __init__(self, input_size, hidden_size, output_size):\n self.input_size = input_size\n self.hidden_size = hidden_size\n self.output_size = output_size\n \n # 初始化权重和偏置\n self.W1 = np.random.randn(self.input_size, self.hidden_size)\n self.b1 = np.zeros((1, self.hidden_size))\n self.W2 = np.random.randn(self.hidden_size, self.output_size)\n self.b2 = np.zeros((1, self.output_size))\n \n # 定义sigmoid激活函数\n def sigmoid(self, x):\n return 1 / (1 + np.exp(-x))\n \n # 定义sigmoid函数的导数\n def sigmoid_derivative(self, x):\n return x * (1 - x)\n \n # 定义前向传播函数\n def forward(self, X):\n self.z1 = np.dot(X, self.W1) + self.b1\n self.a1 = self.sigmoid(self.z1)\n self.z2 = np.dot(self.a1, self.W2) + self.b2\n self.a2 = self.sigmoid(self.z2)\n return self.a2\n \n # 定义反向传播函数\n def backward(self, X, y, output):\n self.error = y - output\n self.delta2 = self.error * self.sigmoid_derivative(output)\n self.error_hidden = np.dot(self.delta2, self.W2.T)\n self.delta1 = self.error_hidden * self.sigmoid_derivative(self.a1)\n \n # 更新权重和偏置\n self.W2 += np.dot(self.a1.T, self.delta2)\n self.b2 += np.sum(self.delta2, axis=0)\n self.W1 += np.dot(X.T, self.delta1)\n self.b1 += np.sum(self.delta1, axis=0)\n \n # 定义训练函数\n def train(self, X, y, epochs):\n for i in range(epochs):\n output = self.forward(X)\n self.backward(X, y, output)\n \n # 定义预测函数\n def predict(self, X):\n output = self.forward(X)\n return np.round(output)\n\n# 创建示例数据\nX = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])\ny = np.array([[0], [1], [1], [0]])\n\n# 创建BP神经网络对象\nnn = NeuralNetwork(2, 3, 1)\n\n# 训练神经网络\nnn.train(X, y, 10000)\n\n# 预测新的数据\nprint(nn.predict(X))\n\n# 第1行:导入numpy库,用于数值计算。\n# 第4-9行:定义了一个名为NeuralNetwork的类。这个类表示一个BP神经网络。\n# 第5-7行:定义了类的初始化方法,接受输入层、隐藏层和输出层的神经元数量作为参数。初始化方法会根据这些参数随机初始化权重和偏置。\n# 第10-15行:定义了sigmoid激活函数。sigmoid函数将输入的值映射到0到1之间的概率。\n# 第17-21行:定义了sigmoid函数的导数。这个导数用于计算反向传播过程中的梯度。\n# 第23-33行:定义了前向传播函数。前向传播过程中,神经网络会根据输入计算出输出的值。\n# 第35-52行:定义了反向传播函数。反向传播过程中,神经网络会根据输出的误差计算更新权重和偏置的梯度。\n# 第54-61行:定义了训练函数。训练函数会根据给定的输入和输出数据进行多次迭代,调用前向传播和反向传播函数来更新神经网络的权重和偏置。\n# 第63-67行:定义了预测函数。预测函数会根据给定的输入数据进行前向传播,并返回最终的预测结果。\n# 第70-73行:创建了一个示例数据集X和对应的标签y。这个数据集用于训练和测试BP神经网络。\n# 第76行:创建了一个名为nn的NeuralNetwork对象。这个对象具有2个输入神经元,3个隐藏神经元和1个输出神经元。\n# 第79行:调用了神经网络对象的训练方法,将输入数据X和标签y作为参数,并指定迭代次数为10000次。\n# 第82行:调用了神经网络对象的预测方法,将输入数据X作为参数,并打印预测结果。\n
原文地址: https://www.cveoy.top/t/topic/qqAE 著作权归作者所有。请勿转载和采集!