.使用 Numpy 编写一个神经网络,并开发 BP 算法。两个隐层,第 一个隐层 4 个神经元,第二个隐层 8 个神经元,输入是 4 个神经 元,输出是 2 个神经元。激活函数用 ReLu。并对 data.csv 数据集进 行训练和测试,计算精度。
时间: 2023-11-22 11:56:36 浏览: 77
首先,我们需要导入必要的库。这里,我们需要使用 Numpy 来实现神经网络和 BP 算法,以及 Pandas 来读取数据集。
```python
import numpy as np
import pandas as pd
```
接下来,我们需要定义一些必要的函数。首先是 ReLU 激活函数:
```python
def relu(x):
return np.maximum(x, 0)
```
然后是 softmax 函数,用于输出层的多分类问题:
```python
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
```
接下来,我们需要定义神经网络的结构:
```python
class NeuralNetwork:
def __init__(self, n_input, n_hidden1, n_hidden2, n_output):
self.weights1 = np.random.randn(n_input, n_hidden1)
self.biases1 = np.zeros((1, n_hidden1))
self.weights2 = np.random.randn(n_hidden1, n_hidden2)
self.biases2 = np.zeros((1, n_hidden2))
self.weights3 = np.random.randn(n_hidden2, n_output)
self.biases3 = np.zeros((1, n_output))
```
其中,n_input 是输入层的神经元数量,n_hidden1 是第一个隐层的神经元数量,n_hidden2 是第二个隐层的神经元数量,n_output 是输出层的神经元数量。weights1、biases1、weights2、biases2、weights3 和 biases3 分别是第一层、第二层和输出层的权重和偏置。
接下来,我们需要定义前向传播函数:
```python
def forward(self, X):
self.z1 = np.dot(X, self.weights1) + self.biases1
self.a1 = relu(self.z1)
self.z2 = np.dot(self.a1, self.weights2) + self.biases2
self.a2 = relu(self.z2)
self.z3 = np.dot(self.a2, self.weights3) + self.biases3
self.y_hat = softmax(self.z3)
return self.y_hat
```
其中,X 是输入数据,self.z1、self.a1、self.z2、self.a2、self.z3 和 self.y_hat 分别是第一层、第二层和输出层的输入、输出和预测结果。这里,我们使用 ReLU 激活函数作为隐层的激活函数,softmax 函数作为输出层的激活函数。
接下来,我们需要定义反向传播函数:
```python
def backward(self, X, y, learning_rate):
m = X.shape[0]
delta_z3 = self.y_hat - y
delta_weights3 = np.dot(self.a2.T, delta_z3) / m
delta_biases3 = np.sum(delta_z3, axis=0, keepdims=True) / m
delta_z2 = np.dot(delta_z3, self.weights3.T) * (self.z2 > 0)
delta_weights2 = np.dot(self.a1.T, delta_z2) / m
delta_biases2 = np.sum(delta_z2, axis=0, keepdims=True) / m
delta_z1 = np.dot(delta_z2, self.weights2.T) * (self.z1 > 0)
delta_weights1 = np.dot(X.T, delta_z1) / m
delta_biases1 = np.sum(delta_z1, axis=0, keepdims=True) / m
self.weights3 -= learning_rate * delta_weights3
self.biases3 -= learning_rate * delta_biases3
self.weights2 -= learning_rate * delta_weights2
self.biases2 -= learning_rate * delta_biases2
self.weights1 -= learning_rate * delta_weights1
self.biases1 -= learning_rate * delta_biases1
```
其中,X 是输入数据,y 是对应的标签,learning_rate 是学习率。这里,我们使用交叉熵损失函数,因此求解 delta_z3 时直接使用预测结果和标签之间的差距。
最后,我们需要定义训练函数和测试函数:
```python
def train(model, X_train, y_train, epochs, learning_rate):
for epoch in range(epochs):
y_hat = model.forward(X_train)
model.backward(X_train, y_train, learning_rate)
if epoch % 100 == 0:
loss = -np.sum(y_train * np.log(y_hat)) / len(y_train)
print("Epoch {} loss: {:.4f}".format(epoch, loss))
def test(model, X_test, y_test):
y_hat = model.forward(X_test)
accuracy = np.mean(np.argmax(y_hat, axis=1) == np.argmax(y_test, axis=1))
print("Accuracy: {:.2f}%".format(accuracy * 100))
```
其中,model 是神经网络模型,X_train、y_train 是训练数据和标签,X_test、y_test 是测试数据和标签,epochs 是迭代次数,learning_rate 是学习率。这里,我们使用准确率作为评估指标。
现在,我们可以读取数据集并进行训练和测试了。假设数据集保存在 data.csv 文件中:
```python
dataset = pd.read_csv("data.csv")
X = dataset.iloc[:, :-2].values
y = dataset.iloc[:, -2:].values
X_train, X_test = X[:80], X[80:]
y_train, y_test = y[:80], y[80:]
model = NeuralNetwork(4, 4, 8, 2)
train(model, X_train, y_train, epochs=1000, learning_rate=0.01)
test(model, X_test, y_test)
```
这里,我们首先读取数据集并将其划分为训练集和测试集。然后,我们定义了一个 4-4-8-2 的神经网络模型,并使用 train 函数进行训练,使用 test 函数进行测试。这里,我们选择了 1000 次迭代和 0.01 的学习率。
完整代码如下:
阅读全文