机器学习中的数字识别

2025年3月17日 | 阅读 14 分钟

在当今数字时代,每秒都会产生大量数据,准确识别和分类数字的能力具有巨大的价值。无论是自动化表单处理、光学字符识别,还是增强各种应用程序中的用户体验,数字识别都发挥着至关重要的作用。

从本质上讲,数字识别是识别和分类手写或打印数字的过程。传统上,这项任务需要复杂的算法和大量的体力劳动。然而,随着机器学习技术的出现,我们现在可以通过在大规模标记数字数据集上训练模型来实现这一过程的自动化。

机器学习算法使我们能够从未经处理的输入数据中提取有价值的特征并理解模式和联系。在数字识别领域,卷积神经网络 (CNN) 已成为强大的工具。CNN 模仿人类视觉系统,在检测和辨别图像中的模式方面表现出熟练程度。通过在包含标记数字的数据集上训练这些模型,它们获得了准确识别和分类数字的能力。

使用机器学习进行数字识别的应用

数字识别在各个行业都有广泛的应用。在银行业,它能够实现自动支票处理,使交易更快、更高效。在邮政服务中,它通过识别邮政编码在自动化分拣过程中发挥关键作用。此外,数字识别还应用于文档分析领域,它有助于从表格、发票和其他手写文档中提取信息。它还在医疗保健领域找到了应用,协助分析医疗记录和处方数字化。

现在我们将尝试使用机器学习将数字识别实现为代码。

代码

导入库

数据准备

数据准备是任何机器学习项目中至关重要的一步。它涉及将原始数据转换为适合分析和建模的格式。此过程确保数据干净、一致,并准备好供机器学习算法使用。

加载数据


输出

Digit Recognition Using Machine Learning
Digit Recognition Using Machine Learning

我们有大约相等的 10 个数字的频率。

检查空值和缺失值

现在我们有必要执行检查空值和缺失值的任务。

输出

Digit Recognition Using Machine Learning

我们检查数据集是否存在任何损坏的图像或缺失值。幸运的是,数据集中没有缺失值,这使我们能够充满信心地进行操作。

规范化

我们应用灰度归一化以最大限度地减少光照变化的影响。此外,卷积神经网络 (CNN) 在训练范围从 0 到 1 而不是 0 到 255 的数据时,收敛速度往往更快。

重塑

训练图像最初表示为 784 个值的 1D 向量,已存储在 pandas DataFrame 中。然后我们将数据重塑为 28x28x1 大小的 3D 矩阵。

在 MNIST 数据集中使用的灰度图像的情况下,只需要一个通道。但是,对于具有三个颜色通道的 RGB 图像,我们会将 784 像素向量重塑为 28x28x3 大小的 3D 矩阵,以容纳所有三个通道。

标签编码

我们数据集中的标签表示为从 0 到 9 的 10 位数字。为了在我们的机器学习模型中处理这些标签,我们需要将它们编码为 one-hot 向量。例如,标签“2”将被编码为 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],其中“1”表示相应的数字,其他位置填充“0”以表示剩余的数字。

分割数据集


我们决定将训练集分为两部分:一小部分(10%)将用作验证集来评估模型,其余部分(90%)将用于训练模型。

由于我们总共有 42,000 张带有平衡标签的训练图像,因此训练集的随机分割不会导致任何标签在验证集中过度表示。然而,重要的是要注意,当使用不平衡数据集时,简单的随机分割可能导致验证过程中评估不准确。

为了解决这个问题,您可以使用 "train_test_split" 函数(在 sklearn >=0.17 版本中可用)中的 "stratify=True" 选项,以确保类分布在训练集和验证集中都得到保持。

更好地理解示例的一种方法是可视化图像并检查其相应的标签。通过可视化图像,我们可以获得数据的视觉表示并观察其特征,而标签则为我们提供有关其分类或类别的信息。这种视觉检查使我们能够更有效地解释和分析数据,从而获得洞察力并更深入地理解当前示例。

输出

Digit Recognition Using Machine Learning

模型

我们采用了 Keras 中的顺序 API,它允许我们一次添加一个层,从输入开始。

