این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

نکات مربوط به عملکرد

این سند نکات عملکردی ویژه TFDS را ارائه می دهد. توجه داشته باشید که TFDS فراهم می کند مجموعه داده به عنوان tf.data.Dataset ، بنابراین مشاوره از tf.data راهنمای هنوز هم اعمال می شود.

مجموعه داده های معیار

برای محک زدن هر شی tf.data.Dataset از tfds.core.benchmark(ds) استفاده کنید.

مطمئن شوید که batch_size= برای عادی سازی نتایج نشان داده شده است (به عنوان مثال 100 تکرار در ثانیه -> 3200 ثانیه در ثانیه).

ds = tfds.load('mnist', split='train').batch(32).prefetch()
# Display some benchmark statistics
tfds.core.benchmark(ds, batch_size=32)
# Second iteration is much faster, due to auto-caching
tfds.core.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%] به لیستی از فایلها برای خواندن تبدیل می شود) ، سپس گزینه 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 ذوب شده استفاده کنید.

کد هر دو مثال در راهنمای رمزگشایی موجود است.