如何通过python搭建一个BP神经网络,并能在训练集训练后,将同列数的测试集也投入算出预测值,不使用Keras或PyTorch
时间: 2023-09-11 12:07:42 浏览: 95
搭建一个BP神经网络需要以下步骤:
1. 定义输入层、隐层和输出层的神经元数量和网络结构。
2. 初始化权重和偏置。
3. 定义激活函数和损失函数。
4. 进行前向传播和反向传播,根据损失函数更新权重和偏置。
5. 不断迭代训练,直到损失函数收敛。
下面是一个简单的BP神经网络的代码示例,其中使用了numpy库来进行矩阵运算:
```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 softmax(self, x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
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.softmax(self.z2)
return self.a2
def backward(self, X, y, lr):
# 反向传播
delta2 = self.a2 - y
delta1 = np.dot(delta2, self.W2.T) * self.a1 * (1 - self.a1)
dW2 = np.dot(self.a1.T, delta2)
db2 = np.sum(delta2, axis=0, keepdims=True)
dW1 = np.dot(X.T, delta1)
db1 = np.sum(delta1, axis=0)
# 更新权重和偏置
self.W2 -= lr * dW2
self.b2 -= lr * db2
self.W1 -= lr * dW1
self.b1 -= lr * db1
def train(self, X, y, epochs, lr):
# 训练模型
for i in range(epochs):
y_pred = self.forward(X)
self.backward(X, y, lr)
loss = -np.mean(np.sum(y * np.log(y_pred), axis=1))
if i % 100 == 0:
print("Epoch:", i, " Loss:", loss)
def predict(self, X):
# 预测结果
y_pred = self.forward(X)
return np.argmax(y_pred, axis=1)
```
使用该神经网络进行训练和预测的步骤如下:
```python
# 导入数据集
X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_train = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
# 创建神经网络
input_size = 2
hidden_size = 4
output_size = 2
nn = NeuralNetwork(input_size, hidden_size, output_size)
# 训练神经网络
epochs = 1000
lr = 0.1
nn.train(X_train, y_train, epochs, lr)
# 预测测试集
X_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_test = nn.predict(X_test)
print("Predictions:", y_test)
```
在上述代码中,我们使用了一个简单的逻辑斯蒂回归问题作为演示,训练集和测试集都是由4个样本组成的,每个样本有两个特征和两个标签。在训练完成后,我们将测试集投入模型中进行预测,并输出预测结果。
阅读全文