编写一个BP(反向传播)神经网络需要以下步骤:
1. 确定网络结构
输入层节点数:根据问题的输入特征确定。
隐藏层节点数:通常通过实验确定,或者使用一些启发式方法,如经验公式。
输出层节点数:根据问题的输出类别确定。
2. 初始化参数
权重:随机初始化,通常在小的正负数之间。
偏置:同样随机初始化。
3. 前向传播
激活函数:如ReLU、Sigmoid、Tanh等。
计算每一层的输出:包括输入层、隐藏层和输出层。
4. 计算损失
损失函数:如均方误差(MSE)、交叉熵等。
5. 反向传播
计算梯度:对损失函数关于网络参数的梯度。
更新参数:使用梯度下降或其他优化算法更新权重和偏置。
6. 迭代优化
重复步骤3到5,直到满足停止条件(如损失低于某个阈值或达到最大迭代次数)。
以下是一个简单的BP神经网络实现示例(使用Python和NumPy):
```python
import numpy as np
激活函数及其导数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x (1 x)
初始化参数
input_size = 2
hidden_size = 3
output_size = 1
weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))
weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))
训练数据
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
expected_outputs = np.array([[0], [1], [1], [0]])
训练过程
for epoch in range(10000):
前向传播
hidden_layer_activation = np.dot(inputs, weights_input_hidden)
hidden_layer_output = sigmoid(hidden_layer_activation)
output_layer_activation = np.dot(hidden_layer_output, weights_hidden_output)
predicted_output = sigmoid(output_layer_activation)
计算损失
loss = np.mean((predicted_output expected_outputs) 2)
反向传播
error = expected_outputs predicted_output
d_predicted_output = error sigmoid_derivative(predicted_output)
error_hidden_layer = d_predicted_output.dot(weights_hidden_output.T)
d_hidden_layer = error_hidden_layer sigmoid_derivative(hidden_layer_output)
更新权重
weights_hidden_output += hidden_layer_output.T.dot(d_predicted_output)
weights_input_hidden += inputs.T.dot(d_hidden_layer)
打印损失
if epoch % 1000 == 0:
print(f"Epoch {epoch