基于卷积神经网络模型的手写数字识别

基于卷积神经网络模型的手写数字识别

  • 一. 前言
  • 二. 设计目的及任务描述
    • 2.1 设计目的
    • 2.2 设计任务
  • 三. 神经网络模型
    • 3.1 卷积神经网络模型方案
    • 3.2 卷积神经网络模型训练过程
    • 3.3 卷积神经网络模型测试
  • 四. 程序设计

一. 前言

手写数字识别要求利用MNIST数据集里的70000张手写体数字的图像,建立神经网络模型,进行0到9的分类,并能够对其他来源的图片进行识别,识别准确率大于97%。图片示例如下。
基于卷积神经网络模型的手写数字识别_第1张图片

图1-1 mnist数据集图片示例

该设计要求学生基于TensorFlow深度学习平台,利用自动下载的MNIST数据集,建立全连接或者CNN神经网络模型,对MNIST或者其他图片中的数字进行正确识别。同时,在数据获取、处理和分析过程中考虑数据安全、技术经济、工程伦理、行业规范等要素。

通过该题目的训练,使学生对深度学习技术有一定的了解,掌握深度学习模型建立、训练、测试和调优的过程,理解监督学习、数据处理、神经网络、卷积计算等概念并通过实例进行实践,学习TensorFlow并搭建深度学习平台,加深学生对深度学习技术的理解和实际引用,并能够利用深度学习方法解决实际问题。

二. 设计目的及任务描述

2.1 设计目的

深入学习TensorFlow深度学习平台,通过构建全连接神经网络和卷积神经网络的手写数字识别模型,实现对MNIST数据集中的数字0到9的分类,并具备对其他来源的图片进行准确识别的能力,要求识别准确率大于97%。这一设计旨在深入理解深度学习技术,并掌握模型的建立、训练、测试和调优的全过程。

首先,进行文献资料查阅,至少阅读5篇相关文献,以确保对深度学习领域的最新进展有所了解。通过文献的学习,将为设计过程提供前沿的理论支持,在实践中融入最新的研究成果。

学习TensorFlow深度学习平台的搭建是课程设计的第二步,这将提供一个强大而灵活的工具,用以实现神经网络的建模和训练。通过掌握TensorFlow,学生将具备在深度学习领域进行实际工作的基本能力。

建立卷积神经网络(CNN),理解卷积运算的原理和图像特征提取的过程。通过建立卷积神经网络的手写数字识别模型,深刻体会卷积计算和最大池化运算对图像特征提取的重要性。学习率、衰减率等参数的调整将是设计中的一个重要环节,通过调优模型,探索不同参数组合对模型性能的影响,并提高识别准确率。

通过这个课程设计,不仅获得深度学习技术的实际应用经验,还将培养文献查阅、团队协作、数据伦理等方面的能力,为将来深入科研或产业实践打下坚实基础。

2.2 设计任务

  1. 查阅文献资料,一般在5篇以上;
  2. 学习TensorFlow深度学习平台的搭建。
  3. 学习卷积神经网络,理解卷积运算原理,建立卷积网络的手写数字识别模型,并进行模型训练、测试和调优。
  4. 理解卷积计算后的最大池化运算,学习图像特征提取的原理。
  5. 理解学习率、衰减率等参数的作用。
  6. 理解监督学习的过程。
  7. 学习损失率函数构建方法。
  8. 经过模型调优,理解模型中各参数的作用以及影响模型准确率的因素。
  9. 模型识别准确率大于97%。
  10. 撰写课程设计说明书,须达到以下要求:
    (1) 陈述设计题目、设计任务;
    (2) 描述TensorFlow深度学习平台的搭建过程;
    (3) 写出卷积神经网络模型方案;
    (4) 记录卷积神经网络模型训练过程;
    (5) 记录卷积神经网络模型测试准确率;
    (6) 陈述模型调优过程,包括调优过程中遇到的主要问题,是如何解决的;对模型设计和编码的回顾、反思和体会等,与同学对问题的讨论、分析、改进设想以及收获等。同时,分析数据处理及分析过程中面临的数据安全、工程伦理等问题。

三. 神经网络模型

3.1 卷积神经网络模型方案

卷积神经网络(CNN)在计算机视觉领域已成为极其成功的深度学习模型典范,本模型设计即采纳了经典的LeNet-5架构风格。

