吳恩達說過,公共數據集爲機器學習研究這枚火箭提供了動力,但將這些數據集放入機器學習管道就已經夠難的了。編寫供下載的一次性腳本,準備他們要用的源格式和複雜性不一的數據集,相信這種痛苦每個程序員都有過切身體會。
但現在,你再也不會被這種痛苦困擾了。谷歌今天開源了一個機器學習數據集,可在TensorFlow直接調用,這爲開發人員省去了不少麻煩。
照例先放數據集:
GitHub:https://github.com/tensorflow/datasets
今天,我們很高興地推出TensorFlow數據集,它將作爲tf.data.Datasets和NumPy數組向公衆開放。它可以完成從獲取源數據,到準備磁盤上的通用格式的所有瑣碎工作,並使用tf.data API構建高性能輸入管道,這些管道支持 TensorFlow 2.0,並可與tf.keras模型一起使用。我們推出了29個流行的研究數據集,如MNIST、Street View House Numbers、包含10億數據的語言模型基準和大型電影評論數據集,並將在未來幾個月推出更多數據集;我們也希望你可以加入並貢獻數據集。
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:https://colab.research.google.com/github/tensorflow/datasets/blob/master/docs/overview.ipynb
tfds.load(https://www.tensorflow.org/datasets/api_docs/python/tfds/load)和DatasetBuilder(https://www.tensorflow.org/datasets/api_docs/python/tfds/core/DatasetBuilder)
每個數據集都作爲DatasetBuilder公開,它會告訴你:
- 從哪裏下載數據以及如何提取數據並將其寫入標準格式(DatasetBuilder.download_and_prepare)。
- 如何從磁盤加載它(DatasetBuilder.as_dataset)。
- 以及有關數據集的所有信息,例如所有要素的名稱、類型和形狀,每個拆分中的記錄數、源URL、數據集或相關論文的引用等(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數據集都將在未來進一步改進文本支持。
入門
我們的文檔站點是開始使用tensorflow數據集的最佳位置。以下是一些入門指南:
我們將在未來幾個月內添加更多數據集,並希望社區能夠加入。如果你需要什麼數據集,請在GitHub 創建話題,我們將對下一步應添加的數據集進行投票,討論實施細節或尋求幫助。非常歡迎Pull Requests!人人獻出一點數據集,讓社區變得更美好,把你的數據集貢獻給TFDS聲名大噪吧!
當獲取數據變得簡單,我們就能快樂地建模!
原文鏈接:
https://medium.com/tensorflow/introducing-tensorflow-datasets-c7f01f7e19f3