यदि आपके पास एक tf.train.Example
प्रोटो (अंदर .tfrecord
, .riegeli
,...) है, जो तृतीय पक्ष टूल द्वारा जेनरेट किया गया है, जिसे आप सीधे tfds API के साथ लोड करना चाहते हैं, तो यह पृष्ठ आपके लिए है।
अपनी .tfrecord
फ़ाइलें लोड करने के लिए, आपको केवल यह करना होगा:
- टीएफडीएस नामकरण परंपरा का पालन करें।
- अपनी tfrecord फ़ाइलों के साथ मेटाडेटा फ़ाइलें (
dataset_info.json
,features.json
) जोड़ें।
सीमाएँ:
-
tf.train.SequenceExample
समर्थित नहीं है, केवलtf.train.Example
समर्थित है। - आपको
tf.train.Example
tfds.features
के संदर्भ में व्यक्त करने में सक्षम होना चाहिए (नीचे अनुभाग देखें)।
फ़ाइल नामकरण परंपरा
टीएफडीएस फ़ाइल नामों के लिए एक टेम्पलेट को परिभाषित करने का समर्थन करता है, जो विभिन्न फ़ाइल नामकरण योजनाओं का उपयोग करने के लिए लचीलापन प्रदान करता है। टेम्प्लेट को tfds.core.ShardedFileTemplate
द्वारा दर्शाया गया है और निम्नलिखित वेरिएबल्स का समर्थन करता है: {DATASET}
, {SPLIT}
, {FILEFORMAT}
, {SHARD_INDEX}
, {NUM_SHARDS}
, और {SHARD_X_OF_Y}
। उदाहरण के लिए, TFDS की डिफ़ॉल्ट फ़ाइल नामकरण योजना है: {DATASET}-{SPLIT}.{FILEFORMAT}-{SHARD_X_OF_Y}
। एमएनआईएसटी के लिए, इसका मतलब है कि फ़ाइल नाम इस प्रकार दिखते हैं:
-
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),
}
सुविधाओं को निर्दिष्ट करने से टीएफडीएस छवियों, वीडियो को स्वचालित रूप से डिकोड करने की अनुमति देता है... किसी भी अन्य टीएफडीएस डेटासेट की तरह, फीचर मेटाडेटा (जैसे लेबल नाम,...) उपयोगकर्ता के सामने प्रदर्शित किया जाएगा (उदाहरण के लिए info.features['label'].names
).
यदि आप जनरेशन पाइपलाइन को नियंत्रित करते हैं
यदि आप टीएफडीएस के बाहर डेटासेट बनाते हैं लेकिन फिर भी जेनरेशन पाइपलाइन को नियंत्रित करते हैं, तो आप अपने डेटा को dict[np.ndarray]
से tf.train.Example
प्रोटो bytes
में एन्कोड करने के लिए tfds.features.FeatureConnector.serialize_example
उपयोग कर सकते हैं:
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)
यह टीएफडीएस के साथ सुविधा अनुकूलता सुनिश्चित करेगा।
इसी तरह, प्रोटो को डीकोड करने के लिए एक feature.deserialize_example
मौजूद है ( उदाहरण )
यदि आप जनरेशन पाइपलाइन को नियंत्रित नहीं करते हैं
यदि आप यह देखना चाहते हैं कि tfds.features
tf.train.Example
में कैसे दर्शाया जाता है, तो आप इसे कोलाब में जांच सकते हैं:
-
tfds.features
tf.train.Example
की मानव पठनीय संरचना में अनुवाद करने के लिए, आपfeatures.get_serialized_info()
पर कॉल कर सकते हैं। - सटीक
FixedLenFeature
प्राप्त करने के लिए,...स्पेकtf.io.parse_single_example
को पास कर दिया गया है, आपspec = features.tf_example_spec
उपयोग कर सकते हैं
विभाजन पर आंकड़े प्राप्त करें
टीएफडीएस को प्रत्येक शार्ड के भीतर उदाहरणों की सटीक संख्या जानने की आवश्यकता है। यह len(ds)
, या सबप्लिट API : 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.builder_from_directory
उपयोग करके लोड किया जा सकता है जो मानक TFDS API (जैसे tfds.builder
) के साथ tfds.core.DatasetBuilder
लौटाता है:
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 API (जैसे tfds.builder
) के साथ एक tfds.core.DatasetBuilder
लौटाता है:
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:
...
फ़ोल्डर संरचना (वैकल्पिक)
टीएफडीएस के साथ बेहतर अनुकूलता के लिए, आप अपने डेटा को <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/
यह आपके डेटासेट को केवल data_dir/
प्रदान करके tfds.load
/ tfds.builder
API के साथ संगत बना देगा:
ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')