این سند نکات عملکردی ویژه TFDS را ارائه می دهد. توجه داشته باشید که TFDS فراهم می کند مجموعه داده به عنوانtf.data.Dataset
، بنابراین مشاوره از tf.data
راهنمای هنوز هم اعمال می شود.
مجموعه داده های معیار
برای محک زدن هر شیtf.data.Dataset
از tfds.benchmark(ds)
استفاده کنید.
مطمئن شوید که batch_size=
برای عادی سازی نتایج نشان داده شده است (به عنوان مثال 100 تکرار در ثانیه -> 3200 ثانیه در ثانیه). این با هر قابل تکرار کار می کند (به عنوان مثال tfds.benchmark(tfds.as_numpy(ds))
).
ds = tfds.load('mnist', split='train').batch(32).prefetch()
# Display some benchmark statistics
tfds.benchmark(ds, batch_size=32)
# Second iteration is much faster, due to auto-caching
tfds.benchmark(ds, batch_size=32)
مجموعه داده های کوچک (<GB)
همه مجموعه های داده TFDS داده ها را بر روی دیسک در قالب TFRecord
ذخیره می کنند. برای مجموعه داده های کوچک (به عنوان مثال Mnist ، Cifar ، ...) ، خواندن از .tfrecord
می تواند سربار قابل توجهی اضافه کند.
همانطور که آن مجموعه داده ها در حافظه جای می گیرند ، می توان با ذخیره یا پیش بارگذاری مجموعه داده ، عملکرد را به طور قابل توجهی بهبود بخشید. توجه داشته باشید که TFDS به طور خودکار مجموعه داده های کوچک را مخفی می کند (برای جزئیات به بخش بعدی مراجعه کنید).
در حال ذخیره مجموعه داده
در اینجا مثالی از خط لوله داده وجود دارد که پس از عادی سازی تصاویر ، مجموعه داده را به طور واضح ذخیره می کند.
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds, ds_info = tfds.load(
'mnist',
split='train',
as_supervised=True, # returns `(img, label)` instead of dict(image=, ...)
with_info=True,
)
# Applying normalization before `ds.cache()` to re-use it.
# Note: Random transformations (e.g. images augmentations) should be applied
# after both `ds.cache()` (to avoid caching randomness) and `ds.batch()` (for
# vectorization [1]).
ds = ds.map(normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.cache()
# For true randomness, we set the shuffle buffer to the full dataset size.
ds = ds.shuffle(ds_info.splits['train'].num_examples)
# Batch after shuffling to get unique batches at each epoch.
ds = ds.batch(128)
ds = ds.prefetch(tf.data.experimental.AUTOTUNE)
هنگام تکرار بیش از این مجموعه داده ، تکرار دوم به لطف حافظه پنهان بسیار سریعتر از مورد اول خواهد بود.
ذخیره خودکار
به طور پیش فرض ، مجموعه داده های TFDS به طور خودکار حافظه پنهان می شوند که محدودیت های زیر را برآورده می کنند:
- اندازه کل مجموعه داده (همه تقسیم ها) تعریف شده و کمتر از 250 مگابایت است
-
shuffle_files
غیرفعال است ، یا فقط یک تکه خرد شده خوانده می شود
با عبور از try_autocaching=False
به tfds.ReadConfig
توان از tfds.ReadConfig
کردن خودکار انصراف داد. در tfds.load
. نگاهی به اسناد کاتالوگ مجموعه داده بیندازید که آیا یک مجموعه داده خاص از حافظه پنهان خودکار استفاده می کند یا خیر.
بارگیری اطلاعات کامل به صورت یک تنسور واحد
اگر مجموعه داده شما در حافظه قرار دارد ، می توانید مجموعه داده کامل را به صورت یک آرایه Tensor یا NumPy بارگیری کنید. انجام این کار با تنظیم batch_size=-1
برای دسته بندی همه مثالها در یک tf.Tensor
. سپس از tfds.as_numpy
برای تبدیل از tf.Tensor
به np.array
.
(img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(
'mnist',
split=['train', 'test'],
batch_size=-1,
as_supervised=True,
))
مجموعه داده های بزرگ
مجموعه داده های بزرگ خرد شده اند (در چندین پرونده تقسیم می شوند) و معمولاً در حافظه جای نمی گیرند ، بنابراین نباید ذخیره شوند.
زدن و آموزش
در طول آموزش ، مهم است که داده ها را به خوبی مرتب کنید. داده های مختلط ضعیف می تواند در دقت آموزش پایین تر باشد.
علاوه بر استفاده از ds.shuffle
برای زدن سوابق ، باید shuffle_files=True
را نیز تنظیم کنید تا رفتار مجموعه ای خوبی را برای مجموعه داده های بزرگتر که به چندین پرونده تقسیم شده اند ، بدست آورید. در غیر این صورت ، دوره ها خرده ریزها را به همان ترتیب می خوانند و بنابراین داده ها به طور تصادفی تصادفی نخواهند شد.
ds = tfds.load('imagenet2012', split='train', shuffle_files=True)
علاوه بر این ، وقتی shuffle_files=True
، TFDS options.experimental_deterministic
غیرفعال می کند ، که ممکن است عملکرد کمی را افزایش دهد. برای استفاده از تغییر قطعی ، می توان با tfds.ReadConfig
از این ویژگی tfds.ReadConfig
: یا با تنظیم read_config.shuffle_seed
یا رونویسی read_config.options.experimental_deterministic
داده های خود را به صورت خودکار در بین کارگران خرد کنید
هنگام آموزش چندین کارگر ، می توانید از استدلال input_context
استفاده کنید. tfds.ReadConfig
، بنابراین هر کارگر زیر مجموعه ای از داده ها را می خواند.
input_context = tf.distribute.InputContext(
input_pipeline_id=1, # Worker id
num_input_pipelines=4, # Total number of workers
)
read_config = tfds.ReadConfig(
input_context=input_context,
)
ds = tfds.load('dataset', split='train', read_config=read_config)
این مکمل API subsplit است. ابتدا API subplit اعمال می شود ( train[:50%]
به لیستی از پرونده ها برای خواندن تبدیل می شود) ، سپس op ds.shard()
بر روی آن پرونده ها اعمال می شود. مثال: هنگام استفاده از train[:50%]
با num_input_pipelines=2
، هر یک از 2 کارگر 1/4 داده ها را می خوانند.
When shuffle_files=True
، پرونده ها در یک کارگر shuffle_files=True
شوند ، اما نه در بین کارگران. هر کارگر زیر مجموعه پرونده های مشابه بین دوره ها را می خواند.
رمزگشایی سریعتر تصویر
به طور پیش فرض TFDS به طور خودکار تصاویر را رمزگشایی می کند. با این حال ، مواردی وجود دارد که می تواند عملکرد رمزگشایی تصویر با tfds.decode.SkipDecoding
و دستی استفاده از op tf.io.decode_image
عملکرد بیشتری داشته باشد:
- هنگام فیلتر کردن مثالها (با
ds.filter
) ، برای رمزگشایی تصاویر پس از فیلتر شدن نمونه ها. - هنگام برش تصاویر ، از گزینه
tf.image.decode_and_crop_jpeg
ذوب شده استفاده کنید.
کد هر دو مثال در راهنمای رمزگشایی موجود است.