फ़ीचरकनेक्टर

tfds.features.FeatureConnector API:

  • अंतिम tf.data.Dataset की संरचना, आकार, dtype को परिभाषित करता है
  • डिस्क से/से क्रमांकन को दूर करें।
  • अतिरिक्त मेटाडेटा प्रदर्शित करें (जैसे लेबल नाम, ऑडियो नमूना दर,...)

सिंहावलोकन

tfds.features.FeatureConnector डेटासेट सुविधाओं की संरचना को परिभाषित करता है ( tfds.core.DatasetInfo में):

tfds.core.DatasetInfo(
    features=tfds.features.FeaturesDict({
        'image': tfds.features.Image(shape=(28, 28, 1), doc='Grayscale image'),
        'label': tfds.features.ClassLabel(
            names=['no', 'yes'],
            doc=tfds.features.Documentation(
                desc='Whether this is a picture of a cat',
                value_range='yes or no'
            ),
        ),
        'metadata': {
            'id': tf.int64,
            'timestamp': tfds.features.Scalar(
                tf.int64,
                doc='Timestamp when this picture was taken as seconds since epoch'),
            'language': tf.string,
        },
    }),
)

सुविधाओं को या तो केवल एक पाठ्य विवरण ( doc='description' ) का उपयोग करके या अधिक विस्तृत सुविधा विवरण प्रदान करने के लिए सीधे tfds.features.Documentation का उपयोग करके प्रलेखित किया जा सकता है।

विशेषताएं हो सकती हैं:

  • स्केलर मान: tf.bool , tf.string , tf.float32 ,... जब आप सुविधा का दस्तावेजीकरण करना चाहते हैं, तो आप tfds.features.Scalar(tf.int64, doc='description') भी उपयोग कर सकते हैं।
  • tfds.features.Audio , tfds.features.Video ,... (उपलब्ध सुविधाओं की सूची देखें)
  • सुविधाओं का नेस्टेड dict : {'metadata': {'image': Image(), 'description': tf.string} } ,...
  • नेस्टेड tfds.features.Sequence : Sequence({'image': ..., 'id': ...}) , Sequence(Sequence(tf.int64)) ,...

पीढ़ी के दौरान, उदाहरणों को FeatureConnector.encode_example द्वारा डिस्क के लिए उपयुक्त प्रारूप में स्वचालित रूप से क्रमबद्ध किया जाएगा (वर्तमान में tf.train.Example प्रोटोकॉल बफ़र्स):

yield {
    'image': '/path/to/img0.png',  # `np.array`, file bytes,... also accepted
    'label': 'yes',  # int (0-num_classes) also accepted
    'metadata': {
        'id': 43,
        'language': 'en',
    },
}

डेटासेट पढ़ते समय (उदाहरण के लिए tfds.load के साथ), डेटा स्वचालित रूप से FeatureConnector.decode_example के साथ डिकोड हो जाता है। लौटाया गया tf.data.Dataset tfds.core.DatasetInfo में परिभाषित dict संरचना से मेल खाएगा:

ds = tfds.load(...)
ds.element_spec == {
    'image': tf.TensorSpec(shape=(28, 28, 1), tf.uint8),
    'label': tf.TensorSpec(shape=(), tf.int64),
    'metadata': {
        'id': tf.TensorSpec(shape=(), tf.int64),
        'language': tf.TensorSpec(shape=(), tf.string),
    },
}

प्रोटो को क्रमबद्ध/डीक्रमीकृत करें

TFDS, tf.train.Example proto में उदाहरणों को क्रमबद्ध/deserialize करने के लिए एक निम्न-स्तरीय API को उजागर करता है।

dict[np.ndarray | Path | str | ...] को क्रमबद्ध करने के लिए dict[np.ndarray | Path | str | ...] प्रोटो bytes के लिए, features.serialize_example उपयोग करें:

with tf.io.TFRecordWriter('path/to/file.tfrecord') as writer:
  for ex in all_exs:
    ex_bytes = features.serialize_example(data)
    f.write(ex_bytes)

