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

 我的环境:

  • 语言环境:Python3.11.2
  • 编译器:PyCharm Community Edition 2022.3
  • 深度学习环境:TensorFlow2

一、跑通代码

1.1 前期工作

1、导入数据

        因为使用的是tensorflow为CPU版本,故忽略GPU设置,直接进行数据的导入。

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

        tf.keras是TensorFlow中的一个高级API,用来快速构建神经网络。datasets模块用来加载数据集,在该例中用于加载mnist数据集,它将返回包含训练图像、训练标签、测试图像和测试标签四个numpy数组。layers模块中包含了构建神经网络中常用的各种网络层的类,可以用于构建自定义神经网络。而models模块包含了tf.keras中的一些内置模型。

2、归一化

        对图像的特征缩放有两种方法——归一化与标准化,用于将不同量纲的特征处理至同一数量级,减小方差大的特征的影响,使模型更准确,加快学习算法的收敛程度,此处使用灰度图,其最大值均为255,最小值均为0,故使用归一化进行操作。

#归一化处理
train_images, test_images = train_images/255.0, test_images/255.0
#输出维度信息
print(train_images.shape, test_images.shape, train_labels.shape, test_labels.shape)

'''
输出:((60000,28,28),(10000,28,28),(60000,),(10000,))
'''

3、可视化图片

        使用matplotlib.pyplot实现图片可视化:

#设置画布大小20宽、10长
plt.figure(figsize=(20,10))
#展示数据集前20个图片,遍历下标0~19
for i in range(20):
    #将画布分为2行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_label[i])
#显示图片
plt.show

        运行结果:

 4、调整图片格式

        通过设置将图片调整为我们需要的格式:

#参数分别为样本数,高,宽,通道数
train_images = train_images.reshape((60000,28,28,1))
test_images = test_images.reshape((60000,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,)
'''

         此处调整了通道数,若要调整高或宽,需要对应比例调整样本数或宽或高。

1.2 构建CNN网络模型 

        简单的CNN网络模型包含输入层、两个卷积层、两个池化层、Flatten层、全连接层以及输出层。

        卷积层:用于对输入图像进行降维和提取图片中的信息,这些信息为图片的特征。图片在计算机中以一个个矩阵进行展示,图片有几个通道就是由几个矩阵相加而成,卷积操作就是由卷积核先从左到右,再从上到下的对每个通道的矩阵进行互相关计算(对应位置相乘再相加,最后通道的值也对应相加)。

        池化层:对卷积层中提取的特征进行挑选,是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量(不进行反向传播,且减少了特征图的变量个数),减小过拟合,同时提高模型的鲁棒性。常见的池化操作有最大池化和平均池化

        全连接层:将池化层的所有特征矩阵转化为一维大向量,进行高级推理。

#设置Sequential模型,创建神经网络
model = models.Sequential([
    #设置二维卷积层1,设置32个3*3卷积核,activation参数将激活函数设置为ReLU函数
    #input_shape设置图形的输入形状
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    #池化层1,2*2采样
    layers.MaxPooling2D(2*2),
    #设置二维卷积层2,设置64个3*3卷积核,激活函数设置为ReLU函数
    layers.Conv2D(64, (3, 3), activation='relu'),
    #池化层2,2*2采样
    layers.MaxPooling2D((2, 2)),

    #Flatten层,用于连接卷积层与全连接层
    layers.Flatten(),
    #全连接层,特征进一步提取,64为输出空间的维数(神经元),激活函数为ReLU函数
    layers.Dense(64,activation='relu'),
    #输出层,10为输出空间的维数
    layers.Dense(10)
])
#打印网络结构
model.summary()

        运行结果:

1.3 编译模型 

        设置优化器、损失函数以及metrics 

        损失函数:深度学习模型用来计算目标预测错误程度。通过损失函数计算得到的误差结果,需要对模型参数(权重与偏差)进行很小的改动,以此减小预测错误。y_pred指预测数据向量。

        优化器:优化损失函数,以使损失函数最小化的方式更改可训练参数。损失函数指导优化器朝正确的方向移动。优化器即最优算法,以求模型最优解。可以分为三类:梯度下降法、动量优化法、自适应学习率优化法。此处使用的是自适应学习率优化

        metrics:用于指定在训练和评估模型时要使用的指标。该参数为一个列表,可以包含多个指标。此处为准确率。

#compile()方法用于在配置训练方法时设置优化器、损失函数和准确率评测标准
model.compile(
    #设置优化器为Adam优化器
    optimizer = 'adam'
    #设置损失函数为交叉熵损失函数
    #from_logits为True时,会将y_pred转化为概率
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    #设置性能指标列表,将在模型训练时对列表中的指标进行监控
    metrics = ['accuracy']
)

1.4 训练模型 

        model.fit()用于为计算该类处理所需的相关参数。验证集不参与训练,并在每次epochs结束后测试模型的指标

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

 

1.5 预测

#显示测试集第一张图片
plt.imshow(test_images[0])
plt.show()
#输出测试集第一张图片的预测结果
#先对所有图片进行预测
pre = model.predict(test_images)
#输出第一张图片的预测结果
print(pre[1])

        测试集的第一张图片(此处为彩色是因为matplotlib库图像显示问题): 

 

         机器学习结果:

         显示的是该图片为0~9中数字的可能性,并非为概率,数字越大可能性越大。

        至此代码运行完成。

 二、理解深度学习

        深度学习即通过提取数据特征对数据进行分析的一种方法,通过利用反向传播算法,从大量的训练样本中学习统计规律,从而对未知事物做预测。它并非传统的将代码的由因得果,而是通过对大量数据建立模型,进行‘统计’。在mnist手写集实例中,通过对训练集进行特征提取、降维分析,来对测试集进行预测。导入图片后对图片格式进行调整,通过Sequential模型构建简单的CNN神经网络,设置神经网络的损失函数、优化器以及监控指标对模型进行编译,通过训练集训练后对测试集进行预测,从而获取当成训练的指标。最后利用神经网络对测试集进行预测。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值