实现mnist手写数字识别

基础知识

tensorflow

TensorFlow是一个开源的机器学习框架,致力于各种数据流图的自动微分和深度神经网络的计算。简而言之,** TensorFlow帮助我们轻松地构建、训练和部署机器学习模型** 。它可以在各种平台上运行,包括桌面计算机、服务器、移动设备和嵌入式设备。

在conda中安装tensorflow

conda install tensorflow

训练集和测试集

![](https://img-blog.csdnimg.cn/img_convert/11da4e88fdac0a5e0a1f1adfa852d2e7.png)

![](https://img-blog.csdnimg.cn/img_convert/98319b3f90031d4cda444faf34538ca6.png)

```java

![](https://cdn.nlark.com/yuque/0/2024/png/38629240/1728196864148-ae60ac21-fe9c-46b6-b91a-02432c6a2045.png)<h3 id="nIzm3">models</h3>
```java
models:这是 Keras 中用于构建和管理模型的模块。它提供了两种主要的模型构建方式:
Sequential 模型:按层顺序构建的模型。
Model API:允许创建更复杂的、具备灵活拓扑结构的模型。

models的一些方法包括:

Sequential:这是 Keras 中最简单的模型类型,它允许按层顺序构建神经网络。可以使用 add() 方法添加不同类型的层。
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=64, activation='relu', input_shape=(input_dim,)))
model.add(tf.keras.layers.Dense(units=10, activation='softmax'))
Model:功能性 API 允许用户构建更复杂的模型,包括多个输入和输出的模型。通过定义输入层和输出层,可以创建多分支网络。
inputs = tf.keras.Input(shape=(input_dim,))
x = tf.keras.layers.Dense(units=64, activation='relu')(inputs)
outputs = tf.keras.layers.Dense(units=10, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)compile():在训练模型之前,需要调用 compile() 方法配置模型的学习过程,包括指定损失函数、优化器和评价指标。
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
fit():用于训练模型,通过将训练数据输入模型进行学习。
history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
模型的评估
evaluate():在训练完成后,使用该方法在测试数据上评估模型的性能,返回损失值和其他指标。
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
模型的预测
predictions = model.predict(new_data)
save():将整个模型(结构和权重)保存到磁盘,通常以 .h5 格式。model.save('my_model.h5')load_model():从磁盘加载保存的模型。from tensorflow.keras.models import load_model
model = load_model('my_model.h5')
summary():输出模型的概要信息,包括各层的名称、输出形状和参数数量。model.summary()

调参

trainable:用于设置某一层的可训练性,以便进行微调或迁移学习。
model.layers[0].trainable = False  # 冻结第一层

CNN

CNN是卷积神经网络

卷积神经网络 (CNN) 基本原理和公式_cnn公式-CSDN博客

机器学习算法之——卷积神经网络(CNN)原理讲解 - 知乎 (zhihu.com)

代码

导入数据集

