使用TensorFlow构建神经网络:使用 TensorFlow 进行 Fashion-MNIST 服装分类
计算机视觉和深度学习的全新基准数据集是服装分类问题。Zalando提供的Fashion-MNIST数据集是时尚相关文章的照片集合。尽管数据集很简单,但它可用于学习和应用深度卷积神经网络开发、评估和应用图像分类。顺序 API函数式 API在该网络的顶层,当图层展平照片时,照片的格式从二维数组(28 x 28 像素)更改为一维数组(28 * 28 = 784 像素)。该层重构时尚MNIST数据。无需学
概述
计算机视觉和深度学习的全新基准数据集是 Fashion-MNIST 服装分类问题。Zalando提供的Fashion-MNIST数据集是时尚相关文章的照片集合。尽管数据集很简单,但它可用于学习和应用深度卷积神经网络开发、评估和应用图像分类。
我们在建设什么?
本文将使用 TensorFlow 框架构建深度学习模型来处理问题。更具体地说,我们将学习如何使用类数值图像以外的数据集创建分类模型。
问题陈述
在线时尚市场正在不断扩大。需要一个识别和分类人类服装的人工智能系统来增加销售额或更好地了解用户。可以识别服装的算法可以帮助服装销售行业的企业了解潜在客户的概况,并专注于针对特定利基市场的销售。
先决条件
您需要了解深度学习模型及其框架。如果没有,请对它们的工作原理有一个概念性的理解。为了解决这个问题,我们将采用 TensorFlow 2.0 中提供的 Fashion MNIST 数据集,该数据集使用 Keras 作为高级 API 库,从图像中识别人类服装。
我们将如何构建它?
我们正在使用来自 Keras API 的 Fashion MNIST 数据集来构建具有前馈和反向传播技术的深度学习模型,该模型使用不同的层启动计算以从数据集中学习特征并预测图像所属的类别。
最终输出
因此,我们可以预测它所属的图像的类别。
要求
本文将指导您使用 Python TensorFlow 库为时尚 MNIST 图像分类问题构建端到端的深度学习模型。此外,我们使用 Numpy 和 Matplotlib 库来处理数组并创建 Python 可视化。确保您拥有所有上述库的最新版本,以实现以下代码。
使用 TensorFlow 的时尚 MNIST 服装分类
Zalando的文章照片包括2017年发布的Fashion-MNIST数据集,该数据集包含60,000个样本的训练集和10,000个样本的测试集。每幅插图都是一个 28 x 28 的灰度图形,并配有从十个类别之一中提取的标签。Zalando希望Fashion-MNIST在测试机器学习方法时成为原始MNIST数据集的简单替代品。
时尚MNIST的类标签是:
指数 | 类名 |
---|---|
0 | T恤/上衣 |
1 | 裤子 |
2 | 套衫 |
3 | 连衣裙 |
4 | 外套 |
5 | 凉鞋 |
6 | 衬衫 |
7 | 运动鞋 |
8 | 袋 |
9 | 踝靴 |
从上图中我们可以看出,“目标”数据集包含 10 个类标签(0 个用于 T 恤/上衣,1 个用于裤子,..9 用于踝靴)。我们必须根据文章的照片将文章分类为这些组之一,因此问题是“多类分类”之一。
导入数据集
导入必要的库以执行此分类
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import keras
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
探索数据
加载 Fashion-MNIST 训练和测试数据集,并打印其形状。我们可以看到训练数据集包含 60,000 个样本,而测试数据集包含 10,000 个样本。我们还可以看到图像是正方形的,尺寸为 28 28 像素。
print("No. images in training set {}".format(x_train.shape))
print("No. labels in training set {}".format(y_train.shape))
print("No. images in test set {}".format(x_test.shape))
print("No. labels in test set {}".format(y_train.shape))
输出:
No. images in the training set (60000, 28, 28)
No. labels in the training set (60000,)
No. images in the test set (10000, 28, 28)
No. Labels in the test set (60000,)
现在,我们将绘制一个输入图像来观察它是如何显示的:
img = x_train[0].reshape(28,28)
plt.imshow(img1, cmap='Greys')
输出:
预处理数据
集合中的每个图像都具有介于 0 到 255 或黑白之间的无符号整数像素值。尽管我们仍在确定理想的建模扩展策略,但我们知道需要一些扩展。
灰度图像应首先对其像素值进行归一化,例如,将其重新缩放到 [0, 1] 范围。规范化必须首先将数据类型中的无符号整数转换为浮点数,然后必须将像素值除以最大值。
x_train, x_test = tf.cast(x_train/255.0, tf.float32), tf.cast(x_test/255.0, tf.float32)
构建模型
让我们继续构建一个简单的神经网络模型来预测我们的服装类别。
另一个广泛使用的深度学习软件包是 Keras。在谷歌,弗朗索瓦·乔莱特(François Chollet)创造了它。它以其快速的原型设计和易于构建的模型而闻名。但是,它是一个高级库,因此它不会执行卷积等低级任务。为了实现这一点,它使用了像 TensorFlow 这样的后端引擎。TensorFlow 2.0 使用 tf.keras 中提供的 Keras API 作为其主要 API。
Keras的模型构建涉及四个关键过程:
- 定义模型
- 编译模型
- 拟合模型
- 评估模型
定义模型
Keras 提供了两个用于定义模型的 API:
- 顺序 API
- 函数式 API
在该网络的顶层,当图层展平照片时,照片的格式从二维数组(28 x 28 像素)更改为一维数组(28 * 28 = 784 像素)。 该层重构时尚MNIST数据。无需学习任何参数。考虑此图层在图像中排列和取消堆叠像素行。当像素被展平时,一系列两个 tf.keras.layers 组成网络。
致密层:
这些神经元层是完全或紧密连接的。密集的顶层(或神经元)中有 128 个节点。第二个(也是最后一个)层返回一个包含 10 个元素的 logits 数组。每个节点都有一个分数,指示当前图像属于十个类中的哪一个。
让我们首先将模型定义为 Sequential() 模型,如下所示:
model = tf.keras.models.Sequential()
现在按照以下代码定义层:
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(256, activation="relu"))
model.add(tf.keras.layers.Dense(128, activation="relu"))
model.add(tf.keras.layers.Dense(10, activation="softmax"))
model.build(input_shape=[None, 28, 28])
model.summary()
输出:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense (Dense) (None, 256) 200960
dense_1 (Dense) (None, 128) 32896
dense_2 (Dense) (None, 10) 1290
=================================================================
Total params: 235,146
Trainable params: 235,146
Non-trainable params: 0
_________________________________________________________________
激活函数
这些功能在神经网络中很重要,它们决定应该激活哪个神经元。他们测量确定层的输入对于使用数学运算进行预测是否重要。 一般来说,激活函数有两种类型:
-
线性激活函数:
此函数的输出不会在范围之间受到限制。 -
非线性激活函数:
该函数的输出有助于制作图形,使模型易于泛化和适应各种数据。这些函数主要根据其范围或曲线形状进行划分:- Sigmoid 或 Logistic 激活函数。
- Softmax激活功能。
- Tanh 或双曲正切激活函数。
- ReLU(整流线性单元)激活函数。
- 泄漏的 ReLU。
Softmax激活功能
我们用于解决问题的激活函数是 softmax 激活函数。softmax 激活函数将神经网络未处理的输出转换为概率向量,即输入类上的概率分布。例如,假设有一个 N 类多类分类任务。softmax 激活返回一个包含 N 个项目的输出向量。
编译模型
模型的编译在定义之后进行。在此阶段,我们配置模型的学习过程。在构建模型时,我们指定了三个参数:
-
优化器的设置:
这指定了我们要采用的优化算法,在本例中为随机梯度下降。 -
损失因子是:
在十个类别中的每一个类别中,这个目标函数——例如回归的均方误差或分类的交叉熵损失是我们试图减少的。 -
将使用 metrics 参数评估模型的性能。指标的一个例子是准确性。 要编译模型,请执行以下代码:
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
训练模型
上面,我们创建了模型并构建了它。我们现在将开始训练模型。模型可以使用拟合函数来训练模型。以下内容用于指定我们的特征、标签、我们想要的训练周期数和批量大小:
model.fit(x_train, y_train, batch_size=32, epochs=10)
输出:
Epoch 1/10
1875/1875 [==============================] - 10s 4ms/step - loss: 0.7042 - accuracy: 0.7687
Epoch 2/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.4786 - accuracy: 0.8340
Epoch 3/10
1875/1875 [==============================] - 5s 2ms/step - loss: 0.4339 - accuracy: 0.8494
Epoch 4/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.4080 - accuracy: 0.8579
Epoch 5/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3887 - accuracy: 0.8634
Epoch 6/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3714 - accuracy: 0.8690
Epoch 7/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3595 - accuracy: 0.8740
Epoch 8/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3486 - accuracy: 0.8761
Epoch 9/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3375 - accuracy: 0.8793
Epoch 10/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3280 - accuracy: 0.8829
<keras.callbacks.History at 0x7f15d0026490>
评估准确性
我们将在训练后在测试集上评估模型。为了了解训练的准确性,我们还可以在同一个训练集上评估模型:
model.evaluate(x_test, y_test)
输出:
313/313 [==============================] - 1s 2ms/step - loss: 0.3689 - accuracy: 0.8660
[0.36889103055000305, 0.8659999966621399]
进行预测
在训练模型后,您可以利用该模型来生成有关某些图像的预测。使用 softmax 函数,我们可以将模型的线性输出(logits)转换为概率,这应该更易于理解。
probability_model = tf.keras.Sequential([model, tf.keras.layers.Softmax()])
predictions = probability_model.predict(x_test)
验证预测
在本例中,模型预测了测试集中图像的每个标签。让我们使用class_names数组将预测索引与类名进行匹配。先看预测:
class_names = ['T_shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
y_predict = class_names[np.argmax(predictions[3])]
y_predict
输出:
'Trouser'
该模型最确定此图像代表类名 [9] 踝靴。测试标签检查表明,这种分类是准确的:
y_actual = class_names[y_test[3]]
y_actual
输出:
'Trouser'
让我们从测试数据集中可视化并找到特定的时尚MNIST数据集:
img = x_test[3]
plt.imshow(img, cmap='Greys')
输出:
开发改进的模型
为了提高现有模型的性能,我们可以更好地利用卷积神经网络(CNN)重构模型层。这些网络是专门为处理图像数据而设计的。CNN每一层都变得更加复杂,可以检测到图像的更大区域。早期图层突出显示颜色和边框等基本元素。当视觉数据在 CNN 层中移动时,首先识别对象更突出的特征或形状,并最终识别出预期的对象。
结论
- 在本文中,您学习了如何使用 Keras 在 Fashion MNIST 数据集上训练简单的深度学习模型。此外,我们可以使用卷积神经网络来提高模型性能,这对于识别图像模式以识别物品、人脸和场景特别有帮助。
- 尽管 Fashion MNIST 数据集比 MNIST 数字识别数据集更复杂,除非您以与 Fashion MNIST 相同的方式预处理图像,但您不能将其用于现实世界的时尚分类任务(分割、阈值、灰度转换、调整大小等)。
更多推荐
所有评论(0)