tfrecord خارجی را با TFDS بارگیری کنید

اگر یک پروتو tf.train.Example (داخل .tfrecord , .riegeli ,...) دارید که توسط ابزارهای شخص ثالث تولید شده است و می خواهید مستقیماً با tfds API بارگیری کنید، این صفحه برای شما مناسب است.

برای بارگیری فایل‌های .tfrecord . فقط باید:

  • از قرارداد نامگذاری TFDS پیروی کنید.
  • فایل های ابرداده ( dataset_info.json , features.json ) را در کنار فایل های tfrecord خود اضافه کنید.

محدودیت ها:

قرارداد نامگذاری فایل

TFDS از تعریف یک الگو برای نام فایل ها پشتیبانی می کند، که انعطاف پذیری برای استفاده از طرح های نامگذاری مختلف فایل ها را فراهم می کند. این الگو با یک tfds.core.ShardedFileTemplate نشان داده می‌شود و از متغیرهای زیر پشتیبانی می‌کند: {DATASET} ، {SPLIT} ، {FILEFORMAT} ، {SHARD_INDEX} ، {NUM_SHARDS} و {SHARD_X_OF_Y} . برای مثال، طرح نام‌گذاری فایل پیش‌فرض TFDS این است: {DATASET}-{SPLIT}.{FILEFORMAT}-{SHARD_X_OF_Y} . برای MNIST، این بدان معنی است که نام فایل ها به صورت زیر است:

  • mnist-test.tfrecord-00000-of-00001
  • mnist-train.tfrecord-00000-of-00001

متادیتا اضافه کنید

ساختار ویژگی را ارائه دهید

برای اینکه TFDS بتواند پروتو tf.train.Example رمزگشایی کند، باید ساختار tfds.features را مطابق با مشخصات خود ارائه دهید. مثلا:

features = tfds.features.FeaturesDict({
    'image':
        tfds.features.Image(
            shape=(256, 256, 3),
            doc='Picture taken by smartphone, downscaled.'),
    'label':
        tfds.features.ClassLabel(names=['dog', 'cat']),
    'objects':
        tfds.features.Sequence({
            'camera/K': tfds.features.Tensor(shape=(3,), dtype=tf.float32),
        }),
})

مربوط به مشخصات tf.train.Example زیر است:

{
    'image': tf.io.FixedLenFeature(shape=(), dtype=tf.string),
    'label': tf.io.FixedLenFeature(shape=(), dtype=tf.int64),
    'objects/camera/K': tf.io.FixedLenSequenceFeature(shape=(3,), dtype=tf.int64),
}

مشخص کردن ویژگی‌ها به TFDS اجازه می‌دهد تا تصاویر، ویدیوها و... را به‌طور خودکار رمزگشایی info.features['label'].names ).

اگر خط لوله تولید را کنترل کنید

اگر مجموعه داده‌های خارج از TFDS تولید می‌کنید اما همچنان خط لوله تولید را کنترل می‌کنید، می‌توانید از tfds.features.FeatureConnector.serialize_example برای رمزگذاری داده‌های خود از dict[np.ndarray] به tf.train.Example bytes پروتو استفاده کنید:

with tf.io.TFRecordWriter('path/to/file.tfrecord') as writer:
  for ex in all_exs:
    ex_bytes = features.serialize_example(data)
    writer.write(ex_bytes)

این کار سازگاری ویژگی با TFDS را تضمین می کند.

به طور مشابه، یک feature.deserialize_example برای رمزگشایی پروتو وجود دارد ( مثال )

اگر خط لوله تولید را کنترل نکنید

اگر می‌خواهید ببینید tfds.features چگونه در یک tf.train.Example نشان داده می‌شوند، می‌توانید این را در colab بررسی کنید:

  • برای ترجمه tfds.features به ساختار خوانا توسط انسان tf.train.Example ، می توانید features.get_serialized_info() فراخوانی کنید.
  • برای دریافت مشخصات دقیق FixedLenFeature ,... به tf.io.parse_single_example می توانید spec = features.tf_example_spec استفاده کنید

دریافت آمار در مورد تقسیم

