写出一段神经网络的简单代码并逐行解释
时间: 2023-05-16 11:07:50 浏览: 88
好的,以下是一段简单的神经网络代码:
```
import numpy as np
# 定义输入数据
X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
# 定义输出数据
y = np.array([[0], [1], [1], [0]])
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义神经网络
class NeuralNetwork:
def __init__(self):
# 初始化权重
self.weights1 = np.random.rand(3, 4)
self.weights2 = np.random.rand(4, 1)
def forward(self, X):
# 前向传播
self.layer1 = sigmoid(np.dot(X, self.weights1))
self.output = sigmoid(np.dot(self.layer1, self.weights2))
return self.output
def backward(self, X, y, output):
# 反向传播
self.output_error = y - output
self.output_delta = self.output_error * sigmoid(output, derivative=True)
self.layer1_error = self.output_delta.dot(self.weights2.T)
self.layer1_delta = self.layer1_error * sigmoid(self.layer1, derivative=True)
self.weights2 += self.layer1.T.dot(self.output_delta)
self.weights1 += X.T.dot(self.layer1_delta)
def train(self, X, y):
# 训练神经网络
for i in range(10000):
output = self.forward(X)
self.backward(X, y, output)
# 实例化神经网络
nn = NeuralNetwork()
# 训练神经网络
nn.train(X, y)
# 预测结果
print(nn.forward(np.array([1, 0, 0])))
```
逐行解释:
1. `import numpy as np`:导入 NumPy 库并将其重命名为 np。
2. `X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])`:定义输入数据 X,其中包含四个样本,每个样本有三个特征。
3. `y = np.array([[0], [1], [1], [0]])`:定义输出数据 y,其中包含四个样本的标签。
4. `def sigmoid(x):`:定义 sigmoid 激活函数。
5. `return 1 / (1 + np.exp(-x))`:sigmoid 函数的具体实现。
6. `class NeuralNetwork:`:定义神经网络类。
7. `def __init__(self):`:定义神经网络类的初始化方法。
8. `self.weights1 = np.random.rand(3, 4)`:初始化第一层权重,其中有三个输入特征和四个隐藏层神经元。
9. `self.weights2 = np.random.rand(4, 1)`:初始化第二层权重,其中有四个隐藏层神经元和一个输出神经元。
10. `def forward(self, X):`:定义前向传播方法。
11. `self.layer1 = sigmoid(np.dot(X, self.weights1))`:计算第一层的输出,其中 np.dot 表示矩阵乘法。
12. `self.output = sigmoid(np.dot(self.layer1, self.weights2))`:计算输出层的输出。
13. `return self.output`:返回输出层的输出。
14. `def backward(self, X, y, output):`:定义反向传播方法。
15. `self.output_error = y - output`:计算输出误差。
16. `self.output_delta = self.output_error * sigmoid(output, derivative=True)`:计算输出层的 delta 值。
17. `self.layer1_error = self.output_delta.dot(self.weights2.T)`:计算隐藏层的误差。
18. `self.layer1_delta = self.layer1_error * sigmoid(self.layer1, derivative=True)`:计算隐藏层的 delta 值。
19. `self.weights2 += self.layer1.T.dot(self.output_delta)`:更新第二层权重。
20. `self.weights1 += X.T.dot(self.layer1_delta)`:更新第一层权重。
21. `def train(self, X, y):`:定义训练方法。
22. `for i in range(10000):`:进行 10000 次迭代。
23. `output = self.forward(X)`:进行前向传播。
24. `self.backward(X, y, output)`:进行反向传播。
25. `nn = NeuralNetwork()`:实例化神经网络。
26. `nn.train(X, y)`:训练神经网络。
27. `print(nn.forward(np.array([1, 0, 0])))`:预测结果。
阅读全文