RSVP для вашего местного мероприятия TensorFlow Everywhere сегодня!
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Наборы данных TensorFlow

TFDS предоставляет набор готовых наборов данных для использования с TensorFlow, Jax и другими фреймворками машинного обучения.

Он обрабатывает загрузку и подготовку данных детерминированно и создаетtf.data.Dataset (или np.array ).

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Установка

TFDS существует в двух пакетах:

  • pip install tensorflow-datasets : стабильная версия, выпускаемая каждые несколько месяцев.
  • pip install tfds-nightly : pip install tfds-nightly каждый день, содержит последние версии наборов данных.

Этот tfds-nightly использует 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

Найти доступные наборы данных

Все построители наборов данных являются подклассом tfds.core.DatasetBuilder . Чтобы получить список доступных построителей, используйте tfds.list_builders() или посмотрите наш каталог .

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',
 'efron_morris75',
 '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',
 'star_cfq',
 'starcraft_video',
 'stl10',
 'story_cloze',
 'sun397',
 'super_glue',
 'svhn_cropped',
 'tao',
 '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',
 'wmt13_translate',
 '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',
 'youtube_vis']

Загрузить набор данных

tfds.load

Самый простой способ загрузки набора данных - tfds.load . Это будет:

  1. Загрузите данные и сохраните их как файлы tfrecord .
  2. Загрузите tfrecord и создайтеtf.data.Dataset .
ds = tfds.load('mnist', split='train', shuffle_files=True)
assert isinstance(ds, tf.data.Dataset)
print(ds)
<_OptionsDataset shapes: {image: (28, 28, 1), label: ()}, types: {image: tf.uint8, label: tf.int64}>

Некоторые общие аргументы:

  • split= : какой разделитель читать (например, 'train' , ['train', 'test'] , 'train[80%:]' , ...). См. Наше руководство по разделению API .
  • shuffle_files= : управление перетасовкой файлов между эпохами (TFDS хранит большие наборы данных в нескольких файлах меньшего размера).
  • data_dir= : место, где хранится набор данных (по умолчанию ~/tensorflow_datasets/ )
  • with_info=True : возвращает tfds.core.DatasetInfo содержащий метаданные набора данных.
  • download=False : отключить загрузку

tfds.builder

tfds.load - это тонкая оболочка вокруг tfds.core.DatasetBuilder . Вы можете получить тот же результат, используя 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

Если вы хотите создать определенный набор данных, вы можете использовать командную строку tfds . Например:

tfds build mnist

Смотрите в документации доступные флаги.

Итерировать по набору данных

Как дикт

По умолчанию объектtf.data.Dataset содержит dict из 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 , посмотрите документацию по набору данных в нашем каталоге . Например: mnist documentation .

Как кортеж ( as_supervised=True )

Используя as_supervised=True , вы можете получить кортеж (features, label) вместо контролируемых наборов данных.

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)

Как numpy ( tfds.as_numpy )

