Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

TensorFlow-Datensätze

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 ).

Ansicht auf TensorFlow.org Quelle auf GitHub anzeigen

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:

  1. Laden Sie die Daten herunter und speichern Sie sie als tfrecord Dateien.
  2. 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 Epochen shuffle_files= (TFDS speichert große Datenmengen in mehreren kleineren Dateien).
  • data_dir= : data_dir= des Datasets (standardmäßig ~/tensorflow_datasets/ )
  • with_info=True : Gibt die tfds.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 sein Dict , 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:

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 von tfds.as_dataframe , um Bilder, Audio, Texte, Videos, ...
  • Verwenden Sie ds.take(x) um nur die ersten x 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)

png

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:

ds, info = tfds.load('mnist', with_info=True)
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, ...)

tfds.core.SplitDict :

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:

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

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} },
}