使用 tf.Keras 进行 Fashion-MNIST 分类
2018 年 4 月 24 日
作者:Margaret Maynard-Reid

本教程介绍了如何使用卷积神经网络 (CNN) 架构,利用 tf.keras 对 Fashion-MNIST 数据集进行分类。只需几行代码,您就可以定义并训练一个模型,该模型能够对图像进行分类,准确率超过 90%,即使没有进行太多优化。


Fashion-MNIST 可用作原始 MNIST 数据集(10 类手写数字)的直接替代品。它共享相同的图像大小 (28x28) 和训练结构(60,000 个)和测试结构(10,000 个)拆分。它非常适合编写深度学习的“Hello World”教程。

Keras 是一款流行且广受好评的高级深度学习 API。除了是一个独立的开源项目外,它还直接集成到 TensorFlow 中。您可以像往常一样编写所有常用的 Keras 程序,主要变化只是导入方式。使用 tf.keras 可以让您利用诸如渴望执行和 tf.data 之类的功能,如果您将来需要的话。在这里,我将介绍一些基础知识。

我将尝试介绍一些深度学习术语。如果您是深度学习新手,我建议您将我的教程与使用原始低级 TensorFlow API 的较旧的 MNSIT 教程进行对比,以便了解事情变得多么容易。

在 Colab 中运行此笔记本

以下所有代码都位于我 GitHub 上的 Jupyter Notebook 中。您可以通过直接打开我 GitHub 上的 Jupyter Notebook(使用 Colab) 来打开笔记本,该笔记本在 Google 云端的 VM 上运行,无需进行任何设置。如果您只想快速打开笔记本并按照本教程进行操作,请选择此选项。要详细了解 Colab,请阅读官方博客文章或阅读我关于 Colab 的博客文章此处

数据

fashion_mnist 数据集中有十个类别需要分类

标签 说明
0 T 恤/上衣
1 长裤
2 套头衫
3 连衣裙
4 外套
5 凉鞋
6 衬衫
7 运动鞋
8 包
9 短靴

导入 fashion_mnist 数据集

让我们导入数据集并为训练、验证和测试做好准备。

使用 keras.datasets API,只需一行代码即可加载 fashion_mnist 数据。然后,使用另一行代码加载训练数据集和测试数据集。每个灰度图像为 28x28。
# Note in Colab you can type "pip install" directly in the notebook
!pip install -q -U tensorflow>=1.8.0
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# Load the fashion-mnist pre-shuffled train data and test data
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
print("x_train shape:", x_train.shape, "y_train shape:", y_train.shape)

可视化数据

我最喜欢 Jupyter Notebook 的地方是可视化功能。您可以使用 matplotlib 库的 imshow() 可视化训练数据集中的图像,以查看数据集中的图像之一。请注意,每个图像都是 28x28 的灰度图像。
# Show one of the images from the training dataset
plt.imshow(x_train[img_index])

数据归一化

然后,我们对数据维度进行归一化,使其处于大致相同的比例。
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

将数据拆分为训练/验证/测试数据集

在前面的导入日期步骤中,我们有 60,000 个训练数据集和 10,000 个测试数据集。现在,我们将训练数据进一步拆分为训练/验证。以下是深度学习中每种类型的数据集的使用方式
  • 训练数据 — 用于训练模型
  • 验证数据 — 用于调整超参数并评估模型
  • 测试数据 — 用于在模型通过验证集的初步验证后测试模型。

模型

让我们定义模型并对其进行训练。

创建模型架构

Keras 中有两种定义模型的 API
  1. 顺序模型 API
  2. 函数式 API
在本教程中,我们使用顺序模型 API 创建一个简单的 CNN 模型,重复几个卷积层、池化层和 dropout 层。如果您有兴趣了解使用函数式 API 的教程,请查看 Sara Robinson 的博客使用 Keras 函数式 API 和 TensorFlow 预测葡萄酒价格。请注意,您只需要在第一层定义输入数据形状。最后一层是一个具有 softmax 激活的密集层,对 fashion_mnist 中的 10 个类别数据进行分类。
model = tf.keras.Sequential()
# Must define the input shape in the first layer of the neural network
model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1))) 
model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
# Take a look at the model summary
model.summary()

编译模型

我们使用 model.compile() 在训练模型之前配置学习过程。在这里,您定义损失函数类型、优化器以及模型在训练和测试期间评估的指标。
model.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])

训练模型

我们将使用 64 的 batch_size 和 10 个 epoch 训练模型。
model.fit(x_train,
         y_train,
         batch_size=64,
         epochs=10,
         validation_data=(x_valid, y_valid),
         callbacks=[checkpointer])

测试准确率

我们获得了超过 90% 的测试准确率。
# Evaluate the model on test set
score = model.evaluate(x_test, y_test, verbose=0)
# Print test accuracy
print('\n', 'Test accuracy:', score[1])

可视化预测

现在,我们可以使用训练后的模型对测试datasetmodel.predict(x_test) 进行预测/分类并对其进行可视化。如果标签为红色,则表示预测与真实标签不匹配;否则为绿色。 15 个预测的可视化
15 个预测的可视化
下一篇文章
Fashion-MNIST with tf.Keras

作者:Margaret Maynard-Reid

本教程介绍了如何使用卷积神经网络 (CNN) 架构,利用 tf.keras 对 Fashion-MNIST 数据集进行分类。只需几行代码,您就可以定义并训练一个模型,该模型能够对图像进行分类,准确率超过 90%,即使没有进行太多优化。


Fashion-MNIST 可用作原始 MNIST 数据集… 的直接替代品。