טען 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) , או ממשק ה-API של subplit : 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/')