RSVP untuk acara TensorFlow Everywhere lokal Anda hari ini!
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Set Data TensorFlow

TFDS menyediakan kumpulan set data yang siap digunakan untuk digunakan dengan TensorFlow, Jax, dan framework Machine Learning lainnya.

Ini menangani mengunduh dan menyiapkan data secara deterministik dan membanguntf.data.Dataset (atau np.array ).

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Instalasi

TFDS ada dalam dua paket:

  • pip install tensorflow-datasets : Versi stabil, dirilis setiap beberapa bulan.
  • pip install tfds-nightly : Dirilis setiap hari, berisi versi terakhir dari kumpulan data.

Colab ini menggunakan 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

Temukan kumpulan data yang tersedia

Semua pembuat tfds.core.DatasetBuilder data adalah subkelas dari tfds.core.DatasetBuilder . Untuk mendapatkan daftar pembangun yang tersedia, gunakan tfds.list_builders() atau lihat katalog kami.

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

Muat set data

tfds.load

Cara termudah untuk memuat tfds.load data adalah tfds.load . Itu akan:

  1. Unduh data dan simpan sebagai file tfrecord .
  2. Muat tfrecord dan buattf.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}>

Beberapa argumen umum:

  • split= : Pembagian mana yang dibaca (mis. 'train' , ['train', 'test'] , 'train[80%:]' , ...). Lihat panduan API terpisah kami.
  • shuffle_files= : Kontrol apakah akan mengacak file di antara setiap epoch (TFDS menyimpan kumpulan data besar dalam beberapa file yang lebih kecil).
  • data_dir= : Lokasi tempat dataset disimpan (default ke ~/tensorflow_datasets/ )
  • with_info=True : Mengembalikan tfds.core.DatasetInfo berisi metadata tfds.core.DatasetInfo data
  • download=False : Nonaktifkan download

tfds.builder

tfds.load adalah pembungkus tipis di sekitar tfds.core.DatasetBuilder . Anda bisa mendapatkan keluaran yang sama menggunakan 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

Jika Anda ingin membuat kumpulan data tertentu, Anda dapat menggunakan baris perintah tfds . Sebagai contoh:

tfds build mnist

Lihat dokumen untuk bendera yang tersedia.

Iterasi di atas kumpulan data

Sebagai dict

Secara default,tf.data.Dataset objek berisi dict dari 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)

Untuk mengetahui nama kunci dan struktur dict , lihat dokumentasi set data di katalog kami . Misalnya: dokumentasi mnist .

Sebagai tuple ( as_supervised=True )

Dengan menggunakan as_supervised=True , Anda bisa mendapatkan tuple (features, label) sebagai gantinya untuk set data yang diawasi.

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)

Sebagai numpy ( tfds.as_numpy )

Menggunakan tfds.as_numpy untuk mengonversi:

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

Sebagai batched tf.Tensor ( batch_size=-1 )

Dengan menggunakan batch_size=-1 , Anda dapat memuat batch_size=-1 data lengkap dalam satu batch.

Ini bisa digabungkan dengan as_supervised=True dan tfds.as_numpy untuk mendapatkan data sebagai (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)

Berhati-hatilah agar kumpulan data Anda dapat masuk ke dalam memori, dan semua contoh memiliki bentuk yang sama.

Benchmark set data Anda

Pembandingan tfds.benchmark data adalah panggilan tfds.benchmark sederhana pada setiap iterable (misalnyatf.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)

  • Jangan lupa untuk menormalkan hasil per ukuran batch dengan batch_size= kwarg.
  • Singkatnya, kumpulan pemanasan pertama dipisahkan dari yang lain untuk menangkap waktu penyiapan tambahantf.data.Dataset (misalnya inisialisasi buffer, ...).
  • Perhatikan bagaimana iterasi kedua jauh lebih cepat karena TFDS auto-caching .
  • tfds.benchmark mengembalikan tfds.core.BenchmarkResult yang dapat diperiksa untuk analisis lebih lanjut.

Bangun pipeline ujung ke ujung

Untuk melangkah lebih jauh, Anda dapat melihat:

Visualisasi

tfds.as_dataframe

Objektf.data.Dataset dapat diubah menjadi pandas.DataFrame dengan tfds.as_dataframe untuk divisualisasikan di Colab .

  • Tambahkan tfds.core.DatasetInfo sebagai argumen kedua tfds.as_dataframe untuk memvisualisasikan gambar, audio, teks, video, ...
  • Gunakan ds.take(x) untuk hanya menampilkan contoh x pertama. pandas.DataFrame akan memuat pandas.DataFrame data lengkap dalam memori, dan bisa sangat mahal untuk ditampilkan.
ds, info = tfds.load('mnist', split='train', with_info=True)

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

tfds.show_examples

tfds.show_examples mengembalikan matplotlib.figure.Figure (hanya tfds.show_examples data gambar yang didukung sekarang):

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

fig = tfds.show_examples(ds, info)

png

Akses metadata set data

Semua pembuat menyertakan objek tfds.core.DatasetInfo berisi metadata tfds.core.DatasetInfo data.

Itu dapat diakses melalui:

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

Info dataset berisi informasi tambahan tentang dataset (versi, kutipan, homepage, deskripsi, ...).

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

Menampilkan metadata (nama label, bentuk gambar, ...)

Akses tfds.features.FeatureDict :

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

Jumlah kelas, nama label:

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

Bentuk, tipe:

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

Memisahkan metadata (misalnya nama terpisah, jumlah contoh, ...)

Akses tfds.core.SplitDict :

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

Perpecahan yang tersedia:

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

Dapatkan info tentang pemisahan individu:

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

Ini juga bekerja dengan API subsplit:

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

Penyelesaian masalah

Download manual (jika download gagal)

Jika unduhan gagal karena beberapa alasan (mis. Offline, ...). Anda selalu dapat mengunduh data sendiri secara manual dan menempatkannya di manual_dir (defaultnya ke ~/tensorflow_datasets/download/manual/ .

Untuk mengetahui url mana yang akan diunduh, lihat:

Memperbaiki NonMatchingChecksumError

TFDS memastikan determinisme dengan memvalidasi checksum url yang diunduh. Jika NonMatchingChecksumError dimunculkan, mungkin menunjukkan:

  • Situs web mungkin tidak aktif (mis. 503 status code ). Silakan periksa url.
  • Untuk URL Google Drive, coba lagi nanti karena Drive terkadang menolak unduhan jika terlalu banyak orang yang mengakses URL yang sama. Lihat bug
  • File set data asli mungkin telah diperbarui. Dalam hal ini pembuat set data TFDS harus diperbarui. Silakan buka masalah atau PR Github baru:
    • Daftarkan checksum baru dengan tfds build --register_checksums
    • Akhirnya perbarui kode pembuatan set data.
    • Perbarui kumpulan data VERSION
    • Perbarui kumpulan data RELEASE_NOTES : Apa yang menyebabkan checksum berubah? Apakah beberapa contoh berubah?
    • Pastikan dataset masih bisa dibangun.
    • Kirimkan kami PR

Kutipan

Jika Anda menggunakan tensorflow-datasets untuk makalah, harap sertakan kutipan berikut, selain kutipan khusus untuk tensorflow-datasets yang digunakan (yang dapat ditemukan di katalog set data ).

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