第一层是卷积 (Conv2D) 层,由一组可学习的滤波器组成。我们选择在前两个 Conv2D 层中使用 32 个滤波器,在其余两个层中使用 64 个滤波器。每个滤波器对图像的一部分应用一个转换,由核大小定义。然后将核滤波器矩阵应用于整个图像。这些滤波器可以看作是转换图像的一种方式。

CNN 可以从这些转换后的图像中提取相关特征,这些特征表示为特征图。

CNN 中下一个关键的层是池化 (MaxPool2D) 层。此层通过从相邻像素中选择最大值充当下采样滤波器。它有助于降低计算复杂性,并在一定程度上减轻过拟合。池化大小决定了每一步池化的区域,影响下采样的级别。通过结合卷积层和池化层,CNN 能够捕获图像的局部和全局特征。

为了防止过拟合,我们加入了 dropout 正则化。这种技术在训练过程中随机忽略层中的一部分节点(将其权重设置为零)。它引入了随机性,鼓励网络以分布式方式学习特征并提高泛化能力。

激活函数“relu”(修正器)为网络引入了非线性,增强了其学习能力。Flatten 层用于将最终特征图转换为 1D 向量。此展平步骤对于在卷积层和池化层之后使用全连接层是必需的。它结合了前几层识别出的所有局部特征。

最后,我们采用了两个全连接(Dense)层,它们类似于人工神经网络(ANN)分类器。在最后一层(Dense(10, activation="softmax"))中,网络为每个类别输出一个概率分布。

设置优化器和退火器

将层添加到模型后,我们需要配置一个评分函数、一个损失函数和一个优化算法。

损失函数用于衡量模型预测图像标签的准确性。它计算观察到的标签和预测的标签之间的错误率。对于具有两个以上类别的分类任务,我们使用一种特定形式的损失函数,称为“categorical_crossentropy”。

优化器是最关键的函数,因为它迭代地调整模型的参数,例如滤波器核值、权重和神经元的偏差,以最小化损失。我们选择 RMSprop 作为我们的优化器,它非常有效。RMSProp 更新是对 Adagrad 方法的修改,旨在减少激进的、单调递减的学习率。或者,我们可以使用随机梯度下降 (SGD) 优化器,但它往往比 RMSprop 慢。

度量函数“accuracy”用于评估我们模型的性能。它衡量模型预测正确标签的程度。值得注意的是,度量评估的结果在模型训练期间不使用;它们仅用于评估目的。


为了促进优化器更快地收敛到损失函数的全局最小值,我们为学习率 (LR) 实现了退火方法。

学习率决定了优化器在损失函数环境中移动时所采取的步长大小。较高的学习率会导致更大的步长和更快的收敛。然而,使用较高的学习率可能导致采样不佳,并且优化器可能会陷入局部最小值。

为了克服这个问题,我们在训练过程中采用了递减的学习率,以确保更有效地收敛到损失函数的全局最小值。

为了利用高学习率带来的更快计算优势,我们根据需要动态地每 X 步(epochs)降低学习率,特别是当准确性没有提高时。

我们利用 Keras.callbacks 模块中的 ReduceLROnPlateau 函数,如果准确率在 3 个 epoch 后没有提高,它会自动将学习率减半。这种方法帮助我们微调学习率并优化模型的性能。

数据增强

为了解决过拟合问题,我们采用了数据增强技术来扩展我们现有的手写数字数据集。这种方法涉及通过各种转换人工改变训练数据,以复制人们书写数字时发生的变化。

例如,我们考虑了数字未居中、比例变化(有些人写大数字或小数字)或图像旋转的情况。

数据增强技术涉及修改训练数据,同时保持标签不变,从而改变数组表示。流行的增强包括灰度化、水平和垂直翻转、随机裁剪、颜色抖动、平移、旋转等等。

通过对训练数据应用其中一些转换,我们显着增加了训练样本的数量,有效地使数据集翻倍甚至翻三倍。这种增强过程增强了我们模型的鲁棒性,使其能够更好地泛化并减轻过拟合的风险。

注意:通过数据增强实现的改进是显著的。在没有数据增强的情况下训练模型,我们获得了 98.114% 的准确率。然而,通过实施数据增强技术,我们能够显著提高模型的性能,从而获得令人印象深刻的 99.67% 的准确率。

