基本分类:对服装图像进行分类
训练了一个神经网络模型来对衣服的图像进行分类,例如运动鞋和衬衫。
本指南使用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像素)的单个衣物。
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'])
训练模型
训练神经网络模型需要执行以下步骤:
- 将训练数据输入模型。在此示例中,训练数据在train_images和train_labels数组中。
- 该模型学习关联图像和标签。
- 您要求模型对测试集进行预测(在此示例中为test_images数组)。
- 验证预测是否与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
事实证明,测试数据集的准确性略低于训练数据集的准确性。训练准确性和测试准确性之间的差距代表过度拟合。当机器学习模型在新的,以前看不见的输入上的表现比训练数据上的表现差时,就会发生过度拟合。过度拟合的模型“存储”训练数据集中的噪声和细节,从而对新数据的模型性能产生负面影响。