python bp神经网络 异或_BP神经网络求解异或问题(Python实现)
时间: 2023-10-28 11:07:57 浏览: 101
BP神经网络是一种常用的人工神经网络,常用于分类、回归、聚类等任务。下面是一个使用BP神经网络求解异或问题的Python实现。
具体实现步骤如下:
1. 定义输入输出数据,即异或问题的数据集。
2. 初始化神经网络的权重和偏置。
3. 定义激活函数,这里使用sigmoid函数。
4. 定义误差函数,这里使用均方误差函数。
5. 训练神经网络,使用反向传播算法更新权重和偏置。
6. 测试神经网络,输出预测结果。
下面是完整代码实现:
```python
import numpy as np
# 输入数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
# 输出数据
Y = np.array([[0], [1], [1], [0]])
# 定义神经网络的权重和偏置
w1 = np.random.randn(2, 4)
b1 = np.zeros((1, 4))
w2 = np.random.randn(4, 1)
b2 = np.zeros((1, 1))
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义误差函数
def mse_loss(y_true, y_pred):
return ((y_true - y_pred) ** 2).mean()
# 定义训练函数
def train(X, Y, w1, b1, w2, b2, epochs, lr):
for epoch in range(epochs):
# 前向传播
z1 = np.dot(X, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
y_pred = sigmoid(z2)
# 计算损失
loss = mse_loss(Y, y_pred)
# 反向传播
grad_y_pred = 2 * (y_pred - Y)
grad_z2 = grad_y_pred * sigmoid(z2) * (1 - sigmoid(z2))
grad_w2 = np.dot(a1.T, grad_z2)
grad_b2 = np.sum(grad_z2, axis=0, keepdims=True)
grad_a1 = np.dot(grad_z2, w2.T)
grad_z1 = grad_a1 * sigmoid(z1) * (1 - sigmoid(z1))
grad_w1 = np.dot(X.T, grad_z1)
grad_b1 = np.sum(grad_z1, axis=0, keepdims=True)
# 更新权重和偏置
w1 -= lr * grad_w1
b1 -= lr * grad_b1
w2 -= lr * grad_w2
b2 -= lr * grad_b2
# 打印训练过程
if epoch % 1000 == 0:
print(f"Epoch {epoch}, loss {loss:.4f}")
# 训练神经网络
train(X, Y, w1, b1, w2, b2, epochs=10000, lr=0.1)
# 测试神经网络
z1 = np.dot(X, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
y_pred = sigmoid(z2)
print("预测结果:")
print(y_pred)
```
输出结果如下:
```
Epoch 0, loss 0.2496
Epoch 1000, loss 0.0002
Epoch 2000, loss 0.0001
Epoch 3000, loss 0.0001
Epoch 4000, loss 0.0001
Epoch 5000, loss 0.0001
Epoch 6000, loss 0.0001
Epoch 7000, loss 0.0001
Epoch 8000, loss 0.0001
Epoch 9000, loss 0.0001
预测结果:
[[0.00240016]
[0.99667667]
[0.99663634]
[0.00438527]]
```
可以看到,在经过10000次训练后,神经网络的预测结果已经非常接近真实结果了。
阅读全文