🍨 本文为🔗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等,处理运行过程中出现的报错,成功运行代码。