bp神经网络python
时间: 2023-08-26 11:05:02 浏览: 88
在Python中,可以使用NumPy库来实现BP神经网络。以下是一个简单的例子:
首先,需要导入NumPy库:
```python
import numpy as np
```
然后,定义一个三层的神经网络:
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
# 初始化权重和偏置
self.weights1 = np.random.randn(input_size, hidden_size)
self.bias1 = np.zeros((1, hidden_size))
self.weights2 = np.random.randn(hidden_size, output_size)
self.bias2 = np.zeros((1, output_size))
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.weights1) + self.bias1
self.a1 = np.tanh(self.z1)
self.z2 = np.dot(self.a1, self.weights2) + self.bias2
self.output = np.sigmoid(self.z2)
return self.output
def backward(self, X, y, output):
# 反向传播
self.output_error = y - output
self.output_delta = self.output_error * np.sigmoid(output) * (1 - np.sigmoid(output))
self.hidden_error = np.dot(self.output_delta, self.weights2.T)
self.hidden_delta = self.hidden_error * (1 - np.power(self.a1, 2))
self.weights1 += np.dot(X.T, self.hidden_delta)
self.bias1 += np.sum(self.hidden_delta, axis=0, keepdims=True)
self.weights2 += np.dot(self.a1.T, self.output_delta)
self.bias2 += np.sum(self.output_delta, axis=0, keepdims=True)
def train(self, X, y, num_epochs):
# 训练模型
for epoch in range(num_epochs):
output = self.forward(X)
self.backward(X, y, output)
```
在这个例子中,神经网络有一个输入层、一个隐藏层和一个输出层。在初始化时,权重和偏置被随机初始化。在前向传播中,输入经过第一层的加权求和和激活函数(tanh),然后经过第二层的加权求和和激活函数(sigmoid)得到输出。在反向传播中,计算输出误差和梯度,并使用梯度下降更新权重和偏置。
接下来,可以使用以下代码来训练神经网络:
```python
# 定义输入、输出和训练次数
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
num_epochs = 10000
# 创建神经网络对象并训练
nn = NeuralNetwork(2, 3, 1)
nn.train(X, y, num_epochs)
# 预测
print(nn.forward(np.array([[0, 0]])))
print(nn.forward(np.array([[0, 1]])))
print(nn.forward(np.array([[1, 0]])))
print(nn.forward(np.array([[1, 1]])))
```
在这个例子中,使用了一个常见的逻辑门问题(异或问题)进行训练和测试。最后输出的结果应该是:
```
[[0.005]]
[[0.993]]
[[0.994]]
[[0.006]]
```
这个结果说明神经网络已经成功地解决了异或问题。
阅读全文