Python + NumPy 从零实现的 BP 神经网络(反向传播)脚本模型,包含前向传播、反向传播、训练和预测,并用 XOR 数据做示例

下面是一个用 Python + NumPy 从零实现的 BP 神经网络(反向传播)脚本模型,包含前向传播、反向传播、训练和预测,并用 XOR 数据做示例。

```python

import numpy as np

class BPNeuralNetwork:

def init(self, input_size, hidden_size, output_size, lr=0.5):

"""

input_size: 输入维度

hidden_size: 隐藏层神经元数量

output_size: 输出维度

lr: 学习率

"""

np.random.seed(42)

初始化权重和偏置

self.W1 = np.random.randn(input_size, hidden_size) * np.sqrt(1 / input_size)

self.b1 = np.zeros((1, hidden_size))

self.W2 = np.random.randn(hidden_size, output_size) * np.sqrt(1 / hidden_size)

self.b2 = np.zeros((1, output_size))

self.lr = lr

def sigmoid(self, z):

return 1.0 / (1.0 + np.exp(-z))

def sigmoid_derivative(self, z):

s = self.sigmoid(z)

return s * (1 - s)

def forward(self, X):

"""前向传播"""

self.z1 = X @ self.W1 + self.b1

self.a1 = self.sigmoid(self.z1)

self.z2 = self.a1 @ self.W2 + self.b2

self.a2 = self.sigmoid(self.z2)

return self.a2

def backward(self, X, y):

"""反向传播 + 参数更新"""

m = X.shape0

输出层误差

delta2 = (self.a2 - y) * self.sigmoid_derivative(self.z2)

dW2 = self.a1.T @ delta2 / m

db2 = np.sum(delta2, axis=0, keepdims=True) / m

隐藏层误差

delta1 = (delta2 @ self.W2.T) * self.sigmoid_derivative(self.z1)

dW1 = X.T @ delta1 / m

db1 = np.sum(delta1, axis=0, keepdims=True) / m

梯度下降更新参数

self.W2 -= self.lr * dW2

self.b2 -= self.lr * db2

self.W1 -= self.lr * dW1

self.b1 -= self.lr * db1

def train(self, X, y, epochs=10000, verbose=True):

"""训练模型"""

for i in range(epochs):

self.forward(X)

self.backward(X, y)

if verbose and (i + 1) % 1000 == 0:

loss = np.mean((self.a2 - y) ** 2)

print(f"epoch {i + 1}, loss={loss:.6f}")

def predict(self, X, threshold=0.5):

"""预测类别"""

prob = self.forward(X)

return (prob >= threshold).astype(int)

if name == "main":

XOR 数据集

X = np.array([

0, 0,

0, 1,

1, 0,

1, 1

], dtype=float)

y = np.array([

0,

1,

1,

0

], dtype=float)

创建 BP 模型:2 输入,4 隐藏神经元,1 输出

bp = BPNeuralNetwork(

input_size=2,

hidden_size=4,

output_size=1,

lr=0.5

)

训练

bp.train(X, y, epochs=10000, verbose=True)

预测概率

print("\n预测概率:")

print(bp.forward(X))

预测类别

print("\n预测类别:")

print(bp.predict(X))

```

运行后会输出类似:

```text

epoch 1000, loss=0.250000

epoch 2000, loss=0.120000

...

预测概率:

\[0.01

0.98

0.98

0.02\]

预测类别:

\[0

1

1

0\]

```

这个模型的核心就是:

  1. 前向传播:输入 → 隐藏层 → 输出层

  2. 计算损失:这里使用均方误差 MSE

  3. 反向传播:从输出层误差逐层往回计算梯度

  4. 梯度下降:更新权重和偏置

  5. 重复训练:直到损失收敛

此文章仅为学习参考用。

相关推荐
人工智能导论实践课1 小时前
【GUI桌面开发3】PyCharm配置外部工具
ide·python·pycharm
一千柯橘1 小时前
LangChain 的实时输出处理: stream_events 和 Streaming
python·langchain·agent
贾公子1 小时前
图片 AIGC 检测接入实战——URL 与 Base64 的取舍、体积校验与「你送过去的可能不是那张图」
python·aigc
SEO_juper1 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
曲径海盗1 小时前
【Python 学习第 37 天】for 循环
python·学习笔记·编程入门
心静财富之门2 小时前
Python 数据共享四种方案完整实例(同进程 / JSON / Redis / HTTP)
数据库·python·oracle
王仔小奶2 小时前
慢SQL治理与性能调优:DBA如何用Shell/Python提升运维效率?
python·sql·dba
用户0332126663672 小时前
使用 Python 快速在 PowerPoint 中生成表格【教程】
python
夜晚回家3 小时前
Python 身份运算符详解 | is 与 == 到底差在哪
python
fengye2071613 小时前
cpython框架结构
python