1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| # 示例2:简单神经网络实现
def simple_neural_network():
"""
实现一个单隐藏层神经网络解决XOR问题
解决问题:非线性分类问题(线性模型无法解决)
"""
import numpy as np
# XOR数据集
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[0], [1], [1], [0]])
# 初始化参数
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))
# 前向传播函数
def forward(x):
z1 = np.dot(x, W1) + b1
a1 = np.tanh(z1) # 激活函数
z2 = np.dot(a1, W2) + b2
a2 = 1 / (1 + np.exp(-z2)) # sigmoid输出
return a2
# 训练网络
learning_rate = 0.1
for epoch in range(10000):
# 前向传播
z1 = np.dot(X, W1) + b1
a1 = np.tanh(z1)
z2 = np.dot(a1, W2) + b2
a2 = 1 / (1 + np.exp(-z2))
# 反向传播
error = a2 - y
d_z2 = error * a2 * (1 - a2)
d_W2 = np.dot(a1.T, d_z2)
d_b2 = np.sum(d_z2, axis=0, keepdims=True)
d_a1 = np.dot(d_z2, W2.T)
d_z1 = d_a1 * (1 - np.power(a1, 2))
d_W1 = np.dot(X.T, d_z1)
d_b1 = np.sum(d_z1, axis=0, keepdims=True)
# 更新参数
W1 -= learning_rate * d_W1
b1 -= learning_rate * d_b1
W2 -= learning_rate * d_W2
b2 -= learning_rate * d_b2
# 测试网络
test_input = np.array([[1, 0]])
prediction = forward(test_input)
print(f"输入 {test_input} 的预测结果: {prediction[0][0]:.3f}")
return W1, b1, W2, b2
# 说明:这个示例展示了神经网络如何解决非线性问题,
# 包含前向传播、反向传播和参数更新等核心概念,
# 是理解深度学习模型工作原理的关键。
|