神经网络应用: 手写数字识别(MNIST数据集)

2023-11-18

1. 前言

本文使用 tensorflow 2.10.0 版本构建神经网络模型并进行训练,不同版本之间的 API 可能会有不同,请选择合适的版本学习。

2. MNIST 数据集介绍

MNIST数据集(Mixed National Institute of Standards and Technology database)是美国国家标准与技术研究院收集整理的大型手写数字数据库,该 数据集包含 60000  个⽤于训练的样本和 10000  个⽤于测试的样本,图像是固定⼤小 (28x28 像素 ),每个像素的 值为0 255,通道数为 1(灰度图), 如下图所示:

其中 tensorflow 包含了 MNIST 数据集,可直接导入使用。

3. 代码实现

3.1 导入所需的工具包

# 导入相应的工具包
import numpy as np
from matplotlib import pyplot as plt
# tf 中使用工具包
import tensorflow as tf
# 数据集
from tensorflow.keras.datasets import mnist
# 构建模型
from tensorflow.keras.models import Sequential
# 导入需要的层
from tensorflow.keras.layers import Dense, Dropout, Activation, BatchNormalization
# 导入辅助工具包
from tensorflow.keras import utils
# 正则化
from tensorflow.keras import regularizers

3.2 加载数据集并显示部分数据

# 数据集中的类别总数
nb_classes = 10
# 加载数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

查看训练数据集和测试数据集的大小

X_train.shape

X_test.shape

展示训练数据集其中的一条数据

# 显示数据
plt.figure()
plt.rcParams['figure.figsize'] = (7, 7)
plt.imshow(X_train[1], cmap='gray')

3.3 数据处理

神经⽹络中的每个训练样本是⼀个向量,因此需要对输⼊进⾏重塑,使每个28x28的图像成为⼀个784维的向量。另外,将输⼊数据进⾏归⼀化处理,从0-255调整到0-1。

# 调整数据维度: 每一个数字转换成一个向量
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
# 格式转换
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
# 归一化
X_train /= 255
X_test /= 255
# 维度调整后的结果
print(f'训练集: {X_train.shape}')
print(f'测试集: {X_test.shape}')

另外对于标签值我们也需要进行处理,将其转换为独热编码(one-hot encoding)的形式。对于一个标量来说就需要将其转换为一个向量,其中向量的维度就是标签中样本的类别个数。

# 将目标值转换成独热编码的形式
y_train = utils.to_categorical(y_train, nb_classes)
y_test = utils.to_categorical(y_test, nb_classes)

3.4 模型构建 

本文构建具有 2 个隐藏层和 1 个输出层的全连接网络,其中隐藏层的神经元个数均为 512,输出层神经元个数为 10。

# 利用序列模型来构建模型
model = Sequential()
# 全连接层, 共 512 个神经元, 输入维度大小为 784
model.add(tf.keras.Input(shape=(784,)))
model.add(Dense(512))
# 激活函数使用 relu
model.add(Activation('relu'))
# 使用正则化方法 dropout
model.add(Dropout(0.2))
#全连接层 512个神经元 加入 L2 正则化
model.add(Dense(512, kernel_regularizer = regularizers.l2(0.001)))
# BN 层
model.add(BatchNormalization())
# 激活函数
model.add(Activation('relu'))
model.add(Dropout(0.2))
# 输出层 共 10 个神经元
model.add(Dense(10))
# softmax 将神经网络的输出的 score 转换为概率值
model.add(Activation('softmax'))

使用 model.summary() 查看模型的架构

3.5 模型编译

设置模型训练使⽤的损失函数交叉熵损失和优化⽅法 Adam,损失函数⽤来衡量预测值与真实值之间的差异,优化器⽤来使⽤损失函数达到最优。

# 模型编译 指明损失函数和优化器 评估指标
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])

3.6 模型训练

指定 batch_size 大小为 128,将 128 个样本同时送入网络进行训练,迭代 10 次(epochs = 10)。

# batch_size 是每次送入模型的样本个数, epochs 是所有样本的迭代次数, 并指明验证数据集
history = model.fit(X_train, y_train, batch_size=128, epochs=10, validation_data=(X_test, y_test))

训练过程如下:

可视化损失函数和模型训练精确度

# 绘制损失函数的变化曲线
plt.figure()
# 训练集损失函数变化
plt.plot(history.history['loss'], label='train_loss')
# 验证集损失函数变化
plt.plot(history.history['val_loss'], label='val_loss')
plt.legend()
# 绘制网格
plt.grid()

# 绘制准确率的变化曲线
plt.figure()
# 训练集损失函数变化
plt.plot(history.history['accuracy'], label='train_accuracy')
# 验证集损失函数变化
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.legend()
plt.grid()

3.7 模型测试(评估)

# 模型测试
score = model.evaluate(X_test, y_test, verbose=1)
# 打印结果
print(f'测试集准确率: {score}')

3.8 模型保存与加载

可以将训练好的模型保存到文件中,其中包括了权重W和偏置b

