如何使用 Keras 加载和可视化标准计算机视觉数据集

在开始使用深度学习方法进行计算机视觉时,使用标准计算机视觉数据集会很方便。

标准数据集通常易于理解、数据量小且易于加载。它们可以作为测试技术和重现结果的基础,以便建立对库和方法的信心。

在本教程中,您将了解 Keras 深度学习库提供的标准计算机视觉数据集。

完成本教程后,您将了解:

  • 使用 Keras 下载标准计算机视觉数据集的 API 和惯用表达。
  • MNIST、Fashion-MNIST、CIFAR-10 和 CIFAR-100 计算机视觉数据集的结构、性质和顶级结果。
  • 如何使用 Keras API 加载和可视化标准计算机视觉数据集。

通过我的新书《深度学习用于计算机视觉启动您的项目,其中包括逐步教程和所有示例的 Python 源代码文件。

让我们开始吧。

How to Load and Visualize Standard Computer Vision Datasets With Keras

如何使用 Keras 加载和可视化标准计算机视觉数据集
摄影:Marina del Castell,保留部分权利。

教程概述

本教程分为五个部分;它们是:

  1. Keras 计算机视觉数据集
  2. MNIST 数据集
  3. Fashion-MNIST 数据集
  4. CIFAR-10 数据集
  5. CIFAR-100 数据集

Keras 计算机视觉数据集

Keras 深度学习库提供了访问四个标准计算机视觉数据集的功能。

这尤其有用,因为它允许您快速开始测试计算机视觉的模型架构和配置。

提供了四种特定的多类图像分类数据集;它们是:

  • MNIST:分类手写数字的照片(10 个类别)。
  • Fashion-MNIST:分类服装物品的照片(10 个类别)。
  • CIFAR-10:分类小物体照片(10 个类别)。
  • CIFAR-100:分类常见物体小照片(100 个类别)。

这些数据集通过数据集特定的加载函数在 keras.datasets 模块下可用。

调用加载函数后,数据集会下载到您的工作站,并存储在 ~/.keras 目录下的“datasets”子目录中。数据集以压缩格式存储,但也可能包含额外的元数据。

在首次调用数据集特定的加载函数并下载数据集后,数据集无需再次下载。后续调用将立即从磁盘加载数据集。

加载函数返回两个元组,第一个包含训练数据集中样本的输入和输出元素,第二个包含测试数据集中样本的输入和输出元素。训练集和测试集之间的划分通常遵循标准划分,用于在数据集上对算法进行基准测试。

加载数据集的标准惯例如下:

训练集和测试集的 Xy 元素分别是像素值或类别值的 NumPy 数组。

其中两个数据集包含灰度图像,另外两个包含彩色图像。灰度图像的形状必须从二维数组转换为三维数组,以匹配 Keras 首选的通道顺序。例如:

灰度图像和彩色图像的像素数据均存储为无符号整数值,取值范围在 0 到 255 之间。

在建模之前,图像数据需要重新缩放,例如归一化到 0-1 范围,甚至进一步标准化。例如:

每个样本的输出元素(y)存储为整数类别值。每个问题都是多类别分类问题(超过两个类别);因此,在建模之前对类别值进行独热编码是常见的做法。这可以通过 Keras 提供的 to_categorical() 函数实现;例如:

现在我们已经熟悉了 Keras 提供的标准计算机视觉数据集的使用方法,接下来让我们逐一详细了解每个数据集。

请注意,本教程中的示例假设您有互联网连接,并且可能在首次在您的系统上运行每个示例时下载数据集。下载速度将取决于您的互联网连接速度,建议您从命令行运行示例。

想通过深度学习实现计算机视觉成果吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

MNIST 数据集

MNIST 数据集是修改后的美国国家标准与技术研究所数据集的缩写。

它是一个包含 60,000 张 28x28 像素的小型方形灰度图像的数据集,图像内容是手写的单个数字,范围从 0 到 9。

任务是将给定的手写数字图像分类到 10 个类别中的一个,这些类别代表从 0 到 9(包括 0 和 9)的整数值。

它是一个广泛使用且深入理解的数据集,并且在很大程度上已经“解决”。表现最佳的模型是深度学习卷积神经网络,其分类准确率超过 99%,在保留测试数据集上的错误率在 0.4% 到 0.2% 之间。

有关开发 MNIST 模型的逐步教程,请参阅:

以下示例使用 Keras API 加载 MNIST 数据集,并创建训练数据集中前 9 张图像的图示。

运行示例将加载 MNIST 训练集和测试集,并打印它们的形状。

