אם יש לך פרוטו 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)
, או ממשק ה-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/')