TFDS के साथ बाहरी tfrecord लोड करें

यदि आपके पास एक 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/')