Tensorflow2.1 MNIST图像分类实现思路分析

 更新时间:2022年11月18日 17:15:54   作者:我是王大你是谁  
这篇文章主要为大家介绍了Tensorflow2.1 MNIST图像分类实现思路分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

之前工作中主要使用的是 Tensorflow 1.15 版本,但是渐渐跟不上工作中的项目需求了,而且因为 2.x 版本和 1.x 版本差异较大,所以要专门花时间学习一下 2.x 版本,本文作为学习 Tensorflow 2.x 版本的开篇,主要介绍了使用 cpu 版本的 Tensorflow 2.1 搭建深度学习模型,完成对于 MNIST 数据的图片分类的任务。

主要思路和实现

(1) 加载数据,处理数据

这里是要导入 tensorflow 的包,前提是你要提前安装 tensorflow ,我这里为了方便直接使用的是 cpu 版本的 tensorflow==2.1.0 ,如果是为了学习的话,cpu 版本的也够用了,毕竟数据量和模型都不大。

import tensorflow as tf

这里是为了加载 mnist 数据集,mnist 数据集里面就是 0-9 这 10 个数字的图片集,我们要使用深度学习实现一个模型完成对 mnist 数据集进行分类的任务,这个项目相当于 java 中 hello world 。

mnist = tf.keras.datasets.mnist

这里的 (x_train, y_train) 表示的是训练集的图片和标签,(x_test, y_test) 表示的是测试集的图片和标签。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

每张图片是 28*28 个像素点(数字)组成的,而每个像素点(数字)都是 0-255 中的某个数字,我们对其都除 255 ,这样就是相当于对这些图片的像素点值做归一化,这样有利于模型加速收敛,在本项目中执行本操作比不执行本操作最后的准确率高很多,在文末会展示注释本行情况下,模型评估的指标结果,大家可以自行对比差异。

x_train, x_test = x_train / 255.0, x_test / 255.0

(2) 使用 keras 搭建深度学习模型

这里主要是要构建机器学习模型,模型分为以下几层:

  • 第一层要接收图片的输入,每张图片是 28*28 个像素点组成的,所以 input_shape=(28, 28)
  • 第二层是一个输出 128 维度的全连接操作
  • 第三层是要对第二层的输出随机丢弃 20% 的 Dropout 操作,这样有利于模型的泛化

第四层是一个输出 10 维度的全连接操作,也就是预测该图片分别属于这十种类型的概率

 model = tf.keras.models.Sequential([
   tf.keras.layers.Flatten(input_shape=(28, 28)),
   tf.keras.layers.Dense(128, activation='relu'),
   tf.keras.layers.Dropout(0.2),
   tf.keras.layers.Dense(10)
 ])

(3) 定义损失函数

这里主要是定义损失函数,这里的损失函数使用到了 SparseCategoricalCrossentropy ,主要是为了计算标签和预测结果之间的交叉熵损失。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

(4) 配置编译模型

这里主要是配置和编译模型,优化器使用了 adam ,要优化的评价指标选用了准确率 accuracy ,当然了还可以选择其他的优化器和评价指标。

model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy'])

(5) 使用训练数据训练模型

这里主要使用训练数据的图片和标签来训练模型,将整个训练样本集训练 5 次。

model.fit(x_train, y_train, epochs=5) 

训练过程结果输出如下:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 43us/sample - loss: 0.2949 - accuracy: 0.9144
Epoch 2/5
60000/60000 [==============================] - 2s 40us/sample - loss: 0.1434 - accuracy: 0.9574
Epoch 3/5
60000/60000 [==============================] - 2s 36us/sample - loss: 0.1060 - accuracy: 0.9676
Epoch 4/5
60000/60000 [==============================] - 2s 31us/sample - loss: 0.0891 - accuracy: 0.9721
Epoch 5/5
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0740 - accuracy: 0.9771
10000/10000 - 0s - loss: 0.0744 - accuracy: 0.9777

(6) 使用测试数据评估模型

这里主要是使用测试数据中的图片和标签来评估模型,verbose 可以选为 0、1、2 ,区别主要是结果输出的形式不一样,嫌麻烦可以不设置