我们可以看到训练数据集中有 60,000 个样本,测试数据集中有 10,000 个样本,并且图像确实是 28x28 像素的正方形。

还创建了数据集中前九张图像的图示,显示了待分类图像的自然手写性质。

Plot of a Subset of Images From the MNIST Dataset

MNIST 数据集图像子集图示

Fashion-MNIST 数据集

Fashion-MNIST 被提议作为 MNIST 数据集的更具挑战性的替代数据集。

它是一个包含 60,000 张 28x28 像素的小型方形灰度图像的数据集,图像内容是 10 种类型的服装物品,例如鞋子、T 恤、连衣裙等。

这是一个比 MNIST 更具挑战性的分类问题,顶级结果由深度学习卷积网络实现,在保留测试数据集上的分类准确率约为 95% 到 96%。

有关开发 Fashion-MNIST 模型的逐步教程,请参阅:

以下示例使用 Keras API 加载 Fashion-MNIST 数据集,并创建训练数据集中前 9 张图像的图示。

运行示例将加载 Fashion-MNIST 训练集和测试集,并打印它们的形状。

我们可以看到训练数据集中有 60,000 个样本,测试数据集中有 10,000 个样本,并且图像确实是 28x28 像素的正方形。

还创建了数据集中前九张图像的图示,显示图像确实是服装物品的灰度照片。

Plot of a Subset of Images From the Fashion-MNIST Dataset

Fashion-MNIST 数据集图像子集图示

CIFAR-10 数据集

CIFAR 是加拿大高级研究所 (Canadian Institute For Advanced Research) 的缩写,CIFAR-10 数据集与 CIFAR-100 数据集(在下一节中介绍)由CIFAR 研究所的研究人员共同开发。

该数据集包含 60,000 张 32x32 像素的彩色照片,来自 10 个类别,如青蛙、鸟类、猫、船只等。

这些图像非常小,比典型照片小得多,该数据集旨在用于计算机视觉研究。

CIFAR-10 是一个数据集,曾被广泛用于机器学习领域计算机视觉算法的基准测试。该问题已“解决”。在该问题上,深度学习卷积神经网络表现最佳,在测试数据集上的分类准确率超过 96% 或 97%。

以下示例使用 Keras API 加载 CIFAR-10 数据集,并创建训练数据集中前 9 张图像的图示。

运行该示例会加载 CIFAR-10 训练集和测试集,并打印它们的形状。

我们可以看到训练数据集中有 50,000 个样本,测试数据集中有 10,000 个样本,并且图像确实是 32x32 像素的正方形和彩色图像,具有三个通道。

数据集中前九张图像的图示也已创建。很明显,与现代照片相比,这些图像确实非常小;考虑到极低的像素分辨率,很难准确地看出某些图像中表示的是什么。

这种低分辨率很可能是顶级算法在该数据集上性能有限的原因。

Plot of a Subset of Images From the CIFAR-10 Dataset

CIFAR-10 数据集图像子集图示

CIFAR-100 数据集

CIFAR-100 数据集与 CIFAR-10 数据集一起由加拿大高级研究所 (CIFAR) 的学者准备。

该数据集包含 60,000 张 32x32 像素的彩色照片,来自 100 个类别,例如鱼类、花卉、昆虫等等。

与 CIFAR-10 一样,图像特意做得小而不真实,该数据集旨在用于计算机视觉研究。

以下示例使用 Keras API 加载 CIFAR-100 数据集,并创建训练数据集中前九张图像的图示。

运行该示例将加载 CIFAR-100 训练集和测试集,并打印它们的形状。

我们可以看到训练数据集中有 50,000 个样本,测试数据集中有 10,000 个样本,并且图像确实是 32x32 像素的正方形和彩色图像,具有三个通道。

数据集中前九张图像的图示也已创建,与 CIFAR-10 类似,图像的低分辨率使得很难清楚地看到某些照片中存在的内容。

Plot of a Subset of Images From the CIFAR-100 Dataset

CIFAR-100 数据集图像子集图示

尽管图像被组织成 100 个类别,但这 100 个类别又被组织成 20 个超类别,例如,常见类别的组。

Keras 默认会返回 100 个类别的标签,但也可以通过在调用 load_data() 函数时将“label_mode”参数设置为“coarse”(而不是默认的“fine”)来获取标签。例如:

当使用 to_categorical() 函数对标签进行独热编码时,差异变得很明显,此时每个输出向量不再具有 100 个维度,而只有 20 个。下面的示例通过加载带有粗略标签的数据集并对类别标签进行编码来演示这一点。

运行该示例将像之前一样加载 CIFAR-100 数据集,但图像现在被归类为 20 个超类别之一。

