基本分类:对服装图像进行分类

训练了一个神经网络模型来对衣服的图像进行分类,例如运动鞋和衬衫。
本指南使用tf.keras(高级API)在TensorFlow中构建和训练模型。

#引入TensorFlow 和 tf.keras
import tensorflow as tf
from tensorflow import keras

#引入numpy和matplotlib
import numpy as np
import matplotlib.pyplot as plt
#查看tensorflow的版本
print(tf.__version__)

导入Fashion MNIST数据集

使用Fashion MNIST数据集,其中包含10个类别的70,000张灰度图像。图像显示了低分辨率(28 x 28像素)的单个衣物。

tensorflow 人脸替换 tensorflow 图像_神经网络


Fashion MNIST旨在替代经典MNIST数据集,通常被用作计算机视觉机器学习程序的“ Hello,World”。MNIST数据集包含手写数字(0、1、2等)的图像,格式与您将在此处使用的衣服的格式相同。

本指南将Fashion MNIST用于多种用途,因为它比常规MNIST更具挑战性。这两个数据集都相对较小,用于验证算法是否按预期工作。它们是测试和调试代码的良好起点。

在这里,使用60,000张图像来训练网络,使用10,000张图像来评估网络学习对图像进行分类的准确度。您可以直接从TensorFlow访问Fashion MNIST。直接从TensorFlow导入和加载Fashion MNIST数据:

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

加载数据集将返回四个NumPy数组:

  • 在train_images和train_labels阵列的训练集 -The数据模型用来学习。
  • 针对测试集,和test_images,对模型进行了测试test_labels。

图像是28x28 NumPy数组,像素值范围是0到255。标签是整数数组,范围是0到9。这些对应于图像表示的衣服类别:

标签


0

T恤/上衣 T-shirt/top

1

裤子 Trouser

2

套衫 Pullover

3

连衣裙 Dress

4

涂层 Coat

5

凉鞋 Sandal

6

衬衫 Shirt

7

运动鞋 Sneaker

8

袋子 Bag

9

脚踝靴 Ankle boot

每个图像都映射到一个标签。由于类名不包含在数据集中,因此将它们存储在此处以供以后在绘制图像时使用:

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

预处理数据

在训练网络之前,必须对数据进行预处理。图片像素值落在0到255之间,将这些值缩放到0到1的范围,然后再将其输入神经网络模型。为此,将值除以255。以相同的方式预处理训练集和测试集非常重要:

train_images = train_images / 255.0

test_images = test_images / 255.0

建立模型

建立神经网络需要配置模型的各层,然后编译模型。

设置图层

神经网络的基本组成部分是层。图层从输入到其中的数据中提取表示。希望这些表示对于当前的问题有意义。

深度学习的大部分内容是将简单的层链接在一起。大多数层(例如tf.keras.layers.Dense)具有在训练期间学习的参数。

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

该网络的第一层tf.keras.layers.Flatten将图像格式从二维数组(28 x 28像素)转换为一维数组(28 * 28 = 784像素)。可以将这一层看作是堆叠图像中的像素行并将它们排成一行。该层没有学习参数。它只会重新格式化数据。

像素展平后,网络由tf.keras.layers.Dense两层序列组成。这些是紧密连接或完全连接的神经层。第一Dense层有128个节点(或神经元)。第二层(也是最后一层)返回长度为10的logits数组。每个节点包含一个得分,该得分指示当前图像属于10类之一。

编译模型

在准备训练模型之前,需要进行一些其他设置。这些是在模型的编译步骤中添加的:

  • 优化器 -这是基于模型看到的数据及其损失函数来更新模型的方式。
  • 损失函数 -衡量训练过程中模型的准确性。您希望最小化此功能,以在正确的方向上“引导”模型。
  • 指标 -用于监视培训和测试步骤。以下示例使用precision,即正确分类的图像比例。
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

训练模型

训练神经网络模型需要执行以下步骤:

  1. 将训练数据输入模型。在此示例中,训练数据在train_images和train_labels数组中。
  2. 该模型学习关联图像和标签。
  3. 您要求模型对测试集进行预测(在此示例中为test_images数组)。
  4. 验证预测是否与test_labels阵列中的标签匹配。

喂模型

要开始训练,请调用该model.fit方法,之所以这样称呼是因为该方法使模型“适合”训练数据:

model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.4999 - accuracy: 0.8245
Epoch 2/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3789 - accuracy: 0.8637
Epoch 3/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3394 - accuracy: 0.8757
Epoch 4/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3141 - accuracy: 0.8838
Epoch 5/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2953 - accuracy: 0.8909
Epoch 6/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2800 - accuracy: 0.8964
Epoch 7/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2660 - accuracy: 0.9014
Epoch 8/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2582 - accuracy: 0.9038
Epoch 9/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2461 - accuracy: 0.9084
Epoch 10/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2393 - accuracy: 0.9109
<tensorflow.python.keras.callbacks.History at 0x7f9e70d4a860>

模型训练时,会显示损失和准确性指标。该模型在训练数据上达到约0.91(或91%)的精度。

评估准确性

接下来,比较模型在测试数据集上的表现:

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\n测试精度:', test_acc)
313/313 - 0s - loss: 0.3653 - accuracy: 0.8720

测试精度: 0.871999979019165

事实证明,测试数据集的准确性略低于训练数据集的准确性。训练准确性和测试准确性之间的差距代表过度拟合。当机器学习模型在新的,以前看不见的输入上的表现比训练数据上的表现差时,就会发生过度拟合。过度拟合的模型“存储”训练数据集中的噪声和细节,从而对新数据的模型性能产生负面影响。