model.evaluate(x_test,  y_test, verbose=2)

评估的损失值和准确率如下:

[0.07444974237508141, 0.9777]

(7) 展示不使用归一化的操作的训练和评估结果

在不使用归一化操作的情况下,训练过程输出如下:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 42us/sample - loss: 2.4383 - accuracy: 0.7449
Epoch 2/5
60000/60000 [==============================] - 2s 40us/sample - loss: 0.5852 - accuracy: 0.8432
Epoch 3/5
60000/60000 [==============================] - 2s 36us/sample - loss: 0.4770 - accuracy: 0.8724
Epoch 4/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.4069 - accuracy: 0.8950
Epoch 5/5
60000/60000 [==============================] - 2s 32us/sample - loss: 0.3897 - accuracy: 0.8996
10000/10000 - 0s - loss: 0.2898 - accuracy: 0.9285

评估结果输入如下:

[0.2897613683119416, 0.9285]

所以我们通过和上面的进行对比发现,不进行归一化操作,在训练过程中收敛较慢,在相同 epoch 的训练之后,评估的准确率和损失值都不理想,损失值比第(6)步操作的损失值大,准确率比第(6)步操作低 5% 左右。

以上就是Tensorflow2.1 MNIST图像分类实现思路分析的详细内容,更多关于Tensorflow2.1 MNIST图像分类的资料请关注脚本之家其它相关文章!

相关文章

  • python中的常用运算符和优先级

    python中的常用运算符和优先级

    这篇文章主要介绍了python中的常用运算符和优先级,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Python THREADING模块中的JOIN()方法深入理解

    Python THREADING模块中的JOIN()方法深入理解

    这篇文章主要介绍了Python THREADING模块中的JOIN()方法深入理解,本文用简洁易懂的语言总结了对JOIN()方法的理解,不同于其它文章,需要的朋友可以参考下
    2015-02-02
  • Python随机生成手机号、数字的方法详解

    Python随机生成手机号、数字的方法详解

    这篇文章主要介绍了Python随机生成手机号、数字的方法,结合完整实例形式分析了Python编程生成随机手机号与数字的实现方法及相关函数用法,需要的朋友可以参考下
    2017-07-07
  • Python数学建模PuLP库线性规划进阶基于字典详解

    Python数学建模PuLP库线性规划进阶基于字典详解

    在大规模的规划问题中,这样逐个定义变量和设置模型参数非常繁琐,效率很低。Pulp 库提供了一种快捷方式,可以结合 Python语言的循环和容器,使用字典来创建问题
    2021-10-10
  • python实现录屏功能(亲测好用)

    python实现录屏功能(亲测好用)

    这篇文章主要介绍了使python实现录屏功能(亲测好用),本文通过实例代码给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Python利用遗传算法探索迷宫出路实例深究

    Python利用遗传算法探索迷宫出路实例深究

    当处理迷宫问题时,遗传算法提供了创新的解决方案,本文将深入探讨如何运用Python和遗传算法来解决迷宫问题,这是一个经典的寻路问题,寻找从起点到终点的最佳路径,遗传算法是一种启发式优化方法,适用于解决复杂问题,其中个体进化和自然选择的概念被用于寻找最优解
    2023-12-12
  • 基于KL散度、JS散度以及交叉熵的对比

    基于KL散度、JS散度以及交叉熵的对比

    这篇文章主要介绍了基于KL散度、JS散度以及交叉熵的对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python根据欧拉角求旋转矩阵的实例

    Python根据欧拉角求旋转矩阵的实例

    今天小编就为大家分享一篇Python根据欧拉角求旋转矩阵的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python基于property实现类的特性操作示例

    Python基于property实现类的特性操作示例

    这篇文章主要介绍了Python基于property实现类的特性,结合实例形式分析了使用property实现类的特性相关操作技巧与注意事项,需要的朋友可以参考下
    2018-06-06
  • Python异常学习笔记

    Python异常学习笔记

    这篇文章主要介绍了Python异常学习笔记,本文着重讲解了如何自定义一个异常,需要的朋友可以参考下
    2015-02-02

最新评论