当前位置: 首页 > news >正文

MNIST 手写数字识别模型分析

功能概述

这段代码实现了一个基于TensorFlow和Keras的MNIST手写数字识别模型。主要功能包括:

  1. 加载并预处理MNIST数据集
  2. 构建一个简单的全连接神经网络模型
  3. 训练模型并评估其性能
  4. 使用训练好的模型进行预测
  5. 保存和加载模型

代码解析

1. 导入必要的库

import matplotlib
import tensorflow.keras as keras
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from pasta.augment import inline
  • 导入TensorFlow和Keras用于构建和训练神经网络
  • 导入NumPy用于数值计算
  • 导入Matplotlib用于数据可视化
  • 从pasta.augment导入inline用于在Jupyter Notebook中直接显示图像

2. 打印TensorFlow版本

print(tf.__version__)

输出当前使用的TensorFlow版本,用于环境检查。

3. 加载MNIST数据集

path = '../doc/mnist.npz'
with np.load(path) as data:x_train, y_train = data['x_train'], data['y_train']x_test, y_test = data['x_test'], data['y_test']
print(x_train[0])
  • 从本地文件加载MNIST数据集
  • 数据集包含训练集(x_train, y_train)和测试集(x_test, y_test)
  • 打印第一个训练样本的像素值

4. 数据可视化

%matplotlib inline
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()
  • 使用Matplotlib显示第一个训练样本的图像
  • cmap=plt.cm.binary设置为黑白显示

5. 打印第一个训练样本的标签

print(y_train[0])

输出第一个训练样本对应的数字标签。

6. 数据归一化

x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
print(x_train[0])
  • 对图像数据进行归一化处理,将像素值缩放到0-1范围
  • 打印归一化后的第一个训练样本

7. 构建神经网络模型

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
  • 创建一个Sequential模型
  • 添加Flatten层将28x28的图像展平为784维向量
  • 添加两个全连接层(Dense),每层128个神经元,使用ReLU激活函数
  • 添加输出层,10个神经元对应10个数字类别,使用Softmax激活函数

8. 编译模型

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
  • 使用Adam优化器
  • 使用稀疏分类交叉熵作为损失函数
  • 使用准确率作为评估指标

9. 训练模型

model.fit(x_train, y_train, epochs=3)
  • 训练模型3个epoch
  • 使用训练数据进行拟合

10. 评估模型

val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss)
print(val_acc)
  • 在测试集上评估模型性能
  • 输出测试损失和准确率

11. 使用模型进行预测

predictions = model.predict(x_test)
print(predictions)
print(np.argmax(predictions[0]))
plt.imshow(x_test[0], cmap=plt.cm.binary)
plt.show()
  • 对测试集进行预测
  • 打印预测结果(概率分布)
  • 使用argmax获取第一个测试样本的预测标签
  • 显示第一个测试样本的图像

12. 保存和加载模型

def softmax_v2(x):return tf.keras.activations.softmax(x)new_model = tf.keras.models.load_model('epic_num_reader.model.keras',custom_objects={'softmax_v2': softmax_v2}
)predictions = new_model.predict(x_test)
print(np.argmax(predictions[0]))
  • 定义一个softmax_v2函数用于兼容性
  • 加载之前保存的模型
  • 使用加载的模型进行预测

总结

这段代码实现了一个简单但有效的MNIST手写数字分类器。主要特点包括:

  1. 使用全连接神经网络结构
  2. 实现了数据预处理和归一化
  3. 达到了较高的测试准确率(约97%)
  4. 包含了模型保存和加载功能
  5. 提供了可视化工具检查数据和预测结果

demo001.ipynb

