📜  用Python实现人工神经网络训练过程(1)

📅  最后修改于: 2023-12-03 15:40:52.738000             🧑  作者: Mango

用Python实现人工神经网络训练过程

人工神经网络是一种能够学习抽象概念和进行分类、识别等复杂任务的算法。Python是一种广泛使用的编程语言,提供了丰富的机器学习库。在这篇文章中,我们将介绍如何使用Python实现人工神经网络的训练过程。

准备工作

在开始编写Python代码之前,需要安装Python编程语言和相关的机器学习库。常见的Python机器学习库包括:

  • NumPy
  • Pandas
  • Scikit-learn
  • TensorFlow
  • PyTorch

其中,NumPy和Pandas是Python中最常用的数值计算和数据处理库,Scikit-learn提供了简单易用的机器学习算法接口,TensorFlow和PyTorch则是深度学习框架,提供了复杂的神经网络模型和高效的计算图支持。

构建神经网络模型

我们将使用Python编写一个简单的人工神经网络,用于实现二分类任务。该神经网络拥有三层结构:输入层、隐藏层和输出层。

import numpy as np

class NeuralNetwork:
    def __init__(self, n_input, n_hidden, n_output):
        self.weights1 = np.random.rand(n_input, n_hidden)
        self.weights2 = np.random.rand(n_hidden, n_output)
        self.bias1 = np.random.rand(n_hidden)
        self.bias2 = np.random.rand(n_output)

    def forward(self, x):
        z1 = np.dot(x, self.weights1) + self.bias1
        a1 = self.sigmoid(z1)
        z2 = np.dot(a1, self.weights2) + self.bias2
        a2 = self.sigmoid(z2)
        return a2

    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))

以上代码定义了一个名为NeuralNetwork的类,该类包含三个参数:输入层神经元数量、隐藏层神经元数量和输出层神经元数量。在初始化方法中,我们使用np.random.rand()方法随机初始化神经网络的权重和偏差。在前向传播方法中,我们使用所定义的sigmoid()函数计算神经元的输出值。

定义损失函数

在训练神经网络时,我们需要定义一个损失函数来衡量模型预测结果和实际结果之间的差距。在本例中,我们将使用交叉熵损失函数(Cross Entropy Loss)。

class NeuralNetwork:
    ...

    def loss(self, x, y):
        y_pred = self.forward(x)
        return -np.sum(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))

loss()方法中,我们将神经网络的输出值y_pred和实际结果y之间的交叉熵损失函数作为返回值。

定义反向传播算法

反向传播算法用于更新神经网络的权重和偏差,使得神经网络的预测结果更接近实际结果。该算法的核心思想是对每个权重和偏差计算其对损失函数的偏导数,然后根据梯度下降法更新权重和偏差。

class NeuralNetwork:
    ...

    def backward(self, x, y, learning_rate):
        y_pred = self.forward(x)
        delta2 = y_pred - y
        d_weights2 = np.dot(self.a1.T, delta2)
        d_bias2 = delta2
        delta1 = np.dot(delta2, self.weights2.T) * self.sigmoid_derivative(self.a1)
        d_weights1 = np.dot(x.T, delta1)
        d_bias1 = delta1
        self.weights1 -= learning_rate * d_weights1
        self.bias1 -= learning_rate * d_bias1
        self.weights2 -= learning_rate * d_weights2
        self.bias2 -= learning_rate * d_bias2

    def sigmoid_derivative(self, x):
        return x * (1 - x)

backward()方法中,我们根据神经网络的前向传播结果y_pred和实际结果y计算输出层的误差delta2,然后计算输出层权重和偏差的梯度d_weights2d_bias2。接着,我们计算隐藏层的误差delta1,以及隐藏层权重和偏差的梯度d_weights1d_bias1。最后,我们根据学习率(learning rate)使用梯度下降法更新神经网络的所有参数。

训练神经网络

现在,我们可以使用定义的神经网络模型、损失函数和反向传播算法训练人工神经网络了。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=1000, n_features=10, n_classes=2)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

nn = NeuralNetwork(n_input=10, n_hidden=5, n_output=1)

epochs = 10
learning_rate = 0.1

for i in range(epochs):
    for j in range(len(X_train)):
        nn.backward(X_train[j], y_train[j], learning_rate)
    loss = nn.loss(X_train, y_train)
    print(f"Epoch {i+1}/{epochs}, loss: {loss:.3f}")

以上代码使用Scikit-learn库的make_classification()方法生成一个用于分类任务的人工数据集,并将其分为训练集和测试集。然后,我们使用NeuralNetwork类构建一个神经网络模型,并定义迭代的轮数(epochs)和学习率(learning rate)。在每个轮次中,我们使用训练集数据计算神经网络的损失函数并更新神经网络的权重和偏差。最终,我们输出每个轮次的损失函数值。

总结

在本文中,我们介绍了如何使用Python实现人工神经网络的训练过程。我们定义了神经网络模型、损失函数和反向传播算法,并使用Scikit-learn库生成了一个人工数据集用于分类任务。最终,我们使用训练集数据训练神经网络,并输出每个轮次的损失函数值。通过这篇文章的学习,你可以有效地使用Python编写人工神经网络模型和训练算法,并将其应用到各种实际问题中去。