```java import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt

导入mnist数据,依次分别为训练集图片、训练集标签、测试集图片、测试集标签

(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

解析:
import tensorflow as tf 导入tensorfolw库,重命名为tf

from … import …:这种语法用于从某个库或模块中导入特定的部分,以减少命名冲突或不必要的全局命名。这里表示从 tensorflow.keras 模块中导入 datasets、layers 和 models 三个子模块。

tensorflow.keras:Keras 是 TensorFlow 中的一个高级API,用于快速构建和训练神经网络模型。Keras 原本是一个独立的深度学习库,但后来被集成到 TensorFlow 中,成为其一部分存储

datasets:这是 Keras 提供的一个模块,包含了一些常用的数据集加载函数。例如,mnist.load_data() 就是来自这个模块,用于加载 MNIST 手写数字数据集。

layers:这是 Keras 中的核心模块之一,包含了用于构建神经网络模型的各种层(layer)。每一层是神经网络的基本组成部分,比如全连接层(Dense)、卷积层(Conv2D)、池化层(MaxPooling2D)等。你可以用 layers.Dense() 来创建一个全连接层。

models:这是 Keras 中用于构建和管理模型的模块。它提供了两种主要的模型构建方式:
Sequential 模型:按层顺序构建的模型。
Model API:允许创建更复杂的、具备灵活拓扑结构的模型。

<h3 id="kqum6">处理数据集</h3>
```java
# 将像素的值标准化至0到1的区间内。(对于灰度图片来说,每个像素最大值是255,每个像素最小值是0,也就是直接除以255就可以完成归一化。)
train_images, test_images = train_images / 255.0, test_images / 255.0
# 查看数据维数信息
train_images.shape,test_images.shape,train_labels.shape,test_labels.shape机器学习和深度学习中,对输入数据进行归一化是一个常见且重要的预处理步骤。归一化将数据缩放到一个标准范围(通常是 0 到 1 之间)对于灰度图像,每个像素的取值范围通常是 0 到 255(对于 8 位图像)。当我们将像素值除以 255 时,像素值将被缩放到 0 到 1 的范围内,这样做的好处包括:易于理解的数值范围:0 到 1 的范围更直观且容易处理,尤其在使用某些激活函数时(如 sigmoid),它们在 0 到 1 范围内工作良好。与模型的初始化和学习相匹配:归一化后的数据与模型权重的初始化范围相匹配,尤其是在使用带有随机初始化的深度学习模型时。

展示数据集

```java # 将数据集前20个图片数据可视化显示 # 进行图像大小为20宽、10长的绘图(单位为英寸inch) plt.figure(figsize=(20,10)) # 遍历MNIST数据集下标数值0~49 for i in range(20): # 将整个figure分成5行10列,绘制第i+1个子图。 plt.subplot(2,10,i+1) # 设置不显示x轴刻度 plt.xticks([]) # 设置不显示y轴刻度 plt.yticks([]) # 设置不显示子图网格线 plt.grid(False) # 图像展示,cmap为颜色图谱,"plt.cm.binary"为matplotlib.cm中的色表 plt.imshow(train_images[i], cmap=plt.cm.binary) # 设置x轴标签显示为图片对应的数字 plt.xlabel(train_labels[i]) # 显示图片 plt.show() ```

创建卷积神经网络

