إذا كان لديك نموذج 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 بفك تشفير الصور والفيديوهات تلقائيًا... مثل أي مجموعات بيانات TFDS أخرى، سيتم عرض البيانات التعريفية للميزات (مثل أسماء التصنيفات،...) للمستخدم (على سبيل المثال، info.features['label'].names
).
إذا كنت تتحكم في خط أنابيب التوليد
إذا قمت بإنشاء مجموعات بيانات خارج TFDS ولكنك لا تزال تتحكم في مسار الإنشاء، فيمكنك استخدام tfds.features.FeatureConnector.serialize_example
لترميز بياناتك من dict[np.ndarray]
إلى tf.train.Example
proto 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)
أو واجهة برمجة التطبيقات الفرعية : 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
مع واجهة برمجة تطبيقات 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
مع واجهة برمجة تطبيقات 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
، وذلك ببساطة عن طريق توفير data_dir/
:
ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')