TFDS نیاز به دانستن تعداد دقیق نمونه ها در هر قطعه دارد. این برای ویژگی‌هایی مانند len(ds) یا API فرعی : split='train[75%:]' لازم است.

  • اگر این اطلاعات را دارید، می‌توانید به صراحت فهرستی از tfds.core.SplitInfo ایجاد کنید و به بخش بعدی بروید:

    split_infos = [
        tfds.core.SplitInfo(
            name='train',
            shard_lengths=[1024, ...],  # Num of examples in shard0, shard1,...
            num_bytes=0,  # Total size of your dataset (if unknown, set to 0)
        ),
        tfds.core.SplitInfo(name='test', ...),
    ]
    
  • اگر این اطلاعات را نمی دانید، می توانید آن را با استفاده از اسکریپت compute_split_info.py (یا در اسکریپت خودتان با tfds.folder_dataset.compute_split_info ) محاسبه کنید. یک خط لوله پرتو راه اندازی می کند که تمام قطعات موجود در فهرست داده شده را می خواند و اطلاعات را محاسبه می کند.

فایل های ابرداده را اضافه کنید

برای افزودن خودکار فایل های فوق داده مناسب در مجموعه داده خود، از tfds.folder_dataset.write_metadata استفاده کنید:

tfds.folder_dataset.write_metadata(
    data_dir='/path/to/my/dataset/1.0.0/',
    features=features,
    # Pass the `out_dir` argument of compute_split_info (see section above)
    # You can also explicitly pass a list of `tfds.core.SplitInfo`.
    split_infos='/path/to/my/dataset/1.0.0/',
    # Pass a custom file name template or use None for the default TFDS
    # file name template.
    filename_template='{SPLIT}-{SHARD_X_OF_Y}.{FILEFORMAT}',

    # Optionally, additional DatasetInfo metadata can be provided
    # See:
    # https://www.tensorflow.org/datasets/api_docs/python/tfds/core/DatasetInfo
    description="""Multi-line description."""
    homepage='http://my-project.org',
    supervised_keys=('image', 'label'),
    citation="""BibTex citation.""",
)

هنگامی که تابع یک بار در فهرست مجموعه داده شما فراخوانی شد، فایل های فراداده ( dataset_info.json ،...) اضافه شده اند و مجموعه داده های شما آماده بارگیری با TFDS هستند (به بخش بعدی مراجعه کنید).

بارگذاری مجموعه داده با TFDS

مستقیم از پوشه

هنگامی که ابرداده تولید شد، مجموعه داده‌ها را می‌توان با استفاده از tfds.builder_from_directory بارگیری کرد که یک tfds.core.DatasetBuilder را با API استاندارد TFDS (مانند tfds.builder ) برمی‌گرداند:

builder = tfds.builder_from_directory('~/path/to/my_dataset/3.0.0/')

# Metadata are available as usual
builder.info.splits['train'].num_examples

# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
  ...

مستقیماً از چندین پوشه

همچنین امکان بارگیری داده ها از چندین پوشه وجود دارد. به عنوان مثال، این می تواند در یادگیری تقویتی اتفاق بیفتد، زمانی که چندین عامل هر کدام یک مجموعه داده جداگانه تولید می کنند و شما می خواهید همه آنها را با هم بارگذاری کنید. موارد استفاده دیگر زمانی است که یک مجموعه داده جدید به طور منظم تولید می شود، به عنوان مثال یک مجموعه داده جدید در روز، و شما می خواهید داده ها را از محدوده تاریخ بارگیری کنید.

برای بارگیری داده‌ها از چندین پوشه، از tfds.builder_from_directories استفاده کنید که یک tfds.core.DatasetBuilder را با API استاندارد TFDS (مانند tfds.builder ) برمی‌گرداند:

builder = tfds.builder_from_directories(builder_dirs=[
    '~/path/my_dataset/agent1/1.0.0/',
    '~/path/my_dataset/agent2/1.0.0/',
    '~/path/my_dataset/agent3/1.0.0/',
])

# Metadata are available as usual
builder.info.splits['train'].num_examples

# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
  ...

ساختار پوشه (اختیاری)

برای سازگاری بهتر با TFDS، می توانید داده های خود را به صورت <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version> سازماندهی کنید. مثلا:

data_dir/
    dataset0/
        1.0.0/
        1.0.1/
    dataset1/
        config0/
            2.0.0/
        config1/
            2.0.0/

این باعث می شود مجموعه داده های شما با tfds.load / tfds.builder API سازگار باشد، به سادگی با ارائه data_dir/ :

ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')