吴恩达说过, 公共数据集为机器学习研究这枚火箭提供了动力, 但将这些数据集放入机器学习管道就已经够难的了. 编写供下载的一次性脚本, 准备他们要用的源格式和复杂性不一的数据集, 相信这种痛苦每个程序员都有过切身体会.
但现在, 你再也不会被这种痛苦困扰了. 谷歌今天开源了一个机器学习数据集, 可在 TensorFlow 直接调用, 这为开发人员省去了不少麻烦.
照例先放数据集:
GitHub: https://github.com/tensorflow/datasets
今天, 我们很高兴地推出 TensorFlow 数据集, 它将作为 tf.data.Datasets 和 NumPy 数组向公众开放. 它可以完成从获取源数据, 到准备磁盘上的通用格式的所有琐碎工作, 并使用 tf.data API https://www.tensorflow.org/guide/datasets 构建高性能输入管道, 这些管道支持 TensorFlow 2.0, 并可与 tf.keras 模型一起使用. 我们推出了 29 个流行的研究数据集 https://www.tensorflow.org/datasets/datasets , 如 MNIST,Street View House Numbers, 包含 10 亿数据的语言模型基准和大型电影评论数据集, 并将在未来几个月推出更多数据集; 我们也希望你可以加入并贡献数据集 https://www.tensorflow.org/datasets/add_dataset .
- tl;dr
- # 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 notebook 上试试 tfds.
tfds.load 和
每个数据集都作为 DatasetBuilder 公开, 它会告诉你:
从哪里下载数据以及如何提取数据并将其写入标准格式 (DatasetBuilder.download_and_prepare).
如何从磁盘加载它 (DatasetBuilder.as_dataset).
以及有关数据集的所有信息, 例如所有要素的名称, 类型和形状, 每个拆分中的记录数, 源 URL, 数据集或相关论文的引用等 (DatasetBuilder.info http://datasetbuilder.info/ ).
你可以直接对所有 DatasetBuilders 进行实例化或使用 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. 使用 tfds.as_numpy() 可以轻松地将所有 tf.data.Datasets 转换为 NumPy 数组的参数.
为方便起见, 你可以使用 tfds.load 执行以上所有操作, 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 = True 轻松地从 tfds.load 获取 DatasetInfo 对象. 有关所有选项, 请参阅 API 文档.
数据集版本管理
每个数据集都是版本化的 (builder.info.version), 你大可放心, 数据不会随意发生变化, 且结果是可重现的. 目前, 我们保证如果数据发生变化, 将增加版本.
请注意, 尽管目前我们保证给定同一版本下的数据值和拆分是相同的, 但不保证对同一版本的记录进行排序.
数据集配置
具有不同变体的数据集使用命名的 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 数据集都将在未来进一步改进文本支持.
入门
我们的文档站点 http://tensorflow.org/datasets 是开始使用 tensorflow 数据集的最佳位置. 以下是一些入门指南:
数据集页面 https://www.tensorflow.org/datasets/datasets
API 文档
Colab 教程
如何添加数据集 https://www.tensorflow.org/datasets/add_dataset
GitHub https://github.com/tensorflow/datasets
我们将在未来几个月内添加更多数据集, 并希望社区能够加入. 如果你需要什么数据集, 请在 GitHub 创建话题 https://github.com/tensorflow/datasets/issues , 我们将对下一步应添加的数据集进行投票, 讨论实施细节或寻求帮助. 非常欢迎 Pull Requests! 人人献出一点数据集, 让社区变得更美好, 把你的数据集贡献给 TFDS 声名大噪吧!
当获取数据变得简单, 我们就能快乐地建模!
(本文章转载自 infoq, 如有侵权, 请联系作者删除)
来源: http://www.jianshu.com/p/e9b2379a9727