bp神经网络python代码
pythonimport 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
,并对其进行训练。最后,打印出训练后神经网络的输出。