דף זה תורגם על ידי Cloud Translation API.
Switch to English

ערכות נתונים של TensorFlow

TFDS מספק אוסף של מערכי נתונים מוכנים לשימוש לשימוש עם TensorFlow, Jax ומסגרות למידת מכונה אחרות.

הוא מטפל בהורדה והכנת הנתונים באופן דטרמיניסטי ובנייתtf.data.Dataset (או np.array ).

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה במקור ב- GitHub

הַתקָנָה

TFDS קיים בשתי חבילות:

  • pip install tensorflow-datasets : הגרסה היציבה, משוחררת אחת לכמה חודשים.
  • pip install tfds-nightly : יוצא מדי יום, מכיל את הגרסאות האחרונות של מערכי הנתונים.

Colab זה משתמש 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',
 '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']

טען מערך נתונים

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

כמה טיעונים נפוצים:

  • split= : איזה פיצול לקרוא (למשל 'train' , ['train', 'test'] , 'train[80%:]' , ...). ראה מדריך API מפוצל שלנו.
  • shuffle_files= : 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 ים:

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 .

as_supervised=True ( 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)

כמו tfds.as_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

כ- tf.Tensor batch_size=-1 ( 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.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_ דוגמאות

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

כולל מטא נתונים (שמות תוויות, צורת תמונה, ...)

גישה ל- 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

זה עובד גם עם ממשק ה- 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/ .

כדי לגלות אילו כתובות אתרים להוריד, בדוק:

תיקון NonMatchingChecksumError

TFDS מבטיחים דטרמיניזם על ידי אימות סכומי הבדיקה של כתובות האתר שהורדו. אם NonMatchingChecksumError מוגבה, עשוי להצביע על:

  • האתר עשוי להיות 503 status code (למשל 503 status code ). אנא בדוק את כתובת האתר.
  • לגבי כתובות אתרים של כונן Google, נסה שוב מאוחר יותר מכיוון ש- Drive לפעמים דוחה הורדות כאשר יותר מדי אנשים ניגשים לאותה כתובת אתר. ראה באג
  • ייתכן שקבצי מערכי הנתונים המקוריים עודכנו. במקרה זה יש לעדכן את בונה מערכי הנתונים של TFDS. אנא פתח גיליון חדש של Github או יחסי ציבור:
    • רשום את tfds build --register_checksums החדשים באמצעות tfds build --register_checksums
    • בסופו של דבר עדכן את קוד יצירת מערך הנתונים.
    • עדכן את מערך הנתונים VERSION
    • עדכן את מערך הנתונים RELEASE_NOTES : מה גרם לשינוי בדיקות הבדיקה? האם כמה דוגמאות השתנו?
    • וודא שעדיין ניתן לבנות את מערך הנתונים.
    • שלח לנו יחסי ציבור

צִיטָטָה

אם אתה משתמש tensorflow-datasets עבור מאמר, אנא כלול את הציטוט הבא, בנוסף לכל ציטוט ספציפי למערכי הנתונים המשומשים (אשר ניתן למצוא בקטלוג הנתונים ).

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