神经网络分类简介
神经网络是一种人工智能技术,它是由神经元组成的网络,可以模拟人脑的工作方式。所以,它可以被用于各种各样的任务,其中包括分类问题。在本文中,我们将学习如何使用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数据集进行训练和测试。最后,我们使用模型进行了预测。神经网络的分类问题在实践中非常常见,因此对于想要学习深度学习的人来说,这是一个极好的起点。