本文将手把手带你用 Python + Numpy 实现一个最基础的人工神经网络(Artificial Neural Network, ANN)。不依赖任何深度学习框架,适合入门理解神经网络的本质。
一、项目目标
构建一个三层神经网络(输入层、隐藏层、输出层),用于解决一个简单的二分类任务,例如根据两个输入特征判断输出是 0 还是 1。
二、基本结构说明
我们将构建如下结构的神经网络:
复制编辑
输入层(2个神经元) → 隐藏层(4个神经元) → 输出层(1个神经元)
-
激活函数:使用 Sigmoid
-
损失函数:均方误差
-
学习方式:批量梯度下降 + 手动反向传播
三、准备数据
我们使用一个简单的数据集(可类比于 AND/OR 操作):
python
import numpy as np
# 输入数据:4组样本,每组2个特征
X = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
])
# 标签:这里我们尝试模拟逻辑或(OR)操作
y = np.array([[0], [1], [1], [1]])
四、初始化网络参数
python
np.random.seed(0)
# 网络结构:2 → 4 → 1
input_size = 2
hidden_size = 4
output_size = 1
# 权重初始化(正态分布)
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
五、激活函数
python
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
# 输入为 sigmoid 的输出值
return x * (1 - x)
六、训练循环
我们进行 10000 次迭代,手动实现前向传播、损失计算和反向传播。
python
learning_rate = 0.1
for epoch in range(10000):
# --- 正向传播 ---
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2) # 预测值
# --- 损失计算(均方误差)---
loss = np.mean((y - a2) ** 2)
# --- 反向传播 ---
error_output = y - a2
d_output = error_output * sigmoid_derivative(a2)
error_hidden = d_output.dot(W2.T)
d_hidden = error_hidden * sigmoid_derivative(a1)
# --- 参数更新 ---
W2 += a1.T.dot(d_output) * learning_rate
b2 += np.sum(d_output, axis=0, keepdims=True) * learning_rate
W1 += X.T.dot(d_hidden) * learning_rate
b1 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate
if epoch % 1000 == 0:
print(f"Epoch {epoch}, Loss: {loss:.4f}")
七、模型测试
python
print("预测结果:")
print(a2.round())
输出如下,接近 OR 操作的结果 [0, 1, 1, 1]
:
Lua
预测结果:
[[0.]
[1.]
[1.]
[1.]]
八、总结与拓展
通过这篇文章,我们实现了一个从零开始的神经网络:
-
完整构建了网络结构(无需框架)
-
实现了正向传播与反向传播
-
成功对二分类任务进行了拟合
拓展建议:
-
改用 ReLU 激活函数;
-
增加网络层数,提升模型表达能力;
-
用 Softmax 处理多分类问题;
-
尝试用真实数据集,如鸢尾花(Iris)或 MNIST。
这类"纯手写"的 ANN 实战项目非常适合用来理解深度学习的本质机制。如果你打算继续深入,可以尝试逐步迁移到 PyTorch 或 TensorFlow 框架实现更复杂的模型。