在本教程中,将探讨如何创建和训练一个简单的卷积神经网络(CNN),用于从流行的MNIST数据集中对手写数字进行分类。
虽然本教程将详细解释每一步,但如果已经对CNN的工作原理有一些理论基础,将会大有裨益。此外,如果对TensorFlow有所了解,那也是极好的,尽管这不是必需的。
对于新接触这个概念的人来说,CNN是一种深度学习技术,可以在提供正确数据后自动对输入进行分类。多年来,CNN在计算机视觉中的图像分类方面取得了良好的效果,现在也被用于医疗保健领域。这表明CNN是一种可靠的深度学习算法,用于自动化的端到端预测。CNN本质上是从给定输入中自动提取“有用”的特征,使任务变得非常简单!
一个CNN模型由三个主要层组成:卷积层、池化层和全连接层。
(1) 卷积层:这一层从输入数据中提取高级输入特征,并将这些特征以特征图的形式传递到下一层。
(2) 池化层:它用于通过在特征图上应用池化来降低数据的维度,生成具有降低维度的新特征图。池化层可以取旧特征图中给定步长内的最大值或平均值。
(3) 全连接层:最后,分类任务由全连接层完成。通过一个流行的激活函数——softmax函数,为每个类别标签计算概率分数。
这里使用的是MNIST数字分类数据集。Keras是一个用Python编写的深度学习API,MNIST是这个API提供的数据集之一。该数据集包含60,000张训练图像和10,000张测试图像。对于需要进行模式识别的个人来说,这是一个不错的数据集,因为很快就会进行这样的操作!
这里使用的语言是Python。将使用Google Colab来编写和执行Python代码。也可以选择使用Jupyter Notebook。选择Google Colab是因为它提供了随时随地访问笔记本的便利。也可以将Colab笔记本连接到GitHub仓库。
# 加载必要的库
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
如前所述,这个数据集返回四个值,顺序与上述相同。此外,x_train, y_train, x_test, 和 y_test是训练和测试数据集的表示。要了解数据集是如何被划分为训练和测试的,请查看下图,在一次讨论中使用过。
数据需要被处理、清理和纠正,以提高其质量。CNN将从不含任何空值、所有数值数据且已缩放的数据集中学到最好。因此,将执行一些步骤,以确保数据集完全适合CNN模型学习。
# 缩放训练和测试数据集
X_train = X_train / 255.0
X_test = X_test / 255.0
# 将2D矩阵转换为1D数组
X_train = X_train.reshape(-1, 28, 28, 1) # 训练集
X_test = X_test.reshape(-1, 28, 28, 1) # 测试集
现在数据集看起来不错了,是时候创建一个卷积神经网络了。
让使用TensorFlow库创建一个CNN模型。模型的创建如下:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
convolutional_neural_network = Sequential([
Conv2D(filters=25, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D((2, 2)),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPooling2D((2, 2)),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPooling2D((2, 2)),
Flatten(),
Dense(64, activation='relu'),
Dense(10, activation='softmax')
])
花点时间让这段代码完全理解。这很重要,需要理解它的每一个部分。在上面创建的CNN模型中,有一个输入层,后面跟着两个隐藏层,最后是一个输出层。用最简单的话说,激活函数负责决定是否向前移动。在像CNN这样的深度神经网络中,有许多神经元,基于激活函数,神经元被激活,网络向前移动。如果对激活函数不太了解,可以使用'relu',因为它是最流行的。
一旦模型创建完成,就是时候编译它并拟合模型了。在拟合过程中,模型将遍历数据集并理解关系。它将在定义的次数中学习。在示例中,定义了10个周期。在过程中,CNN模型将学习并在每个周期中犯错误。对于模型犯的每个错误(即,错误的预测),都有一个惩罚,这在每个周期的损失值中表示(见下面的GIF)。简而言之,模型应该在最后一个周期结束时产生尽可能少的损失和尽可能高的准确度。
为了评估创建的CNN模型,可以运行:
convolutional_neural_network.evaluate(X_test, y_test)
是时候使用测试数据集来看看CNN模型的表现如何了。
y_predicted_by_model = convolutional_neural_network.predict(X_test)
上述代码将使用卷积神经网络模型对测试数据集进行预测,并将结果存储在y_predicted_by_model数据框中。对于10个可能的数字,将计算概率分数。具有最高概率分数的类别是模型所做的预测。例如,如果想查看测试集中第一行的数字是什么:
y_predicted_by_model[0]
输出将是这样的:
array([3.4887790e-09, 3.4696127e-06, 7.7428967e-07, 2.9782784e-08,
6.3373392e-08, 6.1983449e-08, 7.4500317e-10, 9.9999511e-01,
4.2418694e-08, 3.8616824e-07], dtype=float32)
import numpy as np
np.argmax(y_predicted[0])