اگر یک پروتو tf.train.Example
(داخل .tfrecord
, .riegeli
,...) دارید که توسط ابزارهای شخص ثالث تولید شده است و می خواهید مستقیماً با tfds API بارگیری کنید، این صفحه برای شما مناسب است.
برای بارگیری فایلهای .tfrecord
. فقط باید:
- از قرارداد نامگذاری TFDS پیروی کنید.
- فایل های ابرداده (
dataset_info.json
,features.json
) را در کنار فایل های tfrecord خود اضافه کنید.
محدودیت ها:
-
tf.train.SequenceExample
پشتیبانی نمی شود، فقطtf.train.Example
. - شما باید بتوانید
tf.train.Example
را برحسبtfds.features
بیان کنید (به بخش زیر مراجعه کنید).
قرارداد نامگذاری فایل
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/')