请用python写一个用BP神经网络训练模型的案例
时间: 2024-04-30 15:19:17 浏览: 10
好的,以下是一个用Python实现BP神经网络训练模型的案例:
首先,引入必要的库:
```python
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
```
然后,我们需要生成一些随机数据作为训练数据:
```python
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, n_classes=2, random_state=42)
```
接着,我们将数据集划分为训练集和测试集:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
然后,我们定义一个BP神经网络的类:
```python
class BPNeuralNetwork:
def __init__(self, input_layer_size, hidden_layer_size, output_layer_size):
self.input_layer_size = input_layer_size
self.hidden_layer_size = hidden_layer_size
self.output_layer_size = output_layer_size
# 初始化权重矩阵
self.W1 = np.random.randn(self.input_layer_size, self.hidden_layer_size)
self.W2 = np.random.randn(self.hidden_layer_size, self.output_layer_size)
# 初始化偏置值
self.b1 = np.zeros((1, self.hidden_layer_size))
self.b2 = np.zeros((1, self.output_layer_size))
# 定义sigmoid激活函数
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
# 定义sigmoid函数的导数
def sigmoid_derivative(self, z):
return z * (1 - z)
# 前向传播
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.a2 = self.sigmoid(self.z2)
return self.a2
# 反向传播
def backward(self, X, y, y_pred, learning_rate):
delta2 = (y_pred - y) * self.sigmoid_derivative(y_pred)
dW2 = np.dot(self.a1.T, delta2)
db2 = np.sum(delta2, axis=0, keepdims=True)
delta1 = np.dot(delta2, self.W2.T) * self.sigmoid_derivative(self.a1)
dW1 = np.dot(X.T, delta1)
db1 = np.sum(delta1, axis=0)
# 更新权重和偏置值
self.W1 -= learning_rate * dW1
self.b1 -= learning_rate * db1
self.W2 -= learning_rate * dW2
self.b2 -= learning_rate * db2
# 训练模型
def train(self, X, y, learning_rate=1e-4, epochs=20000):
for i in range(epochs):
y_pred = self.forward(X)
self.backward(X, y, y_pred, learning_rate)
if i % 1000 == 0:
loss = np.mean(np.square(y - y_pred))
print(f"Epoch {i}, loss: {loss}")
# 预测
def predict(self, X):
y_pred = self.forward(X)
return np.round(y_pred)
```
最后,我们初始化一个BP神经网络的实例,并训练模型:
```python
bpnn = BPNeuralNetwork(input_layer_size=10, hidden_layer_size=5, output_layer_size=1)
bpnn.train(X_train, y_train)
```
然后,我们可以用测试集评估模型的性能:
```python
y_pred = bpnn.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"Accuracy: {accuracy}")
```
完整的代码如下所示:
```python
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
class BPNeuralNetwork:
def __init__(self, input_layer_size, hidden_layer_size, output_layer_size):
self.input_layer_size = input_layer_size
self.hidden_layer_size = hidden_layer_size
self.output_layer_size = output_layer_size
# 初始化权重矩阵
self.W1 = np.random.randn(self.input_layer_size, self.hidden_layer_size)
self.W2 = np.random.randn(self.hidden_layer_size, self.output_layer_size)
# 初始化偏置值
self.b1 = np.zeros((1, self.hidden_layer_size))
self.b2 = np.zeros((1, self.output_layer_size))
# 定义sigmoid激活函数
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
# 定义sigmoid函数的导数
def sigmoid_derivative(self, z):
return z * (1 - z)
# 前向传播
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.a2 = self.sigmoid(self.z2)
return self.a2
# 反向传播
def backward(self, X, y, y_pred, learning_rate):
delta2 = (y_pred - y) * self.sigmoid_derivative(y_pred)
dW2 = np.dot(self.a1.T, delta2)
db2 = np.sum(delta2, axis=0, keepdims=True)
delta1 = np.dot(delta2, self.W2.T) * self.sigmoid_derivative(self.a1)
dW1 = np.dot(X.T, delta1)
db1 = np.sum(delta1, axis=0)
# 更新权重和偏置值
self.W1 -= learning_rate * dW1
self.b1 -= learning_rate * db1
self.W2 -= learning_rate * dW2
self.b2 -= learning_rate * db2
# 训练模型
def train(self, X, y, learning_rate=1e-4, epochs=20000):
for i in range(epochs):
y_pred = self.forward(X)
self.backward(X, y, y_pred, learning_rate)
if i % 1000 == 0:
loss = np.mean(np.square(y - y_pred))
print(f"Epoch {i}, loss: {loss}")
# 预测
def predict(self, X):
y_pred = self.forward(X)
return np.round(y_pred)
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
bpnn = BPNeuralNetwork(input_layer_size=10, hidden_layer_size=5, output_layer_size=1)
bpnn.train(X_train, y_train)
y_pred = bpnn.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"Accuracy: {accuracy}")
```
以上就是一个用Python实现BP神经网络训练模型的案例。