用一组数验证BP神经网络
时间: 2023-11-07 21:57:30 浏览: 179
假设我们有一个简单的二分类问题,输入数据是两维的,即 $x_1$ 和 $x_2$,输出结果为 $y$,取值为 0 或 1。我们现在构建一个单隐藏层的 BP 神经网络来解决这个问题。
我们先生成一些随机数据来验证 BP 神经网络的性能。假设我们有 100 个样本,每个样本有两个特征值,即 $x_1$ 和 $x_2$,我们可以随机生成这些值。对于输出值 $y$,我们可以使用一个简单的公式来生成:
$$y = f(x_1 + x_2 + \epsilon)$$
其中 $\epsilon$ 是一个小的随机噪声,可以用于模拟真实世界中的数据噪声。函数 $f$ 是一个阶跃函数,当输入大于 0 时输出 1,否则输出 0。
接下来,我们使用这些数据来训练 BP 神经网络。我们使用一个单隐藏层的神经网络,其中隐藏层有 4 个神经元。我们使用 sigmoid 激活函数,学习率为 0.1,迭代次数为 1000。
以下是使用 Python 实现的代码:
```python
import numpy as np
# 定义 sigmoid 函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义 sigmoid 函数的导数
def sigmoid_derivative(x):
return x * (1 - x)
# 定义 BP 神经网络类
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1], 4)
self.weights2 = np.random.rand(4, 1)
self.y = y
self.output = np.zeros(self.y.shape)
self.learning_rate = 0.1
def feedforward(self):
self.layer1 = sigmoid(np.dot(self.input, self.weights1))
self.output = sigmoid(np.dot(self.layer1, self.weights2))
def backprop(self):
d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))
d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1)))
self.weights1 += self.learning_rate * d_weights1
self.weights2 += self.learning_rate * d_weights2
def train(self, X, y):
self.output = np.zeros(y.shape)
for i in range(1000):
self.feedforward()
self.backprop()
# 生成随机数据
X = np.random.rand(100, 2)
y = np.zeros((100, 1))
for i in range(100):
noise = np.random.rand(1) * 0.1
if X[i][0] + X[i][1] + noise > 0:
y[i] = 1
# 训练 BP 神经网络
nn = NeuralNetwork(X, y)
nn.train(X, y)
# 测试 BP 神经网络
test_X = np.array([[0.2, 0.3], [0.4, 0.5]])
print(nn.feedforward(test_X))
```
运行代码后,我们可以看到 BP 神经网络对两个测试样本的输出结果。这个例子只包含了 100 个随机生成的样本,无法完全代表真实世界中的数据,但可以用于验证 BP 神经网络的实现是否正确。
阅读全文