365天深度学习训练营-第T1周:实现mnist手写数字识别

本文是作者在365天深度学习训练营中的学习记录,主要实现了使用TensorFlow进行MNIST手写数字识别。首先介绍了TensorFlow的基本概念,然后详细描述了MNIST数据集,接着通过构建CNN网络模型进行训练,并进行了预测。在实验中,作者还涉及了数据预处理、GPU配置和模型评估等方面。
摘要由CSDN通过智能技术生成

🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍦 参考文章:[365天深度学习训练营-第P1周:实现mnist手写数字识别](Pytorch实战 | 第P1周:实现mnist手写数字识别 (qq.com))**
🍖 原作者:K同学啊|接辅导、项目定制

🏡 我的环境:

语言环境:Python 3.9.0

编译器:Pycharm 2022.1.3

深度学习环境:tensorflow

硬件配置:I512490F +3060ti(8G)

🍺 要求:

跑通第一个程序(✔)
了解什么是深度学习(✔)

🍺 提升:
1.了解tensorflow框架构建,以及相关基础知识。(✔)
2.了解mnist数据集。(✔)
3.了解CNN网络。(✔)

准备

Tensorflow介绍

什么是Tensorflow?
TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。

**Tensor(张量)**意味着N维数组,Flow(流)意味着基于数据流图的计算。
Tensorflow运行过程就是张量从图的一端流动到另一端的计算过程。张量从图中流过的直观图像是其取名为“TensorFlow”的原因。

**张量Tensor:**在数学上,张量是N维向量,这意味着张量可以用来表示N维数据集。

**计算图(流, flow):**流是指一个计算图或简单的一个图,图不能形成环路,图中的每个节点代表一个操作,如加法、减法等。每个操作都会导致新的张量形成。

mnist数据集

MNIST是一个手写体数字的图片数据集,该数据集来由美国国家标准与技术研究所(National Institute of Standards and Technology (NIST))发起整理,一共统计了来自250个不同的人手写数字图片,其中50%是高中生,50%来自人口普查局的工作人员。该数据集的收集目的是希望通过算法,实现对手写数字的识别。它包含了4 44个部分:

1.训练数据集:train-images-idx3-ubyte.gz (9.45 MB,包含60,000个样本)。
2.训练数据集标签:train-labels-idx1-ubyte.gz(28.2 KB,包含60,000个标签)。
3.测试数据集:t10k-images-idx3-ubyte.gz(1.57 MB ,包含10,000个样本)。
4.测试数据集标签:t10k-labels-idx1-ubyte.gz(4.43 KB,包含10,000个样本的标签)。

Mnist数据集下载方式:
1.从官网下载:Mnist数据集官网:http://yann.lecun.com/exdb/mnist/
2.使用Tensorflow导入数据集:
在这里插入图片描述

项目实现

实验结果:

在这里插入图片描述
在这里插入图片描述

实现代码:

import numpy as np
import tensorflow as tf
from keras import datasets, layers, models # 这里keras版本是2.8.0
import matplotlib.pyplot as plt

设置采用GPU训练程序

gpus = tf.config.list_physical_devices(“GPU”) # 获取电脑GPU列表
if gpus: # gpus不为空-
gpu0 = gpus[0] # 选取GPU列表中的第一个
tf.config.experimental.set_memory_growth(gpu0, True) # 设置GPU显卡按需使用
tf.config.set_visible_devices([gpu0], “GPU”) # 设置GPU可见的设备清单,默认是都可见,这里只设置了gpu0可见

导入数据集

(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() # datasets内部集成了MNIST数据集,

归一化

将像素的值标准化至0到1的区间内,rgb像素值 0~255 0为黑 1为白

train_images, test_images = train_images / 255.0, test_images / 255.0

根据数据集大小调整数据到我们需要的格式

print(train_images.size) # 47040000
print(test_images.size) # 7840000
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

构建CNN网络模型

model = models.Sequential([ # 采用Sequential 顺序模型
layers.Conv2D(32, (3, 3), activation=‘relu’, input_shape=(28, 28, 1)),
# 卷积层1,卷积核个数32,卷积核331 relu激活去除负值保留正值,输入是28281
layers.MaxPooling2D((2, 2)), # 池化层1,2*2采样

layers.Conv2D(64, (3, 3), activation='relu'),
# 卷积层2,卷积核64个,卷积核3*3,relu激活去除负值保留正值
layers.MaxPooling2D((2, 2)),  # 池化层2,2*2采样

layers.Flatten(),  # Flatten层,连接卷积层与全连接层
layers.Dense(64, activation='relu'),  # 全连接层,64张特征图,特征进一步提取
layers.Dense(10)  # 输出层,输出预期结果

])

打印网络结构

model.summary()

编译

model.compile(optimizer=‘adam’, # 优化器
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
# 设置损失函数from_logits: 为True时,会将y_pred转化为概率
metrics=[‘accuracy’])

训练

epochs为训练轮数

history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
print(history)

绘制测试集图片

plt.figure(figsize=(20, 10)) # 这里只看20张,实际上并不需要可视化图片这一步骤
for i in range(20):
plt.subplot(5, 10, i + 1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(test_images[i], cmap=plt.cm.binary)
plt.xlabel(test_labels[i])
plt.show()

预测

pre = model.predict(test_images) # 对所有测试图片进行预测
for x in range(5):
print(pre[x])
for x in range(5):
print(np.array(pre[x]).argmax())

总结与体会:

1.本次实验是第一次进行深度学习的相关实验,也是在课余时间进行的,对于深度学习的知识了解的还不够全面,只能勉强做到跑通程序,还有许多要深入学习的地方。
2.学习过程:安装pycharm,学习博主K啊同学的论文,对文章的内容进行复现,运行代码,安装程序所需的库如:tensorflow、matplotlib、numpy等,处理运行过程中出现的报错,成功运行代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值