手写数字图片识别——DL 入门案例

Deep Learning Demo of Primary

下面介绍一个入门案例,如何使用TensorFlow和Keras构建一个CNN模型进行手写数字识别,以及如何使用该模型对自己的图像进行预测。尽管这是一个相对简单的任务,但它涵盖了深度学习基本流程,包括:

  • 数据准备
  • 模型构建
  • 模型训练
  • 模型预测

输入:

python 复制代码
import tensorflow as tf
from tensorflow import keras
import numpy as np
from PIL import Image

# 加载MNIST数据集(用于训练模型)
# 这部分代码加载了MNIST数据集,这是一个广泛使用的手写数字图像数据集,包含60,000个训练样本和10,000个测试样本。
# 我们将像素值除以255.0,将它们归一化到0-1的范围内,这是神经网络输入的标准做法。
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 规范化像素值
train_images, test_images = train_images / 255.0, test_images / 255.0


# 构建CNN模型
# 这部分代码构建了一个卷积神经网络(CNN)模型。我们使用Keras的Sequential API,它允许我们按顺序堆叠不同的层。
# 我们添加了两个卷积层和两个最大池化层,用于从图像中提取特征。
# 然后,我们添加了一个展平层,将特征映射到一个一维向量。
# 最后,我们添加了两个全连接层,第一个具有128个神经元,第二个具有10个神经元,用于对手写数字进行分类。
# 最后一层使用softmax激活函数输出每个数字的概率。
model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 编译模型
# 这部分代码构建了一个卷积神经网络(CNN)模型。我们使用Keras的Sequential API,它允许我们按顺序堆叠不同的层。
# 我们添加了两个卷积层和两个最大池化层,用于从图像中提取特征。然后,我们添加了一个展平层,将特征映射到一个一维向量。
# 最后,我们添加了两个全连接层,第一个具有128个神经元,第二个具有10个神经元,用于对手写数字进行分类。
# 最后一层使用softmax激活函数输出每个数字的概率。
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(train_images, train_labels, epochs=5)

# 函数:预测手写数字图像
# 在构建模型之后,我们需要编译它。
# 我们指定了使用Adam优化器,稀疏分类交台熵损失函数(适用于整数标签),并监控准确率指标。
# 然后,我们使用model.fit函数在训练数据上训练模型,迭代5个epoch。
def predict_digit(img_path):
    # 加载图像
    img = Image.open(img_path).convert('L')
    img = img.resize((28, 28))
    img_array = np.array(img) / 255.0
    img_array = np.expand_dims(img_array, axis=-1)
    img_array = np.expand_dims(img_array, axis=0)

    # 进行预测
    predictions = model.predict(img_array)
    predicted_digit = np.argmax(predictions)

    return predicted_digit

# 测试
# 这个 predict_digit 函数用于预测手写数字图像。它接受一个图像文件路径作为输入。
# 首先,它使用PIL库加载图像,将其转换为灰度模式,并调整大小为28x28像素。
# 然后,它将图像转换为NumPy数组,并进行与训练数据相同的归一化处理。
# 由于CNN模型需要一个4D张量作为输入(batch_size, height, width, channels),
# 我们需要使用 np.expand_dims 在最后两个维度上扩展数组形状。
#
# 接下来,我们使用训练好的模型的 predict 方法对预处理后的图像数据进行预测,得到一个包含10个概率值的列表,每个值对应一个数字(0-9)的概率。
# 我们使用 np.argmax 找到概率值最大的索引,即模型预测的数字。
# 最后,函数返回预测的数字。
digit = predict_digit('image-8.png')
print(f'预测的数字是: {digit}')

输出:

预测的数字是: 8

但是完全不知道程序都做了什么...,那就学习它的流程吧。

Process:

  1. 首先,我们加载内置的MNIST数据集,并将像素值归一化到0-1之间。
  2. 然后,我们使用Keras的Sequential API构建一个CNN模型。该模型包含两个卷积层、两个最大池化层、一个展平层和两个全连接层。
    最后一层使用softmax激活函数输出10个数字的概率。
  3. 我们使用稀疏分类交叉熵损失函数和Adam优化器编译模型。
  4. 接下来,我们使用训练数据train_images和train_labels训练模型5个epoch。
  5. 我们定义了一个predict_digit函数,用于预测手写数字图像。这个函数接受一个图像文件路径作为输入。
  6. 在predict_digit函数中,我们首先使用Pillow库加载图像,并将其转换为灰度模式和28x28大小。
    然后,我们将图像数据转换为Numpy数组,并进行相同的归一化处理。
    由于模型的输入维度为(批次大小, 高度, 宽度, 通道数),我们需要使用np.expand_dims在最后两个维度上扩展数组形状。
  7. 接下来,我们使用训练好的模型的predict方法对预处理后的图像数据进行预测,得到一个包含10个概率值的列表,每个值对应一个数字(0-9)的概率。
    我们使用np.argmax找到概率值最大的索引,即模型预测的数字。
  8. 最后,我们调用predict_digit函数,传入你自己的图像文件路径,并打印预测结果。
相关推荐
kakaZhui12 分钟前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20251 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
davenian4 小时前
DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力
人工智能·深度学习·语言模型·deepseek
CM莫问5 小时前
什么是门控循环单元?
人工智能·pytorch·python·rnn·深度学习·算法·gru
kakaZhui8 小时前
【llm对话系统】大模型 Llama 源码分析之 LoRA 微调
pytorch·深度学习·chatgpt·aigc·llama
eso19838 小时前
深度学习模型在汽车自动驾驶领域的应用
深度学习·自动驾驶·汽车
梦云澜9 小时前
论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅
论文阅读·人工智能·深度学习
prince_zxill10 小时前
机器学习优化算法:从梯度下降到Adam及其变种
人工智能·深度学习
paradoxjun11 小时前
YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)
深度学习·yolo·目标检测·剪枝
视觉语言导航11 小时前
构建具身智能体的时空宇宙!GRUtopia:畅想城市规模下通用机器人的生活图景
人工智能·深度学习·具身智能