Tensorflow入门实战 P01-实现手写数字识别mnist

news2024/11/17 3:56:55

目录

1、背景:MNIST手写数字识别

2、完整代码(Tensorflow):

3、运行过程及结果:

4、小结(还是很清晰的)

5、 展望


  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊 | 接辅导、项目定制

1、背景:MNIST手写数字识别

MINIST手写数字数据集来源于美国国家标准与技术研究所,是著名的公开数据集。

数据集获取的网址:http://yann.lecun.com/exdb/mnist/(下载后需要解压)。

但是,我们一般会采用一行简单的代码来直接调用,无需去直接下载。

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

其中,MNIST手写数字集中包含了70000张图片,70000 = 60000(训练数据) + 10000(测试数据)。且图片都是28*28大小的。

如果我们把每一张图片中的像素转换为向量,则得到长度为28*28=784 的向量。因此我们可以把训练集看成是一个[60000, 784] 的张量,第一个维度表示图片的索引,第二个维度表示每张图片中的像素点。而图片里的每个像素点的值介于0-1之间。

2、完整代码(Tensorflow):

# 前期工作
# 1、设置GPU
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]  # 如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)  # 设置GPU显存用量按需使用,这样Tensorflow不会一开始就占用全部显存
    tf.config.set_visible_devices([gpu0], "GPU")  # 设置Tensorflow可见的GPU设备列表。


# 2、导入mnist 数据
from keras import datasets, layers, models
import matplotlib.pyplot as plt

# 导入mnist数据,依次分别为 训练集图片、训练集标签、测试集图片、测试集标签
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# 将像素的值标准化至0到1的区间内。(对于灰度图片来说,每个像素最大值是255,每个像素最小值是0,也就是直接除以255就可以完成归一化。)
train_images, test_images = train_images / 255.0, test_images / 255.0


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


# 4、调整图片格式(调整数据到我们需要的格式)
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
print(train_images.shape, test_images.shape, train_labels.shape, test_labels.shape)
#       (60000, 28, 28, 1)  (10000, 28, 28, 1)  (60000,)            (10000,)


# 5、搭建卷积神经网络
'''
    创建并设置卷积神经网络
    ① 卷积层:通过卷积操作对输入图像进行降维和特征抽取
    ② 池化层:是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的鲁棒性。
    ③ 全连接层:在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。
'''

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()

# 6、编译模型

"""
    这里设置优化器、损失函数以及metrics
    这三者具体介绍可参考我的博客:
    https://blog.csdn.net/qq_38251616/category_10258234.html
"""
# model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准
model.compile(
    optimizer='adam',  # 设置优化器为Adam优化器
    # 设置损失函数为交叉熵损失函数(tf.keras.losses.SparseCategoricalCrossentropy())
    # from_logits为True时,会将y_pred转化为概率(用softmax),否则不进行转换,通常情况下用True结果更稳定
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    # 设置性能指标列表,将在模型训练时监控列表中的指标
    metrics=['accuracy'])

# 训练模型

"""
这里设置输入训练数据集(图片及标签)、验证数据集(图片及标签)以及迭代次数epochs
关于model.fit()函数的具体介绍可参考我的博客:
https://blog.csdn.net/qq_38251616/category_10258234.html
"""
history = model.fit(
    train_images,  # 输入训练集图片
    train_labels,  # 输入训练集标签
    epochs=10,  # 设置10个epoch,每一个epoch都将会把所有的数据输入模型完成一次训练。
    validation_data=(test_images, test_labels))  # 设置验证集

# 预测模型
plt.imshow(test_images[1])  # 将数据变换成图像
plt.show()  # 将图像显示出来!!!

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

3、运行过程及结果:

4、小结(还是很清晰的)

        学习过程总是坎坷的,每次都会遇到各种问题,但是这就需要我们有很好的解决能力。现在科技这么发达,很多AI,还有网上很多的博客、大神之类的,这些都是帮助我们前进的助力。

先说说我吧:

我之前一直写的是pytorch,只听说过tensorflow,但是没有实际使用过,这周是第一次暗转tensorflow,刚开始页式各种的问题,下面我细细列举几个:

① tensorflow需要3.8版本的python。我的python是3.10的,安装失败了,看到提示才知道需要python3.8版本,于是就果断的`conda create -n tensorflow -n python=3.8`

② 环境安装好了,开始安装tensorflow: pip install tensorflow 

③ 安装好tensorflow,pip list 检查已经安装好。开始写代码

④ 刚写没几行,报错。

⑤ 点进去tensorflow 里面根本没有keras ,去网上搜了下,发现是需要这样的。

于是,再次去查看了pip list,查看先关的包,发现tensorflow和keras 都存在,而且不是父子关系。于是就把报错那块的tensorflow.keras 换成 keras 就可以了!!!!

⑥ plt.imshow(test_images[1])  代码里面的这快,是要显示测试数据集里面的第一个图片,但是运行代码,一直不显示。于是,我又去网上搜索了,看了下 plt.imshow() 和plt.show()的区别。

好好好,这样写就好了。

⑦ 后续在没有任何报错了。very good!!!!

⑧ 推荐一个学习tensorflow学习的网站(可以当个词典):TensorFlow官方文档_w3cschool

5、 展望

加油,今年争取发个论文。最近一直在看相关论文,跑实验!!!!

