应用于实例
时间: 2023-08-04 17:08:24 浏览: 47
好的,下面介绍一个简单的实例,使用BP神经网络来进行手写数字识别。我们将使用Python的NumPy库来实现BP神经网络。
首先,我们需要准备MNIST手写数字数据集。你可以使用Keras库来加载MNIST数据集:
```python
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将图像数据平铺
X_train = X_train.reshape(X_train.shape[0], -1)
X_test = X_test.reshape(X_test.shape[0], -1)
# 将图像数据归一化
X_train = X_train.astype('float32') / 255.
X_test = X_test.astype('float32') / 255.
# 将标签进行one-hot编码
num_classes = 10
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
```
然后,我们来实现BP神经网络:
```python
import numpy as np
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.W1 = np.random.randn(self.input_size, self.hidden_size)
self.b1 = np.zeros((1, self.hidden_size))
self.W2 = np.random.randn(self.hidden_size, self.output_size)
self.b2 = np.zeros((1, self.output_size))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = self.sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
self.y_hat = self.sigmoid(self.z2)
return self.y_hat
def sigmoid_derivative(self, x):
return x * (1 - x)
def backward(self, X, y, y_hat, lr):
# 反向传播
delta3 = (y_hat - y) * self.sigmoid_derivative(y_hat)
dW2 = np.dot(self.a1.T, delta3)
db2 = np.sum(delta3, axis=0, keepdims=True)
delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_derivative(self.a1)
dW1 = np.dot(X.T, delta2)
db1 = np.sum(delta2, axis=0)
# 更新权重
self.W2 -= lr * dW2
self.b2 -= lr * db2
self.W1 -= lr * dW1
self.b1 -= lr * db1
def train(self, X, y, lr, epochs):
for i in range(epochs):
y_hat = self.forward(X)
self.backward(X, y, y_hat, lr)
```
接下来,我们创建一个BP神经网络,并对其进行训练:
```python
input_size = 784
hidden_size = 128
output_size = 10
nn = NeuralNetwork(input_size, hidden_size, output_size)
lr = 0.1
epochs = 1000
nn.train(X_train, y_train, lr, epochs)
```
最后,我们使用测试集来对模型进行评估:
```python
y_pred = nn.forward(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_test = np.argmax(y_test, axis=1)
accuracy = np.mean(y_pred == y_test)
print('accuracy:', accuracy)
```
这个例子中,我们使用一个简单的BP神经网络来进行手写数字识别,准确率可以达到90%以上。当然,你可以根据自己的需求对神经网络进行修改和调整,以获得更好的性能。