# 导入 keras 模块
import matplotlib
import tensorflow.keras as keras
# 导入 tensorflow 模块
import tensorflow as tf
# 导入 pasta 模块中的 augment 和 inline 子模块
from pasta.augment import inline# 打印 TensorFlow 的版本
print(tf.__version__)# 指定本地文件路径
path = '../doc/mnist.npz'
# 导入 numpy 模块
import numpy as np
# 从本地加载 MNIST 数据集
with np.load(path) as data:x_train, y_train = data['x_train'], data['y_train']x_test, y_test = data['x_test'], data['y_test']
# 打印训练数据集的第一个样本
print(x_train[0])# 导入 matplotlib.pyplot 模块
import matplotlib.pyplot as plt
# 使用 inline 后,图形将直接显示在 Jupyter Notebook 中
# %matplotlib inline
# 可视化训练数据集的第一个样本
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()# 打印训练标签的第一个样本
print(y_train[0])# 对训练和测试数据进行归一化处理
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)# 打印归一化后的训练数据集的第一个样本
print(x_train[0])# 可视化归一化后的训练数据集的第一个样本
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()# 创建一个 Sequential 模型
model = tf.keras.models.Sequential()
# 添加一个 Flatten 层,用于将输入数据展平
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
# 添加一个 Dense 层,包含 128 个神经元,使用 ReLU 激活函数
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
# 再添加一个 Dense 层,配置同上
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
# 添加一个 Dense 层,包含 10 个神经元,使用 Softmax 激活函数
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
# 编译模型,指定优化器、损失函数和评估指标
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=3)
# 评估模型
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss)
print(val_acc)# 使用模型进行预测
predictions = model.predict(x_test)
print(predictions)# 导入 numpy 模块
import numpy as np# 打印第一个测试样本的预测标签
print(np.argmax(predictions[0]))# 可视化第一个测试样本
plt.imshow(x_test[0], cmap=plt.cm.binary)
plt.show()# 保存模型
def softmax_v2(x):# 将 softmax_v2 映射到标准 softmaxreturn tf.keras.activations.softmax(x)# 加载之前保存的模型
new_model = tf.keras.models.load_model('epic_num_reader.model.keras',custom_objects={'softmax_v2': softmax_v2}
)# 使用加载的模型进行预测
predictions = new_model.predict(x_test)
# 打印第一个测试样本的预测标签
print(np.argmax(predictions[0]))
http://www.lryc.cn/news/598631.html

相关文章:

  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——4. 前后端联动:打通QML与C++的任督二脉
  • LAYOUT 什么时候需要等长布线?
  • 【牛客刷题】和零在一起
  • 【Linux】Linux了解与基本指令(1)
  • 数据库期中复习
  • SkyWalking异步采集spring gateway日志
  • postgresql执行创建和删除时遇到的问题
  • AWS云S3+Glue+EMRonEC2+ReadShift
  • ThinkPHP8集成RabbitMQ的完整案例实现
  • 使用 Strands Agents 开发并部署生产级架构通用型个人助手
  • 【论文阅读】基于EEG的冥想状态数据挖掘研究(2025)
  • 深入探索Amazon SQS:构建弹性微服务与无服务器应用的秘密武器
  • Nodejs:从“模块未找到”到“大师之路”, 项目初始化与依赖安全完全指南
  • JimuReport 积木报表 v2.1.1 版本发布,免费开源的报表和大屏
  • 主流摄像头协议及其开源情况,GB/T 28181协议介绍
  • Word2Vec模型训练全流程解析:从数据预处理到实体识别应用
  • PyTorch常用Tensor形状变换函数详解
  • 如何恢复mysql,避免被研发删库跑路
  • 多模态数据处理系统:用AI读PDF的智能助手系统分析
  • 六、Element-快速入门
  • K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
  • 从零用java实现 小红书 springboot vue uniapp(14) 集成阿里云短信验证码
  • Android安全存储:加密文件与SharedPreferences最佳实践
  • 【C++】使用箱线图算法剔除数据样本中的异常值
  • 进程通信----匿名管道
  • 【redis其它面试问题】
  • PHP 与 Vue.js 结合的前后端分离架构
  • 工具分享02 | Python批量文件重命名工具
  • 电商接口什么意思?
  • 数据所有权与用益权分离:数字经济时代的权利博弈与“商业机遇”