bp神经网络python代码

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.weights_input_hidden = np.random.randn(self.input_size, self.hidden_size) self.weights_hidden_output = np.random.randn(self.hidden_size, self.output_size) # 初始化偏置 self.bias_input_hidden = np.random.randn(1, self.hidden_size) self.bias_hidden_output = np.random.randn(1, self.output_size) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): return x * (1 - x) def forward(self, X): self.hidden_input = np.dot(X, self.weights_input_hidden) + self.bias_input_hidden self.hidden_output = self.sigmoid(self.hidden_input) self.output = np.dot(self.hidden_output, self.weights_hidden_output) + self.bias_hidden_output return self.sigmoid(self.output) def backward(self, X, y, output): self.error = y - output self.output_delta = self.error * self.sigmoid_derivative(output) self.hidden_error = self.output_delta.dot(self.weights_hidden_output.T) self.hidden_delta = self.hidden_error * self.sigmoid_derivative(self.hidden_output) self.weights_hidden_output += self.hidden_output.T.dot(self.output_delta) self.weights_input_hidden += X.T.dot(self.hidden_delta) self.bias_hidden_output += np.sum(self.output_delta, axis=0) self.bias_input_hidden += np.sum(self.hidden_delta, axis=0) def train(self, X, y, epochs): for epoch in range(epochs): output = self.forward(X) self.backward(X, y, output) if epoch % 1000 == 0: print(f"Epoch {epoch}, Error: {np.mean(np.abs(self.error))}") if __name__ == "__main__": # 输入数据 X = np.array([[0,0], [0,1], [1,0], [1,1]]) # 目标输出 y = np.array([[0], [1], [1], [0]]) # 定义神经网络 nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1) # 训练神经网络 nn.train(X, y, epochs=10000) # 打印训练后的输出 print("Final Output:") print(nn.forward(X))

这个代码定义了一个简单的具有一个隐藏层的前馈神经网络。你可以根据需要调整输入大小、隐藏层大小和输出大小。在训练过程中,它会打印出每一次迭代的错误,最后输出训练后的神经网络对于给定输入的输出。

初始化:

__init__ 方法中,我们初始化了神经网络的参数:输入层大小,隐藏层大小和输出层大小。权重和偏置被随机初始化。weights_input_hidden 是输入层到隐藏层的权重矩阵。weights_hidden_output 是隐藏层到输出层的权重矩阵。bias_input_hidden 是隐藏层的偏置。bias_hidden_output 是输出层的偏置。

前向传播:

forward 方法接受输入数据 X,并通过矩阵乘法和激活函数计算隐藏层和输出层的输出。

反向传播:

backward 方法根据前向传播的输出和实际标签 y,计算误差,并根据误差调整权重和偏置。这里使用了 sigmoid 函数的导数来计算误差对于输出的影响。更新权重和偏置时,使用了梯度下降的方法。

训练:

train 方法接受输入数据 X、目标输出 y 和迭代次数 epochs,并使用反向传播来训练神经网络。在每次迭代中,我们计算前向传播的输出,然后通过反向传播更新权重和偏置。打印出每一次迭代的错误,以便监控训练的进展。

主程序:

在主程序中,我们定义了输入数据 X 和目标输出 y,这是一个 XOR 逻辑门的示例。我们定义了一个神经网络对象 nn,并对其进行训练。最后,打印出训练后神经网络的输出。