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

前言

本次实践项目咱们要运用 tensorflow-cpu 的 2.1 版别搭建模型,完成对 Fashion 数据集进行练习、评价和测验使命。

本文纲要

  1. 获取 Fashion 数据、处理数据
  2. 运用 tensorflow 2.1 搭建模型
  3. 装备并编译模型
  4. 练习模型
  5. 评价模型
  6. 运用模型进行猜测

完成思路和详细解读

1. 获取 Fashion 数据、处理数据

(1)本次实践项目用到的是 Fashion 数据集,包括 10 个类别的服饰灰度图片,共 70000 张,每张图片展现一件衣物,每张图片都是低分辨率的 28×28 像素(其实便是28*28的整数矩阵)。部分作用如下:

Tensorflow 2.1 实现 Fashion 图像分类

本次实践中咱们对数据集进行练习集和测验集的区分,运用 60000 张图片来练习模型,运用 10000 张图片来评价模型对服饰图片的分类的精确程度。

直接经过 tensorflow 内置的接口函数从网络上下载数据集,其中 (train_images, train_labels) 分别是练习会集的图片和标签,(test_images, test_labels) 分别是测验会集的图片和标签。

fashion = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion.load_data()

(2)这儿首要是运用列表来保存数据会集出现过的所有衣服品种的名字。

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

(3)定义一个函数,首要用来显现某张照片。

def showImage(image):
    plt.figure()
    plt.imshow(image, cmap=plt.cm.binary)
    plt.colorbar()
    plt.grid(False)
    plt.show()

(4)这儿首要展现练习会集第一张原始图片的样子,咱们能够看到每张图片都是低分辨率的 28×28 像素(其实便是28*28的矩阵数字),并且每个像素是在 0-255 之间的数字

showImage(train_images[0])

作用如下:

Tensorflow 2.1 实现 Fashion 图像分类

由于每张图片的每个像素都是 0-255 之间的整数,所以咱们为了模型练习的加快收敛,将所有的图片都进行归一化操作。

train_images = train_images / 255.0
test_images = test_images / 255.0

这儿首要展现练习会集第一张原始图片的样子经过归一化操作的成果,能够看到每个像素点都是 0-1 之间的小数。

showImage(train_images[0])

作用如下:

Tensorflow 2.1 实现 Fashion 图像分类

2. 运用 tensorflow 2.1 搭建模型

(1)由于每张图片的输入是 28*28 的像素点,所以第一层的是输入设置为 input_shape=(28, 28) ,输出的是一个 784 维的向量,该操作能够看作是将 input_shape 多维数组中的值,从头拼接到一同整合成了一个一维数组。

(2)第二层、第三层都是经过激活函数 relu 的非线性改动,输出一个 64 维向量的全连接层操作,当然这个网络结构的层数、激活函数、每层的输出维度能够自行随意调整,其大小会影响最后的模型评价的目标,理论上结构越杂乱作用越好,但是练习速度越慢,并且这也会引起过拟合的现象,这个度的掌握需求不断经过输出的目标来进行调整。

(3)第三层是输出一个 10 维度的全连接层操作,其实便是该输入图片分别归于这十个类别的对应的概率散布。

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

3. 装备并编译模型

(1)这儿咱们挑选了 Adam 优化器,这是一个比较成熟且广泛运用的优化器。

(2)这儿的丢失函数咱们挑选了比较常见的交叉熵 SparseCategoricalCrossentropy 。

(3)这儿咱们选用了最为常用的模型评价目标精确率 accuracy。

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

4. 练习模型

(1)咱们运用练习数据的图片和标签来对模型进行练习,并且设置 epochs 为 5 ,也便是将所有的练习集从头到尾重复练习 5 次,如果模型还没有收敛那你也能够把 epochs 的值设置的大一些,配合较为杂乱的网络结构,最后模型在练习阶段的精确率应该能到达 98% 以上。

(2)在模型的练习期间,命令行会显现模型全体丢失值和精确率评价目标的状况,这些都是 tensorflow 内部函数写好的输出格式,你也能够自己写代码改动。

model.fit(train_images, train_labels, epochs=5)

练习过程输出如下所示:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 78us/sample - loss: 0.5140 - accuracy: 0.8180
Epoch 2/5
60000/60000 [==============================] - 4s 73us/sample - loss: 0.3724 - accuracy: 0.8654
Epoch 3/5
60000/60000 [==============================] - 4s 74us/sample - loss: 0.3388 - accuracy: 0.8763
Epoch 4/5
60000/60000 [==============================] - 4s 70us/sample - loss: 0.3165 - accuracy: 0.8831
Epoch 5/5
60000/60000 [==============================] - 4s 74us/sample - loss: 0.2985 - accuracy: 0.8902 

5. 评价模型

(1)这儿咱们运用测验数据来对模型进行评价,评价的目标也便是之前规则的精确率。

(2)verbose=2 仅仅为了规则成果输出形式,能够挑选 0、1、2 中的任意一个 。

loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print('Test accuracy:%f, Test loss:%f'%(acc, loss))

成果输出如下所示,标明所练习的模型在测验集的评价下精确率能到达 0.8725 :

10000/1 - 1s - loss: 0.2279 - accuracy: 0.8725
Test accuracy:0.872500, Test loss:0.352148

6. 运用模型进行猜测

(1)上面模型在猜测每张图片时最后输出的都是一个 10 维的乱七八糟的浮点数数组,为了保证输出的成果是被人容易了解的,咱们在上面模型的的最后加上了一层 Softmax 。

(2)Softmax 的功用很简单,便是将这 10 个乱七八糟的浮点数,转化成 10 个概率,每个概率值在 0-1 之间,这 10 个概率的和为 1 ,这样咱们取其中最大概率的值对应的衣服类别作为咱们猜测的成果。

model_by_softmax = tf.keras.Sequential([model,  tf.keras.layers.Softmax()])
predictions = model_by_softmax.predict(test_images)
predict_for_one_image = predictions[3]
predict_for_one_image

输出概率散布如下所示:

array([4.1939876e-07, 9.9996161e-01, 8.4085507e-08, 3.7719459e-05,
       3.1557637e-08, 1.0500006e-13, 1.5945717e-07, 1.3569163e-13,
       1.8028586e-09, 4.5183642e-11], dtype=float32)

(3)查看一张测验图片在这 10 个衣服类别中的概率散布,咱们发现 9.9996161e-01 最大,标明该图片成为第二类衣服样式的概率最大。

(4)咱们能够输出猜测的衣服品种,经过查找最大概率对应的衣服品种,发现该图片被猜测的衣服类别是 Trouser 。

class_names[np.argmax(predict_for_one_image)]

输出成果如下:

'Trouser'

(5)咱们将原始图片绘制出来发现确实是一条裤子,说明模型猜测正确。

showImage(test_images[3])

展现作用如下:

Tensorflow 2.1 实现 Fashion 图像分类