python实现bp神经网络
时间: 2023-08-25 09:05:54 浏览: 110
实现一个BP神经网络需要以下步骤:
1. 初始化网络参数:神经网络的层数、每层的神经元个数、权重和偏置值等。
2. 定义激活函数:常用的激活函数有sigmoid、ReLU等。
3. 前向传播:将输入数据通过神经网络,计算每层的输出值。
4. 计算误差:将输出值与真实值进行比较,计算误差值。
5. 反向传播:根据误差值,计算每层的梯度,并更新权重和偏置值。
6. 重复执行第3~5步,直到达到预设的收敛条件或训练次数。
以下是一个简单的BP神经网络的实现代码:
```python
import numpy as np
class NeuralNetwork:
def __init__(self, layer_sizes):
self.layer_sizes = layer_sizes
self.weights = [np.random.randn(layer_sizes[i], layer_sizes[i-1]) for i in range(1, len(layer_sizes))]
self.biases = [np.zeros((layer_sizes[i], 1)) for i in range(1, len(layer_sizes))]
self.activation = sigmoid
def forward(self, x):
a = x
for w, b in zip(self.weights, self.biases):
z = np.dot(w, a) + b
a = self.activation(z)
return a
def train(self, x, y, learning_rate=0.1, epochs=1000):
for i in range(epochs):
for j in range(len(x)):
a = x[j].reshape((-1, 1))
y_true = y[j].reshape((-1, 1))
zs = []
activations = [a]
for w, b in zip(self.weights, self.biases):
z = np.dot(w, a) + b
zs.append(z)
a = self.activation(z)
activations.append(a)
delta = (activations[-1] - y_true) * sigmoid_der(zs[-1])
for l in range(2, len(self.layer_sizes)):
delta = np.dot(self.weights[-l+1].T, delta) * sigmoid_der(zs[-l])
delta_w = [np.dot(delta, activations[-l-1].T) for l in range(len(self.layer_sizes)-1)]
delta_b = [delta]
for l in range(1, len(self.layer_sizes)-1):
delta = np.dot(self.weights[-l].T, delta) * sigmoid_der(zs[-l-1])
delta_b.append(delta)
for l in range(len(self.layer_sizes)-1):
self.weights[l] -= learning_rate * delta_w[-l-1]
self.biases[l] -= learning_rate * delta_b[-l-1]
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_der(x):
return sigmoid(x) * (1 - sigmoid(x))
```
在上面的代码中,`NeuralNetwork`类表示一个BP神经网络。`__init__`方法用于初始化网络的参数,`forward`方法用于进行前向传播,`train`方法用于训练网络。`sigmoid`和`sigmoid_der`函数分别表示sigmoid激活函数和其导数。
使用该类的示例代码如下:
```python
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
nn = NeuralNetwork([2, 4, 1])
nn.train(x, y)
print(nn.forward(np.array([[0, 0], [0, 1], [1, 0], [1, 1]])))
```
在这个例子中,我们定义了一个包含两个输入节点、四个隐藏节点和一个输出节点的BP神经网络,并使用训练数据进行训练。最后,我们输出了神经网络对输入数据的预测结果。
阅读全文