我很乐意为您提供使用NumPy从头开始实现神经网络的完整攻略,并且会提供两个示例。
1. 导入 NumPy 库
首先,要使用 numpy 库创建数组、矩阵和向量等等,需要导入该库。可以使用下面的代码导入 numpy 库:
import numpy as np
2. 创建神经网络模型
接下来,需要创建一个神经网络模型。在这个模型中,我们需要指定一些参数,例如输入层的数量、隐藏层的数量、输出层的数量、学习速率、迭代次数、激活函数等等。下面是一个示例:
class NeuralNetwork:
def __init__(self, input_layer_size, hidden_layer_size, output_layer_size, learning_rate, num_iterations):
self.input_layer_size = input_layer_size
self.hidden_layer_size = hidden_layer_size
self.output_layer_size = output_layer_size
self.learning_rate = learning_rate
self.num_iterations = num_iterations
# 初始化权重矩阵
self.W1 = np.random.randn(self.input_layer_size, self.hidden_layer_size)
self.W2 = np.random.randn(self.hidden_layer_size, self.output_layer_size)
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def forward(self, X):
# 计算第一层
self.z2 = np.dot(X, self.W1)
self.a2 = self.sigmoid(self.z2)
# 计算输出层
self.z3 = np.dot(self.a2, self.W2)
y_hat = self.sigmoid(self.z3)
return y_hat
3. 训练神经网络
接下来,要训练神经网络。训练神经网络的目的是将神经网络的输出与目标输出尽可能的接近。在每一次迭代中,都需要计算输出误差,并反向传播误差来更新权重。下面是一个示例:
class NeuralNetwork:
# ...之前的代码保留
def backward(self, X, y, y_hat):
delta3 = (y - y_hat) * (y_hat * (1 - y_hat))
dW2 = np.dot(self.a2.T, delta3)
delta2 = np.dot(delta3, self.W2.T) * (self.a2 * (1 - self.a2))
dW1 = np.dot(X.T, delta2)
# 更新权重矩阵
self.W2 += self.learning_rate * dW2
self.W1 += self.learning_rate * dW1
def train(self, X, y):
for i in range(self.num_iterations):
y_hat = self.forward(X)
self.backward(X, y, y_hat)
示例1:使用神经网络进行二分类
下面是一个使用神经网络进行二分类的示例:
X = np.array([[1, 1], [1, 0], [0, 1], [0, 0]]) # 输入数据
y = np.array([[1], [0], [0], [1]]) # 目标输出
nn = NeuralNetwork(input_layer_size=2, hidden_layer_size=3, output_layer_size=1, learning_rate=0.1, num_iterations=10000)
nn.train(X, y)
# 判断准确率
for i in range(X.shape[0]):
if nn.forward(X[i]) > 0.5:
print(f'{X[i]} predicts 1')
else:
print(f'{X[i]} predicts 0')
示例2:使用神经网络进行回归预测
下面是一个使用神经网络进行回归预测的示例:
X = np.random.uniform(-1.0, 1.0, size=(100, 1))
y = np.sin(3 * X)
nn = NeuralNetwork(input_layer_size=1, hidden_layer_size=10, output_layer_size=1, learning_rate=0.1, num_iterations=10000)
nn.train(X, y)
# 展示预测曲线
import matplotlib.pyplot as plt
X_test = np.linspace(-1, 1, 100).reshape(-1, 1)
y_test = np.sin(3 * X_test)
fig, ax = plt.subplots()
ax.plot(X_test, y_test, label='sin(3x)')
ax.plot(X_test, nn.forward(X_test), label='NN')
ax.legend()
plt.show()
以上就是从头开始使用 NumPy 实现神经网络的完整攻略,希望对您有所帮助。