使用numpy实现前馈神经网络并对一个数据集进行训练
时间: 2024-05-11 18:18:46 浏览: 210
Python使用numpy实现BP神经网络
好的,让我们从头开始搭建一个前馈神经网络。我们需要引入numpy库。
```python
import numpy as np
```
我们需要定义一个类,叫做`NeuralNetwork`。在类的初始化方法中,我们需要传入神经网络的结构信息,包括输入层、输出层和隐藏层的节点数量。我们还需要定义学习率和迭代次数。
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.learning_rate = learning_rate
self.num_iterations = num_iterations
```
接下来,我们需要初始化神经网络的权重和偏置。我们可以使用随机数初始化权重和偏置,但是为了保证每次运行程序结果相同,我们可以使用numpy的随机数生成器,并设置随机数种子。
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.learning_rate = learning_rate
self.num_iterations = num_iterations
# 初始化权重和偏置
np.random.seed(1)
self.weights_input_hidden = np.random.randn(self.hidden_size, self.input_size)
self.bias_input_hidden = np.zeros((self.hidden_size, 1))
self.weights_hidden_output = np.random.randn(self.output_size, self.hidden_size)
self.bias_hidden_output = np.zeros((self.output_size, 1))
```
现在,我们需要实现前馈神经网络的主要步骤。前馈神经网络的主要思想是将输入数据传递到输入层,通过隐藏层最终到达输出层。在每一层中,我们需要计算权重和偏置的加权和,然后通过激活函数进行非线性转换。最后,我们将输出层的结果与真实标签进行比较,并计算误差。
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size, learning_rate=0.1, num_iterations=1000):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.learning_rate = learning_rate
self.num_iterations = num_iterations
# 初始化权重和偏置
np.random.seed(1)
self.weights_input_hidden = np.random.randn(self.hidden_size, self.input_size)
self.bias_input_hidden = np.zeros((self.hidden_size, 1))
self.weights_hidden_output = np.random.randn(self.output_size, self.hidden_size)
self.bias_hidden_output = np.zeros((self.output_size, 1))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def forward(self, X):
# 前向传播
hidden_layer = self.sigmoid(np.dot(self.weights_input_hidden, X) + self.bias_input_hidden)
output_layer = self.sigmoid(np.dot(self.weights_hidden_output, hidden_layer) + self.bias_hidden_output)
return hidden_layer, output_layer
def train(self, X, y):
for i in range(self.num_iterations):
# 前向传播
hidden_layer, output_layer = self.forward(X)
# 计算误差
output_error = y - output_layer
hidden_error = np.dot(self.weights_hidden_output.T, output_error) * hidden_layer * (1 - hidden_layer)
# 更新权重和偏置
self.weights_hidden_output += self.learning_rate * np.dot(output_error, hidden_layer.T)
self.bias_hidden_output += self.learning_rate * np.sum(output_error, axis=1, keepdims=True)
self.weights_input_hidden += self.learning_rate * np.dot(hidden_error, X.T)
self.bias_input_hidden += self.learning_rate * np.sum(hidden_error, axis=1, keepdims=True)
```
现在,我们已经完成了神经网络的搭建和训练。让我们使用一个简单的数据集来测试我们的代码。
```python
# 准备数据集
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
y = np.array([[0, 1, 1, 0]])
# 创建神经网络
nn = NeuralNetwork(2, 4, 1)
# 训练神经网络
nn.train(X, y)
# 测试神经网络
hidden_layer, output_layer = nn.forward(X)
print(output_layer)
```
这个例子使用了一个简单的异或数据集。我们期望神经网络能够学习到异或的逻辑运算。输出结果应该是一个接近0或1的向量。你可以尝试使用不同的输入和隐藏层节点数量来训练神经网络,并观察输出结果的变化。
阅读全文