Good luck to me !!

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

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

相关文章

摔到脑袋,没有骨折,没有脱位,脊髓怎么会损伤?

在一个周末的午后,小明在公园的足球场上不慎摔倒,头部重重撞到草地。虽然很快恢复了意识,但回家后却感到颈部僵硬,四肢无力。家人急忙带他前往医院就医做了相关检查。 经过医生的仔细检查,结果显示小明的头部没有骨折或…

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我 戴安娜阿西尔(1917-2019),英国知名文学编辑、作家。著有《暮色将尽》《昨日清晨》《未经删节》《长书当诉》等。 曾嵘 译 文章目录 《暮色将尽》跨越世纪的历程,慢慢走…

FastGPT私有化部署+OneAPI配置大模型

介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址 https://doc.fastai.site/docs/intro/ 部署 FastGPT提供…

atomic包装自定义类型

在学习原子变量之初,学过很多它的操作,但是很多都是在内置类型(int、long等)上进行的学习和实验。这次由于工作需要,要使用 atomic 来包装自定义类型,因此打算好好探究一番,把它彻底搞懂。 当要…

iOS系统故障怎么办?这三种苹果手机系统修复方法你一定要知道

随着苹果手机使用时间越长,苹果手机有时也会出现系统问题,如卡顿、崩溃、无法启动等。这些问题不仅影响用户的使用体验,还可能导致数据丢失。因此,掌握苹果手机系统修复方法显得尤为重要。本文将详细介绍苹果手机系统修复的常见方…

冯喜运:5.24今日晚间黄金原油行情如何操作

【黄金消息面分析】:在经历了连续两个交易日的大幅下跌后,黄金市场在北京时间5月24日欧市早盘迎来了反弹。金价目前位于2338美元/盎司附近,市场对此轮波动表现出浓厚的兴趣。本文将深入分析黄金市场的最新动态,探讨其背后的逻辑&a…

非阻塞sokcet和epoll

在Muduo网络库中同时使用了非阻塞socket与epoll,在此简单梳理下。 非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。下面将详细解释这两者如何协同工作: 非阻塞socket简介 在传统的阻塞socket编程中,当调用…

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

3D模型旋转显示不全怎么办---模大狮模型网

在3D建模和渲染过程中&#xff0c;我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成&#xff0c;包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法&#xff0c;帮助您解决3D模型旋转显示不全的问题。 一、检查模型…

活动回顾 |观测云在杭州论坛上闪耀:教育创新与技术领导力的双重荣耀

第二届服务韧性工程论坛在杭州顺利闭幕&#xff0c;观测云以其在可观测性领域的杰出成就和创新成果&#xff0c;成为了论坛的瞩目焦点。在此次以“人工智能驱动运维研发革命&#xff0c;SRE 助力出海企业构建健壮的 IT 生态系统”为主题的盛会上&#xff0c;观测云积极参与了四…

物联网实战--平台篇之(十)“我的“页面设计

目录 一、页面布局 二、头像 三、修改密码 四、重新登录 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 本项目资源文件htt…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

如何在window中快速建立多个文件夹?

时隔多年&#xff0c;再次开始撰写文章&#xff0c;但是这次却是以设计师的身份 1. 几个基础快捷键先记一下&#xff0c;要不更高级的玩儿不转&#xff08;1&#xff09;快速打开资源管理器&#xff08;2&#xff09;快速建立新文件夹&#xff08;3&#xff09;快速修改文件文件…

作为 App 开发者会推荐安装的 Mac App

Xcode&#xff0c;作为 App 开发者&#xff0c;必须安装的工具。当然&#xff0c;有经验的开发者不会从 Mac App Store 下载&#xff0c;而是从网站下载&#xff0c;除了安装过程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下载方式&#xff1a; …

[LLM-Agents]浅析Agent工具使用框架:MM-ReAct

上文LLM-Agents]详解Agent中工具使用Workflow提到MM-ReAct框架&#xff0c;通过结合ChatGPT 与视觉专家模型来解决复杂的视觉理解任务的框架。通过设计文本提示&#xff08;prompt design&#xff09;&#xff0c;使得语言模型能够接受、关联和处理多模态信息&#xff0c;如图像…

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…

FaceFusion源码框架解读

FaceFusion源码框架解读 我的视频讲解&#xff1a;FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具&#xff0c;一款非常好用的换脸工具&#xff0c;操作简单&#xff0c;上手容易。 Facefusion&#xff1a;GitHub - facefusion/facefusion: Next gene…

最新Adaptive特征融合策略,涨点又高效,想发表论文可以参考

自适应特征融合是一种非常高效的数据处理方法&#xff0c;它比传统的特征更能适应不同的数据和任务需求&#xff0c;也因此拥有广泛的应用前景&#xff0c;是深度学习领域的研究热点。 这种方法通过动态选择和整合来自不同层次或尺度的特征信息&#xff0c;不仅显著提升了模型…

USB抓包工具:bushound安装及使用

一、环境搭建 下载busbound6.01安装包&#xff0c;安装完成&#xff0c;重启电脑。 二、工具配置 按照下图配置工具&#xff1a; 使能自动识别新设备 2. 设置抓取数据的容量 三、抓包 回到capture选项卡&#xff0c;在页面的右下角有个run的按钮&#xff0c;点击使能&…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…