用 Python 从零实现一个简单神经网络算法(含原理 + 代码 + 可视化讲解)
神经网络由输入层、隐藏层和输出层组成,核心是通过前向传播计算预测值,反向传播调整权重以最小化损失函数。常用激活函数如Sigmoid解决非线性问题,损失函数如均方误差(MSE)衡量预测偏差。
·
神经网络基础原理
神经网络由输入层、隐藏层和输出层组成,核心是通过前向传播计算预测值,反向传播调整权重以最小化损失函数。常用激活函数如Sigmoid解决非线性问题,损失函数如均方误差(MSE)衡量预测偏差。
核心代码实现
1. 初始化网络参数
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.W1 = np.random.randn(input_size, hidden_size) * 0.01
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size) * 0.01
self.b2 = np.zeros((1, output_size))
2. 激活函数与损失计算
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def mse_loss(self, y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
3. 前向传播
def forward(self, X):
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = self.sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
return self.z2 # 线性输出(回归任务)
4. 反向传播
def backward(self, X, y, lr=0.01):
m = X.shape[0]
dz2 = self.z2 - y
dW2 = np.dot(self.a1.T, dz2) / m
db2 = np.sum(dz2, axis=0, keepdims=True) / m
da1 = np.dot(dz2, self.W2.T)
dz1 = da1 * self.a1 * (1 - self.a1)
dW1 = np.dot(X.T, dz1) / m
db1 = np.sum(dz1, axis=0, keepdims=True) / m
self.W1 -= lr * dW1
self.b1 -= lr * db1
self.W2 -= lr * dW2
self.b2 -= lr * db2
可视化训练过程
训练代码示例
import matplotlib.pyplot as plt
nn = NeuralNetwork(2, 4, 1)
losses = []
for epoch in range(1000):
y_pred = nn.forward(X)
loss = nn.mse_loss(y, y_pred)
nn.backward(X, y, lr=0.1)
losses.append(loss)
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Curve')
plt.show()
应用示例(异或问题)
数据准备与训练
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
nn = NeuralNetwork(2, 2, 1)
for _ in range(5000):
nn.forward(X)
nn.backward(X, y, lr=0.1)
print("Predictions:", nn.forward(X))
关键点说明
- 权重初始化使用小随机数避免梯度消失
- 学习率(
lr)需手动调整,过大导致震荡,过小收敛慢 - 隐藏层神经元数量影响模型容量,需根据任务调整
- 可视化损失曲线可监控训练是否收敛
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)