为了增强训练数据,我们实施了几种转换,以引入变化并增加数据集的多样性。具体来说,我们选择了以下增强技术:

  • 随机旋转:我们随机将一些训练图像旋转 10 度。这有助于模型学习识别不同方向的数字,并提高其对书写风格变化的鲁棒性。
  • 随机缩放:我们随机对一些训练图像应用缩放效果,将其大小增加或减少 10%。这种变化使模型能够更好地处理数字在真实世界场景中可能出现的不同比例。
  • 随机水平位移:我们随机将图像水平位移其宽度的 10%。这模拟了图像中数字位置的变化,并增强了模型准确分类数字的能力,无论其水平位置如何。
  • 随机垂直位移:类似地,我们随机将图像垂直位移其高度的 10%。这引入了数字垂直位置的变化,并帮助模型很好地泛化到不同的垂直对齐方式。

我们特意选择不对图像进行垂直或水平翻转。这个决定是基于翻转对称数字(如 6 和 9)可能会导致误分类的事实。通过排除这些翻转,我们确保模型专注于学习数字的独特特征,而不会被对称相似性误导。

输出

Digit Recognition Using Machine Learning

评估模型

为了评估模型的性能,我们使用了验证集,其中包含模型在训练期间未见过的一组单独的图像。这使我们能够评估模型对新的和未见过的数据的泛化能力。

训练和验证曲线

输出

Digit Recognition Using Machine Learning

该模型的性能令人印象深刻,在短短 2 个 epoch 后,在验证数据集上的准确率达到了近 99%。值得注意的是,在整个训练过程中,验证准确率始终高于训练准确率。这表明我们的模型正在有效地泛化,并且没有过拟合训练集。

混淆矩阵

分析混淆矩阵使我们能够识别模型可能遇到困难或挑战的特定领域。这些信息有助于我们了解模型的局限性,并为潜在的改进提供指导。

为了实现这一点,我们根据验证结果绘制混淆矩阵,使我们能够可视化模型的性能并识别误分类中的任何模式或趋势。

输出

Digit Recognition Using Machine Learning

在我们对 CNN 模型的评估中,考虑到验证集的大小(由 4,200 张图像组成),我们观察到所有数字都表现出色,错误极少。

然而,我们确实注意到我们的 CNN 在对数字 4 进行分类时面临轻微挑战,因为它偶尔会将其错误分类为 9。这可以归因于当它们的曲线平滑且视觉相似时,区分这两个数字的固有难度。

尽管存在这个小问题,但总的来说,我们的 CNN 在识别和分类数据集中各种数字方面表现出令人印象深刻的准确性和熟练程度。

让我们更仔细地检查错误。

我们的目标是通过检查实际值和预测值在结果中的概率之间的差异来识别最显著的错误。这将使我们能够查明模型预测与真实值偏差最大的实例。

输出

Digit Recognition Using Machine Learning

最关键的错误也是最有趣的。在这六个案例中,模型的表现并非荒谬。其中一些错误也可能由人类造成,特别是在其中一个案例中,一个 9 与 4 非常相似。在我看来,最后一个 9 也很有误导性,因为它看起来更像一个 0。

使用机器学习进行数字识别的挑战与未来展望

虽然基于机器学习的数字识别取得了显著成功,但挑战依然存在。一个显著的挑战是处理书写风格变化的能力,尤其是在处理手写数字时。正在进行的研究侧重于提高模型的鲁棒性并解决这些挑战。研究人员正在探索数据增强等技术,通过人工扩展训练数据集以包含书写风格、比例和方向的变化。此外,深度学习的进步,如循环神经网络的集成,有望提高数字识别的准确性。

结论

使用机器学习进行数字识别通过自动化和简化涉及数字识别和分类的过程,彻底改变了各个行业。借助卷积神经网络和其他机器学习算法的力量,我们见证了数字识别准确性的显著进步。随着研究和技术的不断发展,我们可以期待更复杂的模型能够处理书写风格的复杂变化。数字识别无疑是一个将继续蓬勃发展的领域,为各种应用做出重大贡献,并塑造人工智能的未来。