如何在Python中使用神经网络进行分类?

神经网络分类简介

神经网络是一种人工智能技术,它是由神经元组成的网络,可以模拟人脑的工作方式。所以,它可以被用于各种各样的任务,其中包括分类问题。在本文中,我们将学习如何使用Python中的神经网络进行分类。

准备工作

安装

在使用Python中的神经网络进行分类之前,必须先安装相应的库。在这篇文章中,我们会使用Keras这个开源的神经网络库来构建我们的分类模型。其他的Python库,如NumPy和Matplotlib,也将被使用。要安装这些库,可以在命令行中运行以下命令:

pip install keras numpy matplotlib

安装完成后,我们将能够导入这些库,并在Python脚本中使用它们。

数据集

在进行分类之前,需要一个数据集。在这篇文章中,我们将使用MNIST手写数字数据集。这个数据集中包含60000张28x28像素的灰度图像,它们被用来训练模型。同时还有10000张测试图像,用来评估模型的准确性。

要在Python脚本中使用MNIST数据集,我们可以使用Keras内置的函数来加载数据集。 在这篇文章中,我们将使用以下代码:

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

这个代码将会下载MNIST数据集到本地机器,并将训练数据和测试数据分别加载到train_images和test_images中。train_labels和test_labels中包含的是相应图像的标签(0到9之间的数字)。

现在,我们已经准备好开始构建分类模型了。

构建分类模型

神经网络架构

在构建我们的分类模型之前,需要先确定网络架构。在这篇文章中,我们将使用一个简单的神经网络架构:

输入层:这个层次将会接收28x28个像素的图像,它们将被作为一个展平的1D数组的形式传入网络中。因此,输入层有784个神经元。

隐藏层:在这个网络中,只有一个隐藏层,它有128个神经元。ReLU(修正线性单元)是这个层中使用的激活函数。这一个隐藏层很好的解决了此问题。多个隐藏层更可能会在此问题上表现得更好,但是由于这个问题相对简单,所以一个隐藏层已经足够了。

输出层:这个层次有10个神经元,每个神经元代表图像是其对应标签的概率。激活函数是softmax。

下面的代码定义了这个网络:

from keras import models

from keras import layers

from keras.utils import to_categorical

network = models.Sequential()

network.add(layers.Dense(128, activation='relu', input_shape=(28 * 28,)))

network.add(layers.Dense(10, activation='softmax'))

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

这段代码首先创建了一个序列模型。然后,一个有128个神经元的隐藏层被添加到网络中,它有一个输入形状为784的平成层。这个输入形状就代表28×28=784个像素。最后,10个神经元的输出层被添加到网络中,每个神经元都代表一种数字,激活函数为softmax函数,在这个输出层中完成了数字分类的工作。

训练模型

现在已经定义了网络结构,接下来是训练它。我们需要将训练数据输入到模型中,在此过程中模型自动进行反向传播和权重更新。

在这篇文章中,我们将训练模型20个epochs,每个epoch的batch size为128。

为了准备数据,需要将PIXEL的值中心化并缩小到0~1之间。我们还需要将标签编码为one-hot格式。这些都可以通过以下代码完成:

train_images = train_images.reshape((60000, 28 * 28))

train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))

test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)

test_labels = to_categorical(test_labels)

模型可以使用以下代码进行训练:

history = network.fit(train_images, train_labels, epochs=20, batch_size=128, validation_data=(test_images, test_labels))

请注意,这段代码还将测试数据用于验证。这可以用来在训练过程中提高模型的准确性。

评估模型

现在我们已经完成了训练,接下来是评估模型的效果。在这里,我们使用测试集来测试模型的性能。测试数据集中的每个图像将被输入到模型中,模型会预测其数字,并将预测结果与标签进行比较,以计算模型的准确度。

可以使用以下代码进行评估:

test_loss, test_acc = network.evaluate(test_images, test_labels)

print('test_acc:', test_acc)

对于我们的模型来说,它的测试准确度在98%左右。由于MNIST数据集相对简单,这个准确度已经很高了。

使用模型进行预测

最后,让我们使用模型进行预测。当我们将一个新图像输入到模型中时,它将输出一个包含每个数字概率的向量。我们可以使用以下代码获取模型对新图像的预测:

import numpy as np

img = test_images[0]

img = (np.expand_dims(img, 0))

predictions_single = network.predict(img)

print(predictions_single)

这个代码会输出一个包含10个数字的向量。最大值即代表了网络的预测结果。

在本文中,我们学习了如何使用Python中的神经网络进行分类。我们使用了简单的神经网络架构,并使用了MNIST数据集进行训练和测试。最后,我们使用模型进行了预测。神经网络的分类问题在实践中非常常见,因此对于想要学习深度学习的人来说,这是一个极好的起点。

后端开发标签