تحميل 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 بفك تشفير الصور والفيديوهات تلقائيًا... مثل أي مجموعات بيانات 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/')