在开始模型训练之前,首先加载MNIST手写数字数据集,并对数据进行了细致的预处理。所有图像被统一调整为28x28像素大小,以确保输入的一致性。同时,为了提升模型的训练稳定性和效果,对图像数据进行归一化,将像素值限定在[0, 1]的范围内。对于标签数据,采用了独热编码方式,以便于多分类任务的处理。

在模型编译阶段,选择交叉熵损失函数来衡量预测与真实标签之间的差异,为了进一步优化训练过程,引入了学习率衰减策略,使模型能够在训练的不同阶段灵活地调整学习步长。

该神经网络模型结构严谨,功能明确。它起始于卷积层,其中第一层利用6个5x5大小的卷积核来捕捉图像的初级特征,并通过ReLU激活函数为网络引入非线性特性。最大池化层以2x2的窗口对特征图进行下采样,有效降低了数据的空间维度,同时保留了重要特征。第二层卷积层进一步扩展了特征提取的深度,使用了16个5x5的卷积核,并再次应用ReLU激活函数。这一层级的特征在经过第二个最大池化层的下采样后,被进一步抽象和压缩。

在展平层,模型将经过卷积和池化处理的二维特征图转换为一维特征向量,为后续的全连接层做好了数据准备。全连接层作为模型的决策核心,第一层包含120个神经元,第二层包含84个神经元,均使用ReLU激活函数以增强网络的表达能力。

输出层配备了10个神经元,每个神经元对应着数字0到9的一个类别。通过Softmax激活函数,模型能够输出各个类别的概率分布,从而实现多类别分类任务。整个模型的设计巧妙地结合了卷积、池化和全连接操作,实现了从原始图像到最终分类结果的精确映射。

3.2 卷积神经网络模型训练过程

通过对训练集进行多轮迭代,模型不断学习特征并调整权重,以最小化损失函数。在训练过程中,监视模型在验证集上的性能,以及损失和准确率的变化。
在这里插入图片描述

图 3-1 卷积神经网络模型_训练结果
如图3-1所示,通过5次训练模型的准确度达到99%。

3.3 卷积神经网络模型测试

使用 Keras 模型的 evaluate 方法在测试集上进行评估。
在这里插入图片描述

图 3-2 卷积神经网络模型_测试结果
经测试,如图3-2所示,模型准确度为99.19%。

四. 程序设计

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.datasets import mnist
from IPython import get_ipython
from tensorflow.keras.optimizers import Adam


def load_and_preprocess_data():
    # 加载并预处理MNIST数据集
    (x_train, y_train), (x_test, y_test) = mnist.load_data()

    # 重塑和归一化数据
    x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)) / 255.0
    x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)) / 255.0

    # 对标签进行多分类编码
    num_categories = 10
    y_train = tf.keras.utils.to_categorical(y_train, num_categories)
    y_test = tf.keras.utils.to_categorical(y_test, num_categories)

    return x_train, y_train, x_test, y_test

def build_model_Convolutional():#*
    # 构建卷积神经网络模型
    model = Sequential()
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(MaxPooling2D((2, 2)))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2, 2)))
    model.add(Flatten())
    model.add(Dense(512, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    model.summary()

    return model

def compile_and_train_model(model, x_train, y_train, x_test, y_test):
    # 自定义优化器,设置学习率和衰减率
    custom_optimizer = Adam(learning_rate=0.001, decay=1e-6)
    # 编译并训练模型
    model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])

    history = model.fit(x_train, y_train, epochs=10, verbose=1, validation_data=(x_test, y_test))

    return history

def shutdown_ipython_kernel():
    # 清理显存
    ipython = get_ipython()
    if ipython:
        ipython.kernel.shutdown()

if __name__ == "__main__":
    # 加载并预处理数据
    x_train, y_train, x_test, y_test = load_and_preprocess_data()

    # 构建神经网络模型
    model = build_model_Convolutional()

    # 编译并训练模型
    history = compile_and_train_model(model, x_train, y_train, x_test, y_test)

    # 保存训练模型
    model.save("mnist_cnn_model.h5")
    print("Model saved successfully.")

    # 清理显存
    shutdown_ipython_kernel()


你可能感兴趣的:(课程设计,Python,cnn,人工智能,神经网络,深度学习)