Google Article
TensorFlow 数据集介绍
2019 年 2 月 26 日
由 TensorFlow 团队发布


公开数据集推动着机器学习研究的快速发展 (h/t Andrew Ng),但将这些数据集轻松地集成到你的机器学习管道中仍然非常困难。每个研究人员都不得不编写一次性脚本以下载和准备他们使用的每个数据集,而这些数据集都具有不同的源格式和复杂性。现在这一切都结束了。

今天,我们很高兴地宣布推出 TensorFlow 数据集 (GitHub),它将公开研究数据集公开为 tf.data.Datasets 和 NumPy 数组。它完成了所有繁琐的工作,例如获取源数据并将其准备为磁盘上的通用格式,并使用 tf.data API 来构建高性能输入管道,这些管道已准备好用于 TensorFlow 2.0,并可以与 tf.keras 模型一起使用。我们目前提供了 29 个流行的研究数据集,例如 MNIST、街景门牌号码、10 亿词语言模型基准测试和大型电影评论数据集,并在未来几个月内继续添加更多数据集。我们希望你加入并 添加自己的数据集

简而言之

# Install: pip install tensorflow-datasets
import tensorflow_datasets as tfds
mnist_data = tfds.load("mnist")
mnist_train, mnist_test = mnist_data["train"], mnist_data["test"]
assert isinstance(mnist_train, tf.data.Dataset)
尝试在 Colab 笔记本 中使用 tfds

tfds.loadDatasetBuilder

每个数据集都公开为 DatasetBuilder,它知道
你可以直接实例化任何 DatasetBuilder,或使用 tfds.builder 通过字符串获取它们。
import tensorflow_datasets as tfds

# Fetch the dataset directly
mnist = tfds.image.MNIST()
# or by string name
mnist = tfds.builder('mnist')

# Describe the dataset with DatasetInfo
assert mnist.info.features['image'].shape == (28, 28, 1)
assert mnist.info.features['label'].num_classes == 10
assert mnist.info.splits['train'].num_examples == 60000

# Download the data, prepare it, and write it to disk
mnist.download_and_prepare()

# Load data from disk as tf.data.Datasets
datasets = mnist.as_dataset()
train_dataset, test_dataset = datasets['train'], datasets['test']
assert isinstance(train_dataset, tf.data.Dataset)

# And convert the Dataset to NumPy arrays if you'd like
for example in tfds.as_numpy(train_dataset):
  image, label = example['image'], example['label']
  assert isinstance(image, np.array)
as_dataset() 接受 batch_size 参数,它将为你提供批次示例,而不是一次一个示例。对于适合内存的小型数据集,你可以传递 batch_size=-1 以一次获取整个数据集作为 tf.Tensor。所有 tf.data.Datasets 都可以轻松地使用 tfds.as_numpy() 转换为 NumPy 数组的可迭代对象。为了方便起见,你可以使用 tfds.load 完成上述所有操作,它按名称获取 DatasetBuilder,调用 download_and_prepare(),并调用 as_dataset()
import tensorflow_datasets as tfds

datasets = tfds.load("mnist")
train_dataset, test_dataset = datasets["train"], datasets["test"]
assert isinstance(train_dataset, tf.data.Dataset)
你还可以通过传递 with_info=Truetfds.load 中轻松获取 DatasetInfo 对象。有关所有选项,请参阅 API 文档

数据集版本控制

每个数据集都有版本 (builder.info.version),这样你就可以确信数据不会在你不知情的情况下发生变化,并且结果是可重复的。目前,我们保证如果数据发生变化,版本号将递增。请注意,虽然我们保证给定相同版本的数据值和拆分相同,但我们目前不保证相同版本的记录排序。

数据集配置

