TFDS bietet eine Sammlung gebrauchsfertiger Datensätze zur Verwendung mit TensorFlow, Jax und anderen Frameworks für maschinelles Lernen.
Es behandelt das deterministische Herunterladen und Aufbereiten der Daten sowie dastf.data.Dataset
einestf.data.Dataset
(oder np.array
).
![]() | ![]() |
Installation
TFDS existiert in zwei Paketen:
-
pip install tensorflow-datasets
: Die stabile Version, die alle paar Monate veröffentlicht wird. -
pip install tfds-nightly
:pip install tfds-nightly
jeden Tag veröffentlicht und enthält die letzten Versionen der Datensätze.
Dieses Colab verwendet tfds-nightly
:
pip install -q tfds-nightly tensorflow matplotlib
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
Finden Sie verfügbare Datensätze
Alle Dataset Builder sind Unterklassen von tfds.core.DatasetBuilder
. Um die Liste der verfügbaren Builder tfds.list_builders()
, verwenden Sie tfds.list_builders()
oder sehen Sie sich unseren Katalog an .
tfds.list_builders()
['abstract_reasoning', 'accentdb', 'aeslc', 'aflw2k3d', 'ag_news_subset', 'ai2_arc', 'ai2_arc_with_ir', 'amazon_us_reviews', 'anli', 'arc', 'bair_robot_pushing_small', 'bccd', 'beans', 'big_patent', 'bigearthnet', 'billsum', 'binarized_mnist', 'binary_alpha_digits', 'blimp', 'bool_q', 'c4', 'caltech101', 'caltech_birds2010', 'caltech_birds2011', 'cars196', 'cassava', 'cats_vs_dogs', 'celeb_a', 'celeb_a_hq', 'cfq', 'cherry_blossoms', 'chexpert', 'cifar10', 'cifar100', 'cifar10_1', 'cifar10_corrupted', 'citrus_leaves', 'cityscapes', 'civil_comments', 'clevr', 'clic', 'clinc_oos', 'cmaterdb', 'cnn_dailymail', 'coco', 'coco_captions', 'coil100', 'colorectal_histology', 'colorectal_histology_large', 'common_voice', 'coqa', 'cos_e', 'cosmos_qa', 'covid19sum', 'crema_d', 'curated_breast_imaging_ddsm', 'cycle_gan', 'dart', 'davis', 'deep_weeds', 'definite_pronoun_resolution', 'dementiabank', 'diabetic_retinopathy_detection', 'div2k', 'dmlab', 'downsampled_imagenet', 'drop', 'dsprites', 'dtd', 'duke_ultrasound', 'e2e_cleaned', 'emnist', 'eraser_multi_rc', 'esnli', 'eurosat', 'fashion_mnist', 'flic', 'flores', 'food101', 'forest_fires', 'fuss', 'gap', 'geirhos_conflict_stimuli', 'genomics_ood', 'german_credit_numeric', 'gigaword', 'glue', 'goemotions', 'gpt3', 'gref', 'groove', 'gtzan', 'gtzan_music_speech', 'hellaswag', 'higgs', 'horses_or_humans', 'howell', 'i_naturalist2017', 'imagenet2012', 'imagenet2012_corrupted', 'imagenet2012_real', 'imagenet2012_subset', 'imagenet_a', 'imagenet_r', 'imagenet_resized', 'imagenet_v2', 'imagenette', 'imagewang', 'imdb_reviews', 'irc_disentanglement', 'iris', 'kitti', 'kmnist', 'lambada', 'lfw', 'librispeech', 'librispeech_lm', 'libritts', 'ljspeech', 'lm1b', 'lost_and_found', 'lsun', 'lvis', 'malaria', 'math_dataset', 'mctaco', 'mlqa', 'mnist', 'mnist_corrupted', 'movie_lens', 'movie_rationales', 'movielens', 'moving_mnist', 'multi_news', 'multi_nli', 'multi_nli_mismatch', 'natural_questions', 'natural_questions_open', 'newsroom', 'nsynth', 'nyu_depth_v2', 'omniglot', 'open_images_challenge2019_detection', 'open_images_v4', 'openbookqa', 'opinion_abstracts', 'opinosis', 'opus', 'oxford_flowers102', 'oxford_iiit_pet', 'para_crawl', 'patch_camelyon', 'paws_wiki', 'paws_x_wiki', 'pet_finder', 'pg19', 'piqa', 'places365_small', 'plant_leaves', 'plant_village', 'plantae_k', 'qa4mre', 'qasc', 'quac', 'quickdraw_bitmap', 'race', 'radon', 'reddit', 'reddit_disentanglement', 'reddit_tifu', 'resisc45', 'robonet', 'rock_paper_scissors', 'rock_you', 's3o4d', 'salient_span_wikipedia', 'samsum', 'savee', 'scan', 'scene_parse150', 'scicite', 'scientific_papers', 'sentiment140', 'shapes3d', 'siscore', 'smallnorb', 'snli', 'so2sat', 'speech_commands', 'spoken_digit', 'squad', 'stanford_dogs', 'stanford_online_products', 'starcraft_video', 'stl10', 'story_cloze', 'sun397', 'super_glue', 'svhn_cropped', 'ted_hrlr_translate', 'ted_multi_translate', 'tedlium', 'tf_flowers', 'the300w_lp', 'tiny_shakespeare', 'titanic', 'trec', 'trivia_qa', 'tydi_qa', 'uc_merced', 'ucf101', 'vctk', 'vgg_face2', 'visual_domain_decathlon', 'voc', 'voxceleb', 'voxforge', 'waymo_open_dataset', 'web_nlg', 'web_questions', 'wider_face', 'wiki40b', 'wiki_bio', 'wiki_table_questions', 'wiki_table_text', 'wikihow', 'wikipedia', 'wikipedia_toxicity_subtypes', 'wine_quality', 'winogrande', 'wmt14_translate', 'wmt15_translate', 'wmt16_translate', 'wmt17_translate', 'wmt18_translate', 'wmt19_translate', 'wmt_t2t_translate', 'wmt_translate', 'wordnet', 'wsc273', 'xnli', 'xquad', 'xsum', 'xtreme_pawsx', 'xtreme_xnli', 'yelp_polarity_reviews', 'yes_no']
Laden Sie einen Datensatz
tfds.load
Der einfachste Weg, einen Datensatz zu tfds.load
ist tfds.load
. Es wird:
- Laden Sie die Daten herunter und speichern Sie sie als
tfrecord
Dateien. - Laden Sie das
tfrecord
und erstellen Sie dastf.data.Dataset
.
ds = tfds.load('mnist', split='train', shuffle_files=True)
assert isinstance(ds, tf.data.Dataset)
print(ds)
Downloading and preparing dataset 11.06 MiB (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1... Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data. <_OptionsDataset shapes: {image: (28, 28, 1), label: ()}, types: {image: tf.uint8, label: tf.int64}>
Einige häufige Argumente:
-
split=
: Welche Aufteilung soll gelesen werden (zB'train'
,['train', 'test']
,'train[80%:]'
, ...). Weitere Informationen finden Sie in unserem Split-API-Handbuch . -
shuffle_files=
:shuffle_files=
ob die Dateien zwischen den einzelnen Epochenshuffle_files=
(TFDS speichert große Datenmengen in mehreren kleineren Dateien). -
data_dir=
:data_dir=
des Datasets (standardmäßig~/tensorflow_datasets/
) -
with_info=True
: Gibt dietfds.core.DatasetInfo
die Dataset-Metadaten enthält -
download=False
: Download deaktivieren
tfds.builder
tfds.load
ist ein dünner Wrapper um tfds.core.DatasetBuilder
. Sie können dieselbe Ausgabe mit der API tfds.core.DatasetBuilder
:
builder = tfds.builder('mnist')
# 1. Create the tfrecord files (no-op if already exists)
builder.download_and_prepare()
# 2. Load the `tf.data.Dataset`
ds = builder.as_dataset(split='train', shuffle_files=True)
print(ds)
<_OptionsDataset shapes: {image: (28, 28, 1), label: ()}, types: {image: tf.uint8, label: tf.int64}>
tfds build
CLI
Wenn Sie ein bestimmtes Dataset generieren möchten, können Sie die tfds
verwenden . Zum Beispiel:
tfds build mnist
Informationen zu verfügbaren Flags finden Sie im Dokument .
Iterieren Sie über einen Datensatz
Wie diktiert
Standardmäßig ist dastf.data.Dataset
enthält Objekt ein dict
von tf.Tensor
s:
ds = tfds.load('mnist', split='train')
ds = ds.take(1) # Only take a single example
for example in ds: # example is `{'image': tf.Tensor, 'label': tf.Tensor}`
print(list(example.keys()))
image = example["image"]
label = example["label"]
print(image.shape, label)
['image', 'label'] (28, 28, 1) tf.Tensor(4, shape=(), dtype=int64)
dict
Namen und der Struktur der dict
finden Sie in der Dokumentation zum Datensatz in unserem Katalog . Zum Beispiel: Mnist-Dokumentation .
Als Tupel ( as_supervised=True
)
Wenn Sie as_supervised=True
, können Sie stattdessen ein Tupel (features, label)
für überwachte Datasets abrufen.
ds = tfds.load('mnist', split='train', as_supervised=True)
ds = ds.take(1)
for image, label in ds: # example is (image, label)
print(image.shape, label)
(28, 28, 1) tf.Tensor(4, shape=(), dtype=int64)
Als numpy ( tfds.as_numpy
)
Verwendet tfds.as_numpy
zum Konvertieren:
-
tf.Tensor
->np.array
tf.data.Dataset
->Iterator[Tree[np.array]]
(Tree
kann beliebig verschachtelt seinDict
,Tuple
)
ds = tfds.load('mnist', split='train', as_supervised=True)
ds = ds.take(1)
for image, label in tfds.as_numpy(ds):
print(type(image), type(label), label)
<class 'numpy.ndarray'> <class 'numpy.int64'> 4
Wie gestapelt tf.Tensor ( batch_size=-1
)
Mit batch_size=-1
können Sie den gesamten Datensatz in einen einzelnen Stapel laden.
Dies kann mit as_supervised=True
und tfds.as_numpy
, um die Daten als (np.array, np.array)
:
image, label = tfds.as_numpy(tfds.load(
'mnist',
split='test',
batch_size=-1,
as_supervised=True,
))
print(type(image), image.shape)
<class 'numpy.ndarray'> (10000, 28, 28, 1)
Achten Sie darauf, dass Ihr Datensatz in den Speicher passt und alle Beispiele dieselbe Form haben.
Erstellen Sie eine End-to-End-Pipeline
Um weiter zu gehen, können Sie schauen:
- Unser End-to-End-Keras-Beispiel zeigt eine vollständige Trainingspipeline (mit Batching, Shuffling, ...).
- Unser Leistungsleitfaden zur Verbesserung der Geschwindigkeit Ihrer Pipelines.
Visualisierung
tfds.as_dataframe
tf.data.Dataset
Objekte können mit tfds.as_dataframe
in pandas.DataFrame
tfds.as_dataframe
werden, um in Colab visualisiert zu werden.
- Fügen Sie
tfds.core.DatasetInfo
als zweites Argument vontfds.as_dataframe
, um Bilder, Audio, Texte, Videos, ... - Verwenden Sie
ds.take(x)
um nur die erstenx
Beispiele anzuzeigen.pandas.DataFrame
lädt den gesamten Datensatz in den Speicher und kann sehr teuer in der Anzeige sein.
ds, info = tfds.load('mnist', split='train', with_info=True)
tfds.as_dataframe(ds.take(4), info)
tfds.show_examples
tfds.show_examples
gibt eine matplotlib.figure.Figure
(nur Bilddatensätze werden jetzt unterstützt):
ds, info = tfds.load('mnist', split='train', with_info=True)
fig = tfds.show_examples(ds, info)
Greifen Sie auf die Metadaten des Datasets zu
Alle Builder enthalten ein tfds.core.DatasetInfo
Objekt, das die Dataset-Metadaten enthält.
Der Zugriff erfolgt über:
- Die
tfds.load
API:
ds, info = tfds.load('mnist', with_info=True)
- Die
tfds.core.DatasetBuilder
API:
builder = tfds.builder('mnist')
info = builder.info
Die Datensatzinformationen enthalten zusätzliche Informationen zum Datensatz (Version, Zitat, Homepage, Beschreibung, ...).
print(info)
tfds.core.DatasetInfo( name='mnist', full_name='mnist/3.0.1', description=""" The MNIST database of handwritten digits. """, homepage='http://yann.lecun.com/exdb/mnist/', data_path='/home/kbuilder/tensorflow_datasets/mnist/3.0.1', download_size=11.06 MiB, dataset_size=21.00 MiB, features=FeaturesDict({ 'image': Image(shape=(28, 28, 1), dtype=tf.uint8), 'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10), }), supervised_keys=('image', 'label'), splits={ 'test': <SplitInfo num_examples=10000, num_shards=1>, 'train': <SplitInfo num_examples=60000, num_shards=1>, }, citation="""@article{lecun2010mnist, title={MNIST handwritten digit database}, author={LeCun, Yann and Cortes, Corinna and Burges, CJ}, journal={ATT Labs [Online]. Available: http://yann.lecun.com/exdb/mnist}, volume={2}, year={2010} }""", )
Features Metadaten (Labelnamen, Bildform, ...)
tfds.features.FeatureDict
:
info.features
FeaturesDict({ 'image': Image(shape=(28, 28, 1), dtype=tf.uint8), 'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10), })
Anzahl der Klassen, Labelnamen:
print(info.features["label"].num_classes)
print(info.features["label"].names)
print(info.features["label"].int2str(7)) # Human readable version (8 -> 'cat')
print(info.features["label"].str2int('7'))
10 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 7 7
Formen, dtypen:
print(info.features.shape)
print(info.features.dtype)
print(info.features['image'].shape)
print(info.features['image'].dtype)
{'image': (28, 28, 1), 'label': ()} {'image': tf.uint8, 'label': tf.int64} (28, 28, 1) <dtype: 'uint8'>
Geteilte Metadaten (zB geteilte Namen, Anzahl der Beispiele, ...)
print(info.splits)
{'test': <SplitInfo num_examples=10000, num_shards=1>, 'train': <SplitInfo num_examples=60000, num_shards=1>}
Verfügbare Splits:
print(list(info.splits.keys()))
['test', 'train']
Informieren Sie sich über die individuelle Aufteilung:
print(info.splits['train'].num_examples)
print(info.splits['train'].filenames)
print(info.splits['train'].num_shards)
60000 ['mnist-train.tfrecord-00000-of-00001'] 1
Es funktioniert auch mit der Subsplit-API:
print(info.splits['train[15%:75%]'].num_examples)
print(info.splits['train[15%:75%]'].file_instructions)
36000 [FileInstruction(filename='mnist-train.tfrecord-00000-of-00001', skip=9000, take=36000, num_examples=36000)]
Fehlerbehebung
Manueller Download (wenn der Download fehlschlägt)
Wenn der Download aus irgendeinem Grund fehlschlägt (z. B. offline, ...). Sie können die Daten jederzeit manuell herunterladen und im manual_dir
(standardmäßig ~/tensorflow_datasets/download/manual/
.
Um herauszufinden, welche URLs heruntergeladen werden müssen, schauen Sie in:
Für neue Datensätze (als Ordner implementiert):
tensorflow_datasets/
<type>/<dataset_name>/checksums.tsv
. Zum Beispiel:tensorflow_datasets/text/bool_q/checksums.tsv
.Den Speicherort der Datensatzquelle finden Sie in unserem Katalog .
Für alte Datensätze:
tensorflow_datasets/url_checksums/<dataset_name>.txt
NonMatchingChecksumError
TFDS stellen Determinismus sicher, indem sie die Prüfsummen der heruntergeladenen URLs validieren. Wenn NonMatchingChecksumError
wird, kann dies NonMatchingChecksumError
anzeigen:
- Die Website ist möglicherweise nicht erreichbar (z. B.
503 status code
). Bitte überprüfen Sie die URL. - Versuchen Sie es später bei Google Drive-URLs erneut, da Drive Downloads manchmal ablehnt, wenn zu viele Personen auf dieselbe URL zugreifen. Siehe Fehler
- Die ursprünglichen Datasets-Dateien wurden möglicherweise aktualisiert. In diesem Fall sollte der TFDS-Dataset-Builder aktualisiert werden. Bitte öffnen Sie eine neue Github-Ausgabe oder PR:
- Registrieren Sie die neuen Prüfsummen bei
tfds build --register_checksums
- Aktualisieren Sie schließlich den Datensatzgenerierungscode.
- Aktualisieren Sie den Datensatz
VERSION
- Aktualisieren Sie den Datensatz
RELEASE_NOTES
:RELEASE_NOTES
haben sich die Prüfsummen geändert? Haben sich einige Beispiele geändert? - Stellen Sie sicher, dass der Datensatz noch erstellt werden kann.
- Senden Sie uns eine PR
- Registrieren Sie die neuen Prüfsummen bei
Zitat
Wenn Sie tensorflow-datasets
für ein Papier verwenden, tensorflow-datasets
Sie bitte das folgende Zitat hinzu, zusätzlich zu allen Zitaten, die für die verwendeten Datensätze spezifisch sind (die im Datensatzkatalog zu finden sind).
@misc{TFDS,
title = { {TensorFlow Datasets}, A collection of ready-to-use datasets},
howpublished = {\url{https://www.tensorflow.org/datasets} },
}