Эта страница была переведа с помощью 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',
 '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',
 'deep_weeds',
 'definite_pronoun_resolution',
 'dementiabank',
 'diabetic_retinopathy_detection',
 'div2k',
 'dmlab',
 'downsampled_imagenet',
 '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',
 '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',
 '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',
 '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',
 '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']

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

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)
WARNING:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Downloading and preparing dataset mnist/3.0.1 (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}>

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

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

Как кортеж ( 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 для преобразования:

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 , вы можете загрузить полный набор данных одним пакетом.

tfds.load вернет dict ( tuple с as_supervised=True ) tf.Tensor ( np.array с tfds.as_numpy ).

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

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.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 (сейчас поддерживаются только наборы данных изображений):

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',
    version=3.0.1,
    description='The MNIST database of handwritten digits.',
    homepage='http://yann.lecun.com/exdb/mnist/',
    features=FeaturesDict({
        'image': Image(shape=(28, 28, 1), dtype=tf.uint8),
        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10),
    }),
    total_num_examples=70000,
    splits={
        'test': 10000,
        'train': 60000,
    },
    supervised_keys=('image', 'label'),
    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}
    }""",
    redistribution_info=,
)


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

Откройте 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': <tfds.core.SplitInfo num_examples=10000>, 'train': <tfds.core.SplitInfo num_examples=60000>}

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

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