具有不同变体的 dataset 通过命名 BuilderConfigs 进行配置。例如,大型电影评论数据集 (tfds.text.IMDBReviews) 可能具有不同的输入文本编码(例如,纯文本、字符编码或子词编码)。内置配置列在数据集文档中,可以通过字符串访问,或者你可以传递自己的配置。
# See the built-in configs
configs = tfds.text.IMDBReviews.builder_configs
assert "bytes" in configs

# Address a built-in config with tfds.builder
imdb = tfds.builder("imdb_reviews/bytes")
# or when constructing the builder directly
imdb = tfds.text.IMDBReviews(config="bytes")
# or use your own custom configuration
my_encoder = tfds.features.text.ByteTextEncoder(additional_tokens=['hello'])
my_config = tfds.text.IMDBReviewsConfig(
    name="my_config",
    version="1.0.0",
    text_encoder_config=tfds.features.text.TextEncoderConfig(encoder=my_encoder),
)
imdb = tfds.text.IMDBReviews(config=my_config)
在我们的文档中,请参阅有关 数据集配置 的部分。

文本数据集和词汇表

文本数据集由于不同的编码和词汇表文件,通常难以处理。tensorflow-datasets 使其变得更加容易。它与许多文本任务一起提供,并包含三种类型的 TextEncoders,所有这些都支持 Unicode
  • ByteTextEncoder 用于字节/字符级编码
  • TokenTextEncoder 用于基于词汇表文件的词级编码
  • SubwordTextEncoder 用于子词级编码(以及构建针对特定语料库调整的子词词汇表的能力),并提供字节级回退,使其完全可逆。例如,“hello world” 可以被拆分为 [“he”, “llo”, “ “, “wor”, “ld”],然后进行整数编码。子词是词级编码和字节级编码之间的折衷方案,在一些自然语言研究项目中很受欢迎。
编码器及其词汇表大小可以通过 DatasetInfo 访问。
imdb = tfds.builder("imdb_reviews/subwords8k")

# Get the TextEncoder from DatasetInfo
encoder = imdb.info.features["text"].encoder
assert isinstance(encoder, tfds.features.text.SubwordTextEncoder)

# Encode, decode
ids = encoder.encode("Hello world")
assert encoder.decode(ids) == "Hello world"

# Get the vocabulary size
vocab_size = encoder.vocab_size
TensorFlow 和 TensorFlow 数据集都将在未来继续改进文本支持。

入门

我们的 文档网站 是开始使用 tensorflow-datasets 的最佳起点。

以下是一些入门时的额外提示

我们预计在未来几个月内添加数据集,我们希望社区能加入进来。打开 GitHub 问题 以请求数据集、对哪些数据集应该接下来添加进行投票、讨论实现或寻求帮助。Pull Requests 非常受欢迎!添加一个流行的数据集以贡献给社区,或者如果你有自己的数据,请将其贡献给 TFDS 以让你的数据变得流行!现在数据很容易获取,尽情建模吧!

鸣谢

TensorFlow 数据集是团队合作的成果。我们的核心开发者是 Etienne Pot、Afroz Mohiuddin、Pierre Ruyssen、Marcin Michalski 和 Ryan Sepassi。我们还要感谢 Jiri Simsa 对 tf.data 的帮助,以及 Martin Wicke 对该项目的支持。感谢大家!

我们还要感谢牛津大学的 Stefan Webb 允许我们使用 tensorflow-datasets PyPI 名称。感谢 Stefan!

我们还要感谢 Lukasz Kaiser 和 Tensor2Tensor 项目,感谢他们对 tensorflow/datasets 的启发和指导。感谢 Lukasz!T2T 很快将迁移到 tensorflow/datasets。

下一篇文章
Introducing TensorFlow Datasets

由 TensorFlow 团队发布


公开数据集推动着机器学习研究的快速发展 (h/t Andrew Ng),但将这些数据集轻松地集成到你的机器学习管道中仍然非常困难。每个研究人员都不得不编写一次性脚本以下载和准备他们使用的每个数据集,而这些数据集都具有不同的源格式和复杂性。现在这一切都结束了。

今天,w…