作者:TensorFlow
編譯:ronghuaiyang
導讀
本文介紹了TensorFlow的Datasets,可以利用這個非常方便的使用內置的數據集。
公共數據集推動了機器學習研究的飛速發展(h/t Andrew Ng),但是仍然很難將這些數據集簡單地放入機器學習的pipeline中。每個研究人員都要經歷編寫一次性腳本的痛苦,以便下載和準備他們使用的每個數據集,這些數據集都有不同的源格式和複雜性。以後不會再這樣了。
今天,我們很高興介紹TensorFlow的Datasets(GitHub),它將公開的公共研究數據集作為 tf.data.Datasets,並且作為NumPy數組。它完成了所有的繁瑣工作,包括獲取源數據並將其準備成磁碟上的通用格式,它使用了 tf.data API來構建高性能的輸入pipeline,這為TensorFlow 2.0做好了準備,並且可以與 tf.keras 模型一起使用。我們推出了29個流行的研究數據集,如MNIST、街景房號、10億個單詞語言模型基準和大型電影評論數據集,並將在未來幾個月增加更多,我們希望你加入並自己添加數據集。
tldr
# 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)
tfds.load 和 DatasetBuilder
每個數據集都公開為一個DatasetBuilder,需要知道:
- 從何處下載數據,以及如何提取數據並將其寫入標準格式( DatasetBuilder.download_and_prepare)。
- 如何從磁碟加載它( DatasetBuilder.as_dataset)。
- 所有關於數據集的信息,如所有特徵的名稱、類型和形狀、每個分割中的記錄數量、源url、數據集或相關論文的引用等( DatasetBuilder.info)。
你可以直接實例化任何一個數據生成器,或者用 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完成上述所有操作。 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)
你還可以輕鬆地從 tfds.load中獲取 DatasetInfo 對象。通過傳遞 with_info=True來加載。所有有關選項,請參見API文檔。
數據集版本控制
每個數據集都有版本控制(' build .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)
請參閱關於添加數據集的文檔中的dataset configuration。
文本數據集和詞彙表
由於不同的編碼和詞彙表文件,使用文本數據集常常很困難。 tensorflow-datasets讓它變得容易得多。它附帶了很多文本任務,包括三種TextEncoders,都支持Unicode:
- 位元組/字符級編碼的 ByteTextEncoder
- 用於基於詞彙表文件的單詞級編碼
- 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 Datasets都將在未來進一步改進對文本的支持。
開始
我們的文檔站點是開始使用 tensorflow-datasets的最佳位置。下面是一些額外的建議:
- Datasets page
- API docs
- Colab tutorial
- How to add a dataset
- GitHub
我們希望在接下來的幾個月里增加數據集,我們希望社區也能加入進來。打開一個GitHub Issue來請求一個數據集,投票決定下一步應該添加哪個數據集,討論實現,或者請求幫助。添加一個流行的數據集來貢獻給社區,或者如果你有自己的數據,將它貢獻給TFDS,使你的數據出名!
英文原文:https://medium.com/tensorflow/introducing-tensorflow-datasets-c7f01f7e19f3
請長按或掃描二維碼關注本公眾號