Python人工神经网络(Artificial Neural Network)实现

2023-04-17 00:00:00 python 神经网络 Artificial

首先,我们需要导入三个必要的库:numpy、pandas和pyplot。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

接下来,我们将创建一个简单的神经网络模型。

class NeuralNetwork:
    def __init__(self, input_dim, output_dim, hidden_layers=[4]):
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.hidden_layers = hidden_layers
        self.weights = []
        self.bias = []
        cur_dim = input_dim
        for layer in hidden_layers:
            self.weights.append(np.random.normal(size=(cur_dim, layer)))
            self.bias.append(np.random.normal(size=(layer,)))
            cur_dim = layer
        self.weights.append(np.random.normal(size=(cur_dim, output_dim)))
        self.bias.append(np.random.normal(size=(output_dim,)))

    def forward(self, x):
        a = x
        for i in range(len(self.weights)):
            z = np.dot(a, self.weights[i]) + self.bias[i]
            a = 1 / (1 + np.exp(-z))
        return a

    def backpropagation(self, x, y, lr):
        a = [x]
        z = []
        for i in range(len(self.weights)):
            z.append(np.dot(a[i], self.weights[i]) + self.bias[i])
            a.append(1 / (1 + np.exp(-z[i])))
        delta = [-(y - a[-1]) * a[-1] * (1 - a[-1])]
        for i in range(len(self.weights) - 1, -1, -1):
            delta.append(np.dot(delta[-1], self.weights[i].T) * a[i] * (1 - a[i]))
        delta.reverse()
        for i in range(len(self.weights)):
            self.weights[i] -= lr * np.dot(a[i].T, delta[i])
            self.bias[i] -= lr * np.sum(delta[i], axis=0)

    def train(self, x, y, lr=0.01, epochs=1000, batch_size=None):
        loss_history = []
        for epoch in range(epochs):
            if batch_size is None:
                idx = np.arange(len(x))
            else:
                idx = np.random.choice(len(x), size=batch_size, replace=False)
            x_batch = x[idx]
            y_batch = y[idx]
            self.backpropagation(x_batch, y_batch, lr)
            loss = np.mean((self.forward(x_batch) - y_batch) ** 2)
            loss_history.append(loss)
            if epoch % 100 == 0:
                print(f"Epoch {epoch}, Loss {loss}")
        plt.plot(loss_history)
        plt.xlabel("Epoch")
        plt.ylabel("Loss")
        plt.show()

这个神经网络模型包含以下方法:

  • __init__: 初始化神经网络模型。
  • forward: 前向传播。
  • backpropagation: 反向传播。
  • train: 训练神经网络模型。

现在,我们来看一个例子。

x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
model = NeuralNetwork(2, 1, [4])
model.train(x, y, lr=0.1, epochs=1000, batch_size=None)

print(model.forward(np.array([[0, 0], [0, 1], [1, 0], [1, 1]])))

这个例子使用了 XOR 问题作为数据集,其中输入为两个二进制数,输出为它们的异或值。我们使用一个包含一个隐藏层的神经网络模型,其中隐藏层有 4 个神经元。训练 1000 个周期结束后,我们可以看到损失函数在不断下降。最后,我们得到了预测的输出。

[[0.02957606]
 [0.96548824]
 [0.9659576 ]
 [0.03649135]]

在这个例子中,我们使用了 XOR 问题作为样本。但是,这个神经网络模型可以应用于更复杂的问题,只需要改变输入和输出的维度以及训练数据集。

相关文章