```java # 创建并设置卷积神经网络 # 卷积层:通过卷积操作对输入图像进行降维和特征抽取 # 池化层:是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的鲁棒性。 # 全连接层:在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。 model = models.Sequential([ # 设置二维卷积层1,设置32个3*3卷积核,activation参数将激活函数设置为ReLu函数,input_shape参数将图层的输入形状设置为(28, 28, 1) # ReLu函数作为激活励函数可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层 # 相比其它函数来说,ReLU函数更受青睐,这是因为它可以将神经网络的训练速度提升数倍,而并不会对模型的泛化准确度造成显著影响。 layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), #池化层1,2*2采样 layers.MaxPooling2D((2, 2)), # 设置二维卷积层2,设置64个3*3卷积核,activation参数将激活函数设置为ReLu函数 layers.Conv2D(64, (3, 3), activation='relu'), #池化层2,2*2采样 layers.MaxPooling2D((2, 2)),
layers.Flatten(),                    #Flatten层,连接卷积层与全连接层
layers.Dense(64, activation='relu'), #全连接层,特征进一步提取,64为输出空间的维数,activation参数将激活函数设置为ReLu函数
layers.Dense(10)                     #输出层,输出预期结果,10为输出空间的维数

])

打印网络结构

model.summary()

<h3 id="DDhAH">编译模型</h3>
```java
"""
这里设置优化器、损失函数以及metrics
"""
# model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准
model.compile(# 设置优化器为Adam优化器optimizer='adam',# 设置损失函数为交叉熵损失函数(tf.keras.losses.SparseCategoricalCrossentropy())# from_logits为True时,会将y_pred转化为概率(用softmax),否则不进行转换,通常情况下用True结果更稳定loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),# 设置性能指标列表,将在模型训练时监控列表中的指标metrics=['accuracy'])

训练模型

```java history = model.fit( # 输入训练集图片 train_images, # 输入训练集标签 train_labels, # 设置10个epoch,每一个epoch都将会把所有的数据输入模型完成一次训练。 epochs=10, # 设置验证集 validation_data=(test_images, test_labels)) ```

预测

```java pre = model.predict(test_images) # 对所有测试图片进行预测 pre[1] # 输出第一张图片的预测结果 ```

识别出来应该是对应的1。

之前不懂训练的模型怎么就保存下来了的,刚刚已经保存好的模型在另一个文件中调用。

通过 load_model 加载已经训练好的模型,已经训练好的模型是h5保存在文件中的。

from tensorflow.keras.models import load_model
model = load_model('mnist.h5')

参考

pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练_经典数据集-手写数字识别pytorch-CSDN博客

深度学习–TensorFlow(项目)识别自己的手写数字(基于CNN卷积神经网络)_cnn卷积神经网络基于te数据集-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555995.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Dyna-slam复现(保姆级详细图文版,百分百成功)

因最近论文要和这些算法做对比,故配置了一下,在此记录 因为是老的算法,cuda版本现在的显卡都不能使用,所以笔者找的电脑是华硕飞行堡垒17年的电脑,1080的显卡 深度学习及maskrcnn配置 先将dyna-slam git下来,终端执行 git clone https://github.com/BertaBescos/Dyna…

数据结构之红黑树实现(全)

一、红黑树 红黑树是一种自平衡的二叉搜索树&#xff0c;它通过约束节点的颜色和结构来保持平衡。红黑树是由 Rudolf Bayer 在1972年发明的&#xff0c;被认为是一种优秀的平衡树结构&#xff0c;广泛应用于各种数据结构和算法中。 1.红黑树的性质 1. 每个结点是红的或者黑的…

PhotoMaker部署文档

一、介绍 PhotoMaker&#xff1a;一种高效的、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义逼真的人类照片。相当于把一张人的照片特征提取出来&#xff0c;然后可以生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内…

前端工程化 - Vue

环境准备 Vue-cli是Vue官方提供的一个脚手架&#xff0c;用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…

常见排序详解(历时四天,哭了,必须释放一下)

目录 1、插入排序 1.1 基本思想 1.2 直接插入排序 1.2.1 思路 1.2.2 代码实现 1.2.3 性质 1.3 希尔排序 1.3.1 思路 1.3.2 代码实践 1.3.3 性质 2、选择排序 2.1 基本思想 2.2 直接选择排序 2.2.1 思路 2.2.2 代码实践 2.2.3 性质 2.3 堆排序 2.3.1 思路 2.…

108页PPT丨OGSM战略规划框架:实现企业目标的系统化方法论

OGSM战略规划框架是一种实现企业目标的系统化方法论&#xff0c;它通过将组织的目标&#xff08;Objectives&#xff09;、目标&#xff08;Goals&#xff09;、策略&#xff08;Strategies&#xff09;和衡量指标&#xff08;Measures&#xff09;进行系统化整合&#xff0c;确…

windows下DockerDesktop命令行方式指定目录安装

windows下DockerDesktop指定目录安装(重新安装) 因为DcokerDesktop占用内存较大, 并且拉去镜像后占用本地空间较多,所以建议安装时就更改默认安装路径和镜像存储路径 这里,展示了从下载到安装的过程: 首先下载DcokerDesktop;找到Docker Desktop Installer.exe 并重命名为 do…

国内超声波清洗机哪个品牌好?力荐四款超耐用超声波清洗机!

超声波清洗机作为一款高效实用的家庭与专业清洁利器&#xff0c;能够迅速且彻底地清洁多样化的物件。面对市场上琳琅满目的品牌与型号&#xff0c;每一款都各具特色与优势&#xff0c;故在决定购买前做足调研显得尤为重要&#xff0c;以免购入不尽如人意的产品&#xff0c;造成…

力扣110:判断二叉树是否为平衡二叉树

利用二叉树遍历的思想编写一个判断二叉树&#xff0c;是否为平衡二叉树 示例 &#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true思想&#xff1a; 代码&#xff1a; int getDepth(struct TreeNode* node) {//如果结点不存在&#xff0c;返回…

打造自己的RAG解析大模型:Windows部署OCR服务(可商业应用)

在上一篇文章中&#xff0c;我们介绍了如何在 Windows 环境中配置 OCR 相关模型&#xff0c;并完成了模型验证。本篇文章将基于之前的内容&#xff0c;进一步讲解如何将文本检测、方向分类和文本识别模型进行串联&#xff0c;最终搭建一个基础的 OCR 应用服务。通过这些模型的串…

【Diffusion分割】CTS:基于一致性的医学图像分割模型

CTS: A Consistency-Based Medical Image Segmentation Model 摘要&#xff1a; 在医学图像分割任务中&#xff0c;扩散模型已显示出巨大的潜力。然而&#xff0c;主流的扩散模型存在采样次数多、预测结果慢等缺点。最近&#xff0c;作为独立生成网络的一致性模型解决了这一问…

回调函数是什么

回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数时&#xff0c;被调⽤的函数就是回调函数。 回调函数不是由该函数的实现⽅直接调⽤&…

Linux驱动开发(速记版)--GPIO子系统

第105章 GPIO 入门 105.1 GPIO 引脚分布 RK3568 有 5 组 GPIO&#xff1a;GPIO0 到 GPIO4。 每组 GPIO 又以 A0 到 A7&#xff0c;B0 到 B7&#xff0c;C0 到C7&#xff0c;D0 到 D7&#xff0c;作为区分的编号。 所以 RK3568 上的 GPIO 是不是应该有 5*4*8160 个呢&#xff1…

Semantic Communication Meets Edge Intelligence——构造终端共享的知识图谱指导无线物联网通信中文本的传输

论文链接&#xff1a; IEEE Xplore Full-Text PDF:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9979702 1. 背景 随着自动驾驶、智能城市等应用的发展&#xff0c;移动数据流量将大幅增加。传统的香农信息论&#xff08;CIT&#xff09;通信系统已接近其带…

SpringBoot MyBatis连接数据库设置了encoding=utf-8还是不能用中文来查询

properties的MySQL连接时已经指定了字符编码格式&#xff1a; url: jdbc:mysql://localhost:3306/sky_take_out?useUnicodetrue&characterEncodingutf-8使用MyBatis查询&#xff0c;带有中文参数&#xff0c;查询出的内容为空。 执行的语句为&#xff1a; <select id&…

decltype推导规则

decltype推导规则 当用decltype(e)来获取类型时&#xff0c;编译器将依序判断以下四规则&#xff1a; 1.如果e是一个没有带括号的标记符表达式(id-expression)或者类成员访问表达式&#xff0c;那么decltype(e)就是e所命名的实体的类型。此外&#xff0c;如果e是一个被重载的函…

k8s 中存储之 NFS 卷

目录 1 NFS 卷的介绍 2 NFS 卷的实践操作 2.1 部署一台 NFS 共享主机 2.2 在所有k8s节点中安装nfs-utils 2.3 部署nfs卷 2.3.1 生成 pod 清单文件 2.3.2 修改 pod 清单文件增加 实现 NFS卷 挂载的 参数 2.3.3 声明签单文件并查看是否创建成功 2.3.4 在 NFS 服务器 创建默认发布…

思维导图工具,轻松搞定复杂问题!

一提到思维导图&#xff0c;想必大家都不会陌生&#xff1b;它能帮助我们更好地梳理思路&#xff0c;让复杂的想法变得清晰可见&#xff1b;而随着互联网的普及&#xff0c;在线思维导图工具更是成为了我们日常工作和学习的得力助手&#xff1b;今天&#xff0c;我就来给大家推…

小红书算法岗面试,竞争太激烈了

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

【Kubernetes】常见面试题汇总(五十八)

目录 127.创建 PV 失败&#xff1f; 128. pod 无法挂载 PVC&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】…