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

目录

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个GPUtf.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.mzph.cn/pingmian/14568.shtml

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

相关文章

Kafka之【生产消息】

消息(Record) 在kafka中传递的数据我们称之为消息(message)或记录(record),所以Kafka发送数据前,需要将待发送的数据封装为指定的数据模型: 相关属性必须在构建数据模型时指定,其中…

深入了解YUM:原理、作用及异常处理最佳实践20240523

深入了解YUM:原理、作用及异常处理最佳实践 引言 作为一名Linux系统管理员或开发者,你一定对软件包管理有深刻的理解。在CentOS等基于RPM的系统中,YUM(Yellowdog Updater, Modified)是一个强大的包管理工具。它不仅简…

本地spark3.5(不整合hive) 集成paimon0.9

spark官网下载集成hadoop的spark包: spark-3.5.1-bin-hadoop3.... 解压后 环境变量配置 SPARK_HOME spark-defaults.conf 中增加一行配置(避免启动spark-sql报错hive元数据连不上): spark.sql.catalogImplementationhive 打开paimon官网: https://paimon.apache.org/docs/mas…

JavaEE技术之分布式事务(理论、解决方案、Seata解决分布式事务问题、Seata之原理简介、断点查看数据库表数据变化)

文章目录 JavaEE技术之分布式事务准备:1. 本地事务回顾1.1 什么是事务1.2 事务的作用1.3 事务ACID四大特性1.4 事务的并发问题1.5 MySQL事务隔离级别1.6 事务相关命令(了解)1.7 事务传播行为(propagation behavior)1.8 伪代码练习1.9 回滚策略1.10 超时事…

144.栈和队列:有效的括号(力扣)

题目描述 代码解决 class Solution { public:bool isValid(string s) {// 如果字符串长度为奇数&#xff0c;不可能是有效的括号字符串if(s.size() % 2 ! 0) return false;// 使用栈来存放括号stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size();…

Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在

目录 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 三、解决办法 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 给依赖加版本号&#xff0c;并且把版本换了个遍&#xff0c;也不行&#xff0c;也去update过ma…

MYSQL变更性别

Salary 表&#xff1a; ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | ----------------------- id 是这个表的主键&#xff…

Parasoft C++Test软件静态分析操作指南_软件质量度量

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

C语言章节学习归纳--数据类型、运算符与表达式

3.1 C语言的数据类型&#xff08;理解&#xff09; 首先&#xff0c;对变量的定义可以包括三个方面&#xff1a; 数据类型 存储类型 作用域 所谓数据类型是按被定义变量的性质&#xff0c;表示形式&#xff0c;占据存储空间的多少&#xff0c;构造特点来划分的。在C语言中&…

2461. 长度为 K 子数组中的最大和(c++)

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件&#xff0c;返回 0 。 子数…

设计模式6——单例模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 单例模式&#xff08;Singleto…

完成商品属性分组和商品属性关联维护

文章目录 1.前端页面搭建1.复制attrgroup-attr-relation.vue到src/views/modules/commodity下2.加入超链接和引入组件 src/views/modules/commodity/attrgroup.vue1.加入超链接2.引入组件 3.数据池加入变量4.使用组件1.引用组件2.添加方法3.测试&#xff0c;点击关联&#xff0…

建站平台布局结构

建站平台布局结构对于网站的成功至关重要。一个良好的布局结构能够有效地吸引用户&#xff0c;提升用户体验&#xff0c;并且有助于网站的搜索引擎优化&#xff08;SEO&#xff09;。在设计网站布局结构时&#xff0c;需要考虑到用户导航、信息层次结构、页面加载速度等方面&am…

Jackson的使用技巧,实现一个JSON字符串转Map的工具

Jackson Jackson是Java编程语言中使用非常广泛的一个用于处理JSON格式数据的库。它提供了快速、灵活、功能丰富的方式来解析和生成JSON数据。Jackson的一些显著优势包括: 1. 高性能 Jackson在处理大型JSON数据时展现出了优异的性能。它采用了高效的处理方式和算法来解析和…

椋鸟Linux笔记#0:学习Linux前

文章目录 关于LinuxLinux环境的搭建直接安装Linux系统安装在虚拟机上安装为WSL2子系统使用云服务白嫖云服务&#xff08;不是广告&#xff09; 直接控制台连接远程服务器使用XShell连接远程服务器 萌新的学习笔记&#xff0c;写错了恳请斧正。 关于Linux Linux 是一种开源操作…

Android JetPack快速上手

学习地址 【Android Jetpack组件从入门到入坟&#xff0c;全家桶全面学习教程精讲&#xff0c;通俗易懂】 review 研究生期间接触过一部分android开发&#xff0c;近期有个小项目需要进行开发&#xff0c;临时恶补了一下Android相关知识点&#xff0c;突然发现Android新增了…

学习javascript的数组

1.什么是数组? 数组&#xff1a;&#xff08;Array&#xff09;是一种数据类型&#xff0c;属于引用数据类型。 作用&#xff1a;在单个变量名下存储多个数据 2.声明语法 let 数组名 [数据1&#xff0c;数据2......]; 注意事项&#xff1a; 数组是按照顺序保存&#xff0…

企业级大数据平台建设方案

企业级大数据平台建设方案 方案简介硬件软件分布式存储&#xff1a;Foreman作为集群管理工具Sparkcloudera 方案简介 该方案是多年前在Roadstar.ai任职时的建设方案&#xff0c;现将方案部分细节开源&#xff0c;结合本博客的其他文章&#xff0c;能够建立可靠的企业大数据平台…

来盘点我的校园生活(4)

今天我们班出大事了&#xff01; 今天英语老师没来&#xff0c;我们以为其他英语老师来了&#xff0c;但下午一去办公室&#xff0c;我小脑直接萎缩&#xff0c;我都看得怀疑人生了&#xff0c;一个英语老师没有&#xff0c;作业咋办呢&#xff1f; 后来通过18班班主任英语老…

ollama导入自己微调后的模型胡言乱语

1.ollama导入自己微调后的模型胡言乱语 原因&#xff1a;Modelfile的模板格式不对&#xff0c;对的如下所示 ##格式0FROM tinyllama-my-model.gguf### Set the system message SYSTEM """ You are a super helpful helper. """PARAMETER stop …