الانقسامات والتقطيع

تعرض جميع مجموعات بيانات TFDS تقسيمات البيانات المختلفة (مثل 'train' و 'test' ) والتي يمكن استكشافها في الكتالوج . يمكن استخدام أي سلسلة أبجدية كاسم مقسم، باستثناء all (وهو مصطلح محجوز يتوافق مع اتحاد جميع الانقسامات، انظر أدناه).

بالإضافة إلى تقسيمات مجموعة البيانات "الرسمية"، تسمح TFDS بتحديد شريحة (شرائح) من الانقسام (الشرائح) والمجموعات المختلفة.

تقطيع API

يتم تحديد تعليمات التقطيع في tfds.load أو tfds.DatasetBuilder.as_dataset من خلال split= kwarg.

ds = tfds.load('my_dataset', split='train[:75%]')
builder = tfds.builder('my_dataset')
ds = builder.as_dataset(split='test+train[:75%]')

يمكن أن يكون الانقسام:

  • أسماء الانقسام البسيطة (سلسلة مثل 'train' ، 'test' ، ...): جميع الأمثلة ضمن التقسيم المحدد.
  • الشرائح : الشرائح لها نفس الدلالات مثل تدوين شريحة بايثون . يمكن أن تكون الشرائح:
    • مطلق ( 'train[123:450]' , train[:4000] ): (انظر الملاحظة أدناه للحصول على تحذير حول ترتيب القراءة)
    • النسبة المئوية ( 'train[:75%]' , 'train[25%:75%]' ): قسّم البيانات الكاملة إلى شرائح متساوية. إذا لم تكن البيانات قابلة للقسمة بالتساوي، فقد تحتوي بعض النسب المئوية على أمثلة إضافية. يتم دعم النسبة المئوية الكسرية.
    • Shard ( train[:4shard] , train[4shard] ): حدد جميع الأمثلة في الجزء المطلوب. (راجع info.splits['train'].num_shards للحصول على عدد أجزاء التقسيم)
  • اتحاد الانقسامات ( 'train+test' , 'train[:25%]+test' ): سيتم تشذير الانقسامات معًا.
  • مجموعة البيانات الكاملة ( 'all' ): 'all' هو اسم تقسيم خاص يتوافق مع اتحاد جميع الانقسامات (أي ما يعادل 'train+test+...' ).
  • قائمة الانقسامات ( ['train', 'test'] ): يتم إرجاع tf.data.Dataset المتعددة بشكل منفصل:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits والتدريب متعدد المضيفين

يقوم tfds.even_splits بإنشاء قائمة بالتقسيمات الفرعية غير المتداخلة بنفس الحجم.

# Divide the dataset into 3 even parts, each containing 1/3 of the data
split0, split1, split2 = tfds.even_splits('train', n=3)

ds = tfds.load('my_dataset', split=split2)

يمكن أن يكون هذا مفيدًا بشكل خاص عند التدريب في بيئة موزعة، حيث يجب أن يتلقى كل مضيف شريحة من البيانات الأصلية.

مع Jax ، يمكن تبسيط ذلك بشكل أكبر باستخدام tfds.split_for_jax_process :

split = tfds.split_for_jax_process('train', drop_remainder=True)
ds = tfds.load('my_dataset', split=split)

tfds.split_for_jax_process هو اسم مستعار بسيط لـ:

# The current `process_index` loads only `1 / process_count` of the data.
splits = tfds.even_splits('train', n=jax.process_count(), drop_remainder=True)
split = splits[jax.process_index()]

tfds.even_splits ، يقبل tfds.split_for_jax_process أي قيمة مقسمة كمدخل (على سبيل المثال 'train[75%:]+test' )

التقطيع والبيانات الوصفية

من الممكن الحصول على معلومات إضافية حول الانقسامات/التقسيمات الفرعية ( num_examples ، file_instructions ،...) باستخدام معلومات مجموعة البيانات :

builder = tfds.builder('my_dataset')
builder.info.splits['train'].num_examples  # 10_000
builder.info.splits['train[:75%]'].num_examples  # 7_500 (also works with slices)
builder.info.splits.keys()  # ['train', 'test']

التحقق من الصحة عبر

أمثلة على التحقق المتبادل بعشرة أضعاف باستخدام واجهة برمجة تطبيقات السلسلة:

vals_ds = tfds.load('mnist', split=[
    f'train[{k}%:{k+10}%]' for k in range(0, 100, 10)
])
trains_ds = tfds.load('mnist', split=[
    f'train[:{k}%]+train[{k+10}%:]' for k in range(0, 100, 10)
])

ستكون كل مجموعة بيانات التحقق 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . وستكون كل مجموعة من مجموعات بيانات التدريب هي 90% التكميلية: [10%:100%] (لمجموعة التحقق المقابلة من [0%:10%] )، `[0%:10%]

  • [20%:100%] (for a validation set of [10%:20%]`)،...

tfds.core.ReadInstruction والتقريب

بدلاً من str ، من الممكن تمرير الانقسامات كـ tfds.core.ReadInstruction :

على سبيل المثال، split = 'train[50%:75%] + test' يعادل:

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )
    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unit يمكن أن تكون:

  • abs : التقطيع المطلق
  • % : تقطيع النسبة المئوية
  • shard : التقطيع

يحتوي tfds.ReadInstruction أيضًا على وسيطة تقريب. إذا لم يتم تقسيم عدد الأمثلة في مجموعة البيانات بالتساوي:

  • rounding='closest' (افتراضي): يتم توزيع الأمثلة المتبقية بين النسبة المئوية، لذلك قد تحتوي بعض النسب المئوية على أمثلة إضافية.
  • rounding='pct1_dropremainder' : تم حذف الأمثلة المتبقية، ولكن هذا يضمن أن جميع النسب المئوية تحتوي على نفس عدد الأمثلة بالضبط (على سبيل المثال: len(5%) == 5 * len(1%) ).

الاستنساخ والحتمية

أثناء الإنشاء، بالنسبة لإصدار مجموعة بيانات معينة، يضمن TFDS أن الأمثلة يتم خلطها بشكل حتمي على القرص. لذا فإن إنشاء مجموعة البيانات مرتين (في جهازي كمبيوتر مختلفين) لن يغير ترتيب المثال.

وبالمثل، ستحدد واجهة برمجة التطبيقات المقسمة دائمًا نفس set الأمثلة، بغض النظر عن النظام الأساسي والهندسة المعمارية وما إلى ذلك. وهذا يعني set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

ومع ذلك، فإن الترتيب الذي تُقرأ به الأمثلة قد لا يكون حتميًا. يعتمد هذا على معلمات أخرى (على سبيل المثال ما إذا كانت shuffle_files=True ).