# 保存模型架构与权重在 h5 文件中
model.save('my_model.h5')
# 加载模型 包括对应的架构和权重
model = tf.keras.models.load_model('my_model.h5')
# 测试加载的模型
model.evaluate(X_test, y_test, verbose=1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经网络应用: 手写数字识别(MNIST数据集) 的相关文章

随机推荐

  • Kali Linux没有无线网卡?玩个锤纸~

    Kali Linux没有无线网卡 玩个锤纸 一 USB无限网卡 使用Kali linux 先准备好一个适合Kali系统的USB外置无限网卡 注意内置网卡并不适合渗透测试 Linux系统的指令相对于一般人来说比较晦涩难懂 最好选择免驱动类型
  • 基于Servlet-API型JAVA内存马(filter型、servlet型、listener型)

    前言 常规的木马实际写出落地后容易被检查出来 并且webshell被发现后也就导致我们的行动被发现 很容易造成木马被查杀 利用漏洞被修复 使我们的攻击变得更加艰难 所以内存马的出现与利用无疑是增强了隐蔽性 可以让我们的攻击更加稳定 持久 而
  • eclipse创建web service全过程

    创建Web Service步骤 一 创建服务端工程 1 WebServerTest web 工程 File New Other 选择Dynamic Web Project 配置Tomcat服务器 点击Browse选择Tomcat所在目录 点
  • Anaconda常用命令

    文章目录 一 简介 二 常用命令 2 1管理环境 2 2管理包 三 实践 参考 一 简介 Anaconda是Python环境和包的管理工具 可以给Python创建环境 并在创建的环境中添加需要的包 二 常用命令 Windows打开 Anac
  • 南方科技大学计算机学科评估,全国第四轮学科评估结果公布 我校7个学科进入B类...

    原标题 全国第四轮学科评估结果公布 我校7个学科进入B类 近日 教育部学位与研究生教育发展中心公布了全国第四轮学科评估结果 我校25个参评学科有13个上榜 其中 7个学科进入B类 6个学科进入C类 入选学科数位居省属高校第4位 学科评估是教
  • 基于LU分解的矩阵求逆

    import numpy as np import sys def LU deco inverse m dim m shape 0 E np mat np eye dim L np mat np eye dim U m copy for i
  • 无偏估计的数学证明和分析

    最近学习PCA 在求最大化方差 2 1 P 1
  • 自动化测试高频面试题-90%可能会被问到

    Hello 你们的好朋友九九又又又来了 今天猜猜我给大家带来点啥干货呢 最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题 所以 今天九九特意给大家整理了一些经常被公司问到的自动化测试相关的面试题 停 咱先收藏起来好吗 别到时
  • js中过一段时间后终止while循环,防止死循环的方法

    今天发现了一个比较有趣的事 相信很多人遇到过写while循环时 在测试时很容易陷入死循环 导致要关闭页面再重启才能继续测试 那如果频繁调试 就每死循环一次就重启一次 很烦 所以想写一个到一定时间就终止循环的函数 刚开始用setTimeout
  • rhel8订阅注册激活

    先注册账号进行订阅 注册系统 https www howtoing com enable rhel subscription in rhel 8
  • JDK1.8的新特性(详细总结)

    目录 前言 一 jdk8简介 二 Lambda表达式语法 函数式接口 三 jdk8 内置四大核心函数接口 消费型接口 海王式接口 只知道索取 供给型接口 舔狗式接口 只知道付出 不索取回报的 函数型接口 双向奔赴 有输入有输出 断言型接口
  • C语言上机实验思路分享5

    实验内容 方法和步骤 1 编写一个函数 由实参传来一个整数n 将它各个位上的数字逆序输出 例如输入 123 输出为321 2 求方程ax 2 bx c O的根 用3个函数分别求当 b 2 4ac大于0 等于0和小于0时的根 并输出结果 从主
  • js使用AjaxFileupload插件实现文件上传

    最近做项目 需要上传表单元素中的文件POST到目标URL 并把得到的数据显示到本页面上 而不跳转到目标URL 那么 现在就要明确两件事 1 不能直接提交表单 因为一旦点击submit就会自动跳转到action界面 2 可以选择ajax进行异
  • Spring boot 整合 log4j2日志、程序异常,发送邮件通知

    官方文档 https logging apache org log4j 2 x 1 Maven修改如下
  • html 元素平滑滚动到某一位置

    在网上查了大半天 有人用高度算 然后setTimeout的 那个观感真的是差到家了 还有人说用 js动画库的 其实很简单 直接用window scrollTo 这个方法就完事了 回到顶部 window scrollTo top 0 beha
  • 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航 1 稳定性 2 插入排序 3 希尔排序 4 选择排序 5 堆排序 6 冒泡排序 1 稳定性 两个相等的数据 如果经过排序后 排序算法能保证其相对位置不发生变化 则我们称该算法是具备稳定性的排序算法 图中排序后a仍然在b前面 此时这
  • Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate 中文都可译为 代理 所谓代理 就是一个人或者一个机构代表另一个人或者另一个机构采取行动 在一些情况下 一个客户不想或者不能够直接引用一个对象 而代理对象可以在客户端和目标对象之间起
  • Dalvik虚拟机简要介绍和学习计划

    通过修改 android framework base core jni AndroidRuntime cpp 中的 property get dalvik vm heapsize heapsizeOptsBuf 4 16m 来修改 dal
  • 电脑连接蓝牙耳机还是外放,输出设备只有扬声器怎么解决?

    1 问题描述 电脑连接蓝牙耳机耳机后 声音依然外放 输出设备只有扬声器 添加输出设备也找不到蓝牙耳机 2 排查问题 如果大家遇到的问题与我不同 还请查阅其他文章 右键计算机图标 gt 管理 gt 设备管理器 gt 声音 视频和游戏控制器 发
  • 神经网络应用: 手写数字识别(MNIST数据集)

    1 前言 本文使用 tensorflow 2 10 0 版本构建神经网络模型并进行训练 不同版本之间的 API 可能会有不同 请选择合适的版本学习 2 MNIST 数据集介绍 MNIST数据集 Mixed National Institut