本文正在参与「金石方案 . 分割6万现金大奖」

前语

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

本文流程

整个流程如下所示:

  • 1.加载数据,处理数据
  • 2.运用 keras 建立深度学习模型
  • 3.界说丢失函数
  • 4.装备编译模型
  • 5.运用练习数据练习模型
  • 6.运用测验数据评价模型
  • 7.展现不运用归一化的操作的练习和评价成果

首要思路和实现

(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 建立深度学习模型

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

  1. 第一层要接收图片的输入,每张图片是 28*28 个像素点组成的,所以 input_shape=(28, 28)

  2. 第二层是一个输出 128 维度的全衔接操作

  3. 第三层是要对第二层的输出随机丢弃 20% 的 Dropout 操作,这样有利于模型的泛化

  4. 第四层是一个输出 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% 左右。