tf.Tensor पर प्रोटो bytes को डीसेरिएलाइज़ करने के लिए, features.deserialize_example उपयोग करें:

ds = tf.data.TFRecordDataset('path/to/file.tfrecord')
ds = ds.map(features.deserialize_example)

मेटाडेटा तक पहुंचें

सुविधाओं के मेटाडेटा (लेबल नाम, आकार, dtype,...) तक पहुंचने के लिए परिचय दस्तावेज़ देखें। उदाहरण:

ds, info = tfds.load(..., with_info=True)

info.features['label'].names  # ['cat', 'dog', ...]
info.features['label'].str2int('cat')  # 0

अपना स्वयं का tfds.features.FeatureConnector बनाएं

यदि आपको लगता है कि उपलब्ध सुविधाओं में से कोई सुविधा गायब है, तो कृपया एक नया अंक खोलें।

अपना स्वयं का फीचर कनेक्टर बनाने के लिए, आपको tfds.features.FeatureConnector से इनहेरिट करना होगा और अमूर्त तरीकों को लागू करना होगा।

  • यदि आपकी सुविधा एकल टेंसर मान है, तो tfds.features.Tensor से प्राप्त करना और आवश्यकता पड़ने पर super() का उपयोग करना सबसे अच्छा है। उदाहरण के लिए tfds.features.BBoxFeature स्रोत कोड देखें।
  • यदि आपकी सुविधा कई टेंसरों का एक कंटेनर है, तो tfds.features.FeaturesDict से इनहेरिट करना और उप-कनेक्टरों को स्वचालित रूप से एन्कोड करने के लिए super() उपयोग करना सबसे अच्छा है।

tfds.features.FeatureConnector ऑब्जेक्ट यह बताता है कि डिस्क पर फीचर को कैसे एन्कोड किया गया है और इसे उपयोगकर्ता के सामने कैसे प्रस्तुत किया जाता है। नीचे एक आरेख है जो डेटासेट की अमूर्त परतों और कच्चे डेटासेट फ़ाइलों से tf.data.Dataset ऑब्जेक्ट में परिवर्तन को दर्शाता है।

डेटासेटबिल्डर अमूर्त परतें

अपना स्वयं का फीचर कनेक्टर बनाने के लिए, tfds.features.FeatureConnector उपवर्गित करें और अमूर्त तरीकों को लागू करें:

  • encode_example(data) : यह परिभाषित करता है कि जनरेटर _generate_examples() में दिए गए डेटा को tf.train.Example संगत डेटा में कैसे एनकोड किया जाए। एकल मान, या मानों का एक dict लौटा सकता है।
  • decode_example(data) : परिभाषित करता है कि tf.train.Example से पढ़े गए टेंसर से डेटा को tf.data.Dataset द्वारा लौटाए गए उपयोगकर्ता टेंसर में कैसे डिकोड किया जाए।
  • get_tensor_info() : tf.data.Dataset द्वारा लौटाए गए टेंसर के आकार/dtype को इंगित करता है। यदि किसी अन्य tfds.features से विरासत में मिला है तो यह वैकल्पिक हो सकता है।
  • (वैकल्पिक रूप से) get_serialized_info() : यदि get_tensor_info() द्वारा लौटाई गई जानकारी वास्तव में डिस्क पर डेटा लिखे जाने के तरीके से भिन्न है, तो आपको tf.train.Example के विनिर्देशों से मिलान करने के लिए get_serialized_info() अधिलेखित करना होगा।
  • to_json_content / from_json_content : आपके डेटासेट को मूल स्रोत कोड के बिना लोड करने की अनुमति देने के लिए यह आवश्यक है। उदाहरण के लिए ऑडियो सुविधा देखें.

अधिक जानकारी के लिए, tfds.features.FeatureConnector दस्तावेज़ पर एक नज़र डालें। वास्तविक उदाहरणों को देखना भी सर्वोत्तम है।