使用NumPy从头开始实现神经网络

  • Post category:Python

我很乐意为您提供使用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 实现神经网络的完整攻略,希望对您有所帮助。