Использует tfds.as_numpy для преобразования:

  • tf.Tensor -> np.array
  • tf.data.Dataset -> Iterator[Tree[np.array]] ( Tree может быть произвольным вложенным 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

В пакетном batch_size=-1 tf.Tensor ( batch_size=-1 )

Используя batch_size=-1 , вы можете загрузить полный набор данных одним пакетом.

Это можно комбинировать с as_supervised=True и tfds.as_numpy чтобы получить данные как (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)

Будьте осторожны, чтобы ваш набор данных мог уместиться в памяти и чтобы все примеры имели одинаковую форму.

Сравните свои наборы данных

Тестирование набора данных - это простой вызов tfds.benchmark для любой итерации (например,tf.data.Dataset , tfds.as_numpy , ...).

ds = tfds.load('mnist', split='train')
ds = ds.batch(32).prefetch(1)

tfds.benchmark(ds, batch_size=32)
tfds.benchmark(ds, batch_size=32)  # Second epoch much faster due to auto-caching

************ Summary ************

Examples/sec (First included) 47889.92 ex/sec (total: 60000 ex, 1.25 sec)
Examples/sec (First only) 110.24 ex/sec (total: 32 ex, 0.29 sec)
Examples/sec (First excluded) 62298.08 ex/sec (total: 59968 ex, 0.96 sec)

************ Summary ************

Examples/sec (First included) 290380.50 ex/sec (total: 60000 ex, 0.21 sec)
Examples/sec (First only) 2506.57 ex/sec (total: 32 ex, 0.01 sec)
Examples/sec (First excluded) 309338.21 ex/sec (total: 59968 ex, 0.19 sec)

  • Не забудьте нормализовать результаты по размеру пакета с помощью batch_size= kwarg.
  • Таким образом, первый пакетtf.data.Dataset отделяется от других для захвата дополнительного времени настройкиtf.data.Dataset (например, инициализации буферов, ...).
  • Обратите внимание, что вторая итерация выполняется намного быстрее из-за автоматического кэширования TFDS .
  • tfds.benchmark возвращает tfds.core.BenchmarkResult который можно проверить для дальнейшего анализа.

Построить сквозной конвейер

Чтобы пойти дальше, вы можете посмотреть:

Визуализация

tfds.as_dataframe

Объектыtf.data.Dataset можно преобразовать в pandas.DataFrame с помощью tfds.as_dataframe для визуализации в Colab .

  • Добавьте tfds.core.DatasetInfo качестве второго аргумента tfds.as_dataframe для визуализации изображений, аудио, текстов, видео, ...
  • Используйте ds.take(x) чтобы отобразить только первые x примеров. pandas.DataFrame загрузит полный набор данных в память, и отображение может быть очень дорогостоящим.
ds, info = tfds.load('mnist', split='train', with_info=True)

tfds.as_dataframe(ds.take(4), info)

tfds.show_examples

tfds.show_examples возвращает matplotlib.figure.Figure (сейчас поддерживаются только наборы данных изображений):

ds, info = tfds.load('mnist', split='train', with_info=True)

fig = tfds.show_examples(ds, info)

PNG

Доступ к метаданным набора данных

Все построители включают объект tfds.core.DatasetInfo содержащий метаданные набора данных.

Доступ к нему можно получить через:

ds, info = tfds.load('mnist', with_info=True)
builder = tfds.builder('mnist')
info = builder.info

Информация о наборе данных содержит дополнительную информацию о наборе данных (версия, цитирование, домашняя страница, описание, ...).

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='gs://tensorflow-datasets/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}
    }""",
)

Имеет метаданные (названия ярлыков, форма изображения, ...)

Откройте tfds.features.FeatureDict :

info.features
FeaturesDict({
    'image': Image(shape=(28, 28, 1), dtype=tf.uint8),
    'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10),
})

Количество классов, названия этикеток:

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

Формы, типы:

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'>

Разделить метаданные (например, разделить имена, количество примеров, ...)

Откройте tfds.core.SplitDict :

print(info.splits)
{'test': <SplitInfo num_examples=10000, num_shards=1>, 'train': <SplitInfo num_examples=60000, num_shards=1>}

Доступные сплиты:

print(list(info.splits.keys()))
['test', 'train']

Получите информацию об индивидуальном сплите:

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

Он также работает с subplit 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)]

Поиск проблемы

Ручная загрузка (если загрузка не удалась)

Если загрузка не удалась по какой-либо причине (например, в автономном режиме, ...). Вы всегда можете вручную загрузить данные самостоятельно и поместить их в manual_dir (по умолчанию ~/tensorflow_datasets/download/manual/ .

Чтобы узнать, какие URL-адреса загружать, посмотрите:

Исправление NonMatchingChecksumError

TFDS обеспечивает детерминизм, проверяя контрольные суммы загруженных URL-адресов. Если NonMatchingChecksumError , это может означать:

  • Веб-сайт может быть недоступен (например, 503 status code ). Пожалуйста, проверьте URL.
  • Для URL-адресов Google Диска попробуйте еще раз позже, поскольку Диск иногда отклоняет загрузки, когда слишком много людей обращаются к одному и тому же URL-адресу. Увидеть ошибку
  • Исходные файлы наборов данных могли быть обновлены. В этом случае необходимо обновить построитель набора данных TFDS. Пожалуйста, откройте новый выпуск Github или PR:
    • Зарегистрируйте новые контрольные суммы с помощью tfds build --register_checksums
    • В конце концов обновите код создания набора данных.
    • Обновите набор данных VERSION
    • Обновите набор данных RELEASE_NOTES : что вызвало изменение контрольных сумм? Изменились ли некоторые примеры?
    • Убедитесь, что набор данных все еще можно построить.
    • Отправьте нам PR

Цитирование

Если вы используете tensorflow-datasets для статьи, tensorflow-datasets следующую ссылку в дополнение к любой цитате, относящейся к используемым наборам данных (которые можно найти в каталоге наборов данных ).

@misc{TFDS,
  title = { {TensorFlow Datasets}, A collection of ready-to-use datasets},
  howpublished = {\url{https://www.tensorflow.org/datasets} },
}