يوفر TFDS مجموعة من مجموعات البيانات الجاهزة للاستخدام مع TensorFlow و Jax وأطر عمل التعلم الآلي الأخرى.
يتعامل مع تنزيل البيانات وإعدادها بشكل حاسم وإنشاءtf.data.Dataset
(أو np.array
).
![]() | ![]() | ![]() | ![]() |
التركيب
TFDS موجود في حزمتين:
-
pip install tensorflow-datasets
: الإصدارpip install tensorflow-datasets
، يتم إصداره كل بضعة أشهر. -
pip install 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
. سوف تكون:
- قم بتنزيل البيانات وحفظها كملفات
tfrecord
. - قم بتحميل
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
يحتوي على البيانات الوصفيةtfds.core.DatasetInfo
البيانات -
download=False
: تعطيل التنزيل
tfds.builder
tfds.load
عبارة عن غلاف رفيع حول tfds.core.DatasetBuilder
. يمكنك الحصول على نفس الإخراج باستخدام tfds.core.DatasetBuilder
API:
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 .
كـ tuple ( 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
كما دفعت 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
(مثل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
الذي يمكن فحصه لمزيد من التحليل.
بناء خط أنابيب من طرف إلى طرف
للمضي قدمًا ، يمكنك البحث عن:
- مثال Keras الشامل الخاص بنا لمعرفة خط أنابيب تدريب كامل (مع التجميع ، والخلط ، ...).
- دليل أدائنا لتحسين سرعة خطوط الأنابيب لديك (نصيحة: استخدم
tfds.benchmark(ds)
لقياس مجموعات البيانات الخاصة بك).
التصور
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)
الوصول إلى البيانات الوصفية لمجموعة البيانات
تتضمن جميع tfds.core.DatasetInfo
كائن tfds.core.DatasetInfo
يحتوي على البيانات الوصفية tfds.core.DatasetInfo
البيانات.
يمكن الوصول إليه من خلال:
- واجهة برمجة تطبيقات
tfds.load
:
ds, info = tfds.load('mnist', with_info=True)
- واجهة برمجة تطبيقات
tfds.core.DatasetBuilder
:
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
يعمل أيضًا مع واجهة برمجة التطبيقات الفرعية:
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 المراد تنزيلها ، انظر إلى:
بالنسبة لمجموعات البيانات الجديدة (التي تم تنفيذها كمجلد):
tensorflow_datasets/
<type>/<dataset_name>/checksums.tsv
. على سبيل المثال:tensorflow_datasets/text/bool_q/checksums.tsv
.يمكنك العثور على موقع مصدر مجموعة البيانات في الكتالوج الخاص بنا .
لمجموعات البيانات القديمة:
tensorflow_datasets/url_checksums/<dataset_name>.txt
إصلاح NonMatchingChecksumError
تضمن TFDS الحتمية من خلال التحقق من صحة المجاميع الاختبارية لعناوين url التي تم تنزيلها. إذا NonMatchingChecksumError
، فقد يشير إلى:
- قد يكون موقع الويب معطلاً (مثل
503 status code
). يرجى التحقق من عنوان url. - بالنسبة إلى عناوين URL الخاصة بـ Google Drive ، حاول مرة أخرى لاحقًا حيث يرفض Drive أحيانًا التنزيلات عندما يصل عدد كبير جدًا من الأشخاص إلى نفس عنوان URL. انظر علة
- ربما تم تحديث ملفات مجموعات البيانات الأصلية. في هذه الحالة ، يجب تحديث أداة إنشاء مجموعة بيانات TFDS. يرجى فتح إصدار جديد من Github أو PR:
- قم
tfds build --register_checksums
الاختبارية الجديدة باستخدامtfds build --register_checksums
- حدِّث رمز إنشاء مجموعة البيانات في النهاية.
- قم بتحديث مجموعة البيانات
VERSION
- قم بتحديث مجموعة البيانات
RELEASE_NOTES
: ما الذي تسبب في تغييرRELEASE_NOTES
الاختبارية؟ هل تغيرت بعض الأمثلة؟ - تأكد من أنه لا يزال من الممكن إنشاء مجموعة البيانات.
- أرسل لنا العلاقات العامة
- قم
الاقتباس
إذا كنت تستخدم tensorflow-datasets
لورقة ما ، فيرجى تضمين الاقتباس التالي ، بالإضافة إلى أي اقتباس خاص tensorflow-datasets
المستخدمة (والتي يمكن العثور عليها في كتالوج مجموعة البيانات ).
@misc{TFDS,
title = { {TensorFlow Datasets}, A collection of ready-to-use datasets},
howpublished = {\url{https://www.tensorflow.org/datasets} },
}