类别标签经过独热编码,我们可以看到每个标签由一个 20 元素的向量表示,而不是我们预期用于细分类标签的 100 元素的向量。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

API

文章

总结

在本教程中,您了解了 Keras 深度学习库提供的标准计算机视觉数据集。

具体来说,你学到了:

  • 使用 Keras 下载标准计算机视觉数据集的 API 和惯用表达。
  • MNIST、Fashion-MNIST、CIFAR-10 和 CIFAR-100 计算机视觉数据集的结构、性质和顶级结果。
  • 如何使用 Keras API 加载和可视化标准计算机视觉数据集。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发用于视觉的深度学习模型!

Deep Learning for Computer Vision

在几分钟内开发您自己的视觉模型

...只需几行python代码

在我的新电子书中探索如何实现
用于计算机视觉的深度学习

它提供关于以下主题的自学教程
分类物体检测(YOLO和R-CNN)人脸识别(VGGFace和FaceNet)数据准备等等……

最终将深度学习引入您的视觉项目

跳过学术理论。只看结果。

查看内容

如何使用 Keras 加载和可视化标准计算机视觉数据集的 14 条回复

  1. Tanvi Singh 2020 年 5 月 17 日下午 4:14 #

    加载 fashion_mnist 时,我收到以下错误
    in
    1 导入 tensorflow 作为 tf
    ----> 2 x_train, y_train, x_test, y_test = tf.keras.datasets.fashion_mnist.load_data()

    c:\users\dell\appdata\local\programs\python\python38\lib\site-packages\tensorflow\python\keras\datasets\fashion_mnist.py in load_data()
    76
    77 with gzip.open(paths[0], 'rb') as lbpath
    ---> 78 y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)
    79
    80 with gzip.open(paths[1], 'rb') as imgpath

    c:\users\dell\appdata\local\programs\python\python38\lib\gzip.py in read(self, size)
    290 导入 errno
    291 raise OSError(errno.EBADF, "read() on write-only GzipFile object")
    --> 292 返回 self._buffer.read(size)
    293
    294 def read1(self, size=-1)

    c:\users\dell\appdata\local\programs\python\python38\lib\gzip.py in read(self, size)
    485 buf = self._fp.read(io.DEFAULT_BUFFER_SIZE)
    486
    --> 487 解压 = self._decompressor.decompress(buf, size)
    488 if self._decompressor.unconsumed_tail != b""
    489 self._fp.prepend(self._decompressor.unconsumed_tail)

    错误:解压数据时出错 -3:距离太远无效
    请帮助解决。

    • Jason Brownlee 2020 年 5 月 18 日上午 6:09 #

      很抱歉听到这个消息,我以前没有遇到过这个问题。

      也许尝试重新安装库?
      也许尝试删除 ~/.keras/datasets 目录并重新尝试?

  2. Hemanth 2021 年 1 月 7 日上午 12:25 #

    嗨,Jason,
    如何知道内置数据集的类别名称(分类名称,如鱼、马等)?

    • Jason Brownlee 2021 年 1 月 7 日上午 6:19 #

      好问题,Keras 可能会提供一个函数来解释标签——它对 CIFAR 数据集就是这样做的。否则,您可以查看数据集首次使用的文献。

  3. radhika sharma 2021 年 2 月 3 日上午 3:37 #

    你好 Jason。谢谢你的文章。我有一个问题。在训练模型后,当我评估模型时,我得到了 83.82% 的准确率。如何找出模型对哪些图像没有准确评估。我对此非常陌生,正在尝试学习。任何建议都会有所帮助。所以我的意思是,我用一半数据训练模型,用另一半数据进行测试。我如何知道模型对哪些图像没有正确分类?
    另外,我如何用我提供的其他图像测试模型?

    请指教。

  4. Daniel Z 2021 年 2 月 20 日晚上 9:51 #

    嗨 Jason,我正在尝试可视化 fashion mnist 数据集。这一行代码报错“Invalid shape (784,) for image data”。您能告诉我哪里出错了?

    pyplot.imshow(trainX[i], cmap=pyplot.get_cmap(‘gray’))

  5. Anna 2021 年 7 月 26 日上午 4:48 #

    当我们处理时间序列数据时。您有什么建议?

  6. Manoj Kumar 2021 年 12 月 26 日上午 7:00 #

    嗨 Jason,我想加载收集到的图像数据并在此数据上训练 CNN。如何做到这一点?

  7. Hermite Dorvil 2023 年 3 月 24 日上午 3:56 #

    大家好,

    我想知道 33+1+i 是从哪里来的,才能得到图 —— [pyplot.subplot(330 + 1 + i)]?

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。