यह पृष्ठ सामान्य हस्ताक्षरों का वर्णन करता है जिन्हें छवि-संबंधित कार्यों के लिए TF1 हब प्रारूप में मॉड्यूल द्वारा कार्यान्वित किया जाना चाहिए। ( TF2 SavedModel प्रारूप के लिए, अनुरूप SavedModel API देखें।)
कुछ मॉड्यूल का उपयोग एक से अधिक कार्यों के लिए किया जा सकता है (उदाहरण के लिए, छवि वर्गीकरण मॉड्यूल रास्ते में कुछ फीचर निष्कर्षण करते हैं)। इसलिए, प्रत्येक मॉड्यूल प्रकाशक द्वारा प्रत्याशित सभी कार्यों के लिए (1) नामित हस्ताक्षर प्रदान करता है, और (2) अपने निर्दिष्ट प्राथमिक कार्य के लिए एक डिफ़ॉल्ट हस्ताक्षर output = m(images)
प्रदान करता है।
छवि फ़ीचर वेक्टर
उपयोग सारांश
एक छवि सुविधा वेक्टर एक सघन 1-डी टेंसर है जो पूरी छवि का प्रतिनिधित्व करता है, आमतौर पर उपभोक्ता मॉडल द्वारा वर्गीकरण के लिए। (सीएनएन के मध्यवर्ती सक्रियणों के विपरीत, यह स्थानिक विखंडन की पेशकश नहीं करता है। छवि वर्गीकरण के विपरीत, यह प्रकाशक मॉडल द्वारा सीखे गए वर्गीकरण को त्याग देता है।)
छवि सुविधा निष्कर्षण के लिए एक मॉड्यूल में एक डिफ़ॉल्ट हस्ताक्षर होता है जो छवियों के एक बैच को फीचर वैक्टर के एक बैच में मैप करता है। इसका उपयोग इस प्रकार किया जा सकता है:
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
features = module(images) # A batch with shape [batch_size, num_features].
यह संबंधित नामित हस्ताक्षर को भी परिभाषित करता है।
हस्ताक्षर विशिष्टता
छवि सुविधा वैक्टर निकालने के लिए नामित हस्ताक्षर को इस प्रकार लागू किया जाता है
outputs = module(dict(images=images), signature="image_feature_vector",
as_dict=True)
features = outputs["default"]
इनपुट छवियों के इनपुट के लिए सामान्य परंपरा का पालन करता है।
आउटपुट डिक्शनरी में float32
और आकार [batch_size, num_features]
का "default"
आउटपुट होता है। batch_size
इनपुट के समान है, लेकिन ग्राफ़ निर्माण के समय ज्ञात नहीं है। num_features
एक ज्ञात, मॉड्यूल-विशिष्ट स्थिरांक है जो इनपुट आकार से स्वतंत्र है।
ये फ़ीचर वैक्टर एक सरल फ़ीड-फ़ॉरवर्ड क्लासिफायर के साथ वर्गीकरण के लिए उपयोग करने योग्य हैं (जैसे छवि वर्गीकरण के लिए एक विशिष्ट सीएनएन में सबसे ऊपरी कन्वेन्शनल परत से पूल की गई सुविधाएँ)।
आउटपुट सुविधाओं में ड्रॉपआउट लागू करना (या नहीं) मॉड्यूल उपभोक्ता पर छोड़ दिया जाना चाहिए। मॉड्यूल को स्वयं वास्तविक आउटपुट पर ड्रॉपआउट नहीं करना चाहिए (भले ही यह अन्य स्थानों पर आंतरिक रूप से ड्रॉपआउट का उपयोग करता हो)।
आउटपुट शब्दकोश आगे के आउटपुट प्रदान कर सकता है, उदाहरण के लिए, मॉड्यूल के अंदर छिपी हुई परतों की सक्रियता। उनकी कुंजियाँ और मान मॉड्यूल-निर्भर हैं। आर्किटेक्चर नाम के साथ आर्किटेक्चर-निर्भर कुंजियों को उपसर्ग करने की अनुशंसा की जाती है (उदाहरण के लिए, मध्यवर्ती परत "InceptionV3/Mixed_5c"
सबसे ऊपरी कनवल्शनल लेयर "InceptionV2/Mixed_5c"
के साथ भ्रमित होने से बचाने के लिए)।
छवि वर्गीकरण
उपयोग सारांश
छवि वर्गीकरण मॉड्यूल प्रकाशक द्वारा चयनित वर्गीकरण की कक्षाओं में सदस्यता के लिए छवि के पिक्सेल को रैखिक स्कोर (लॉगिट) पर मैप करता है। यह उपभोक्ताओं को प्रकाशक मॉड्यूल द्वारा सीखे गए विशेष वर्गीकरण से निष्कर्ष निकालने की अनुमति देता है, न कि केवल इसकी अंतर्निहित विशेषताओं (cf. इमेज फ़ीचर वेक्टर ) से।
छवि सुविधा निष्कर्षण के लिए एक मॉड्यूल में एक डिफ़ॉल्ट हस्ताक्षर होता है जो छवियों के एक बैच को लॉग के एक बैच में मैप करता है। इसका उपयोग इस प्रकार किया जा सकता है:
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
logits = module(images) # A batch with shape [batch_size, num_classes].
यह संबंधित नामित हस्ताक्षर को भी परिभाषित करता है।
हस्ताक्षर विशिष्टता
छवि सुविधा वैक्टर निकालने के लिए नामित हस्ताक्षर को इस प्रकार लागू किया जाता है
outputs = module(dict(images=images), signature="image_classification",
as_dict=True)
logits = outputs["default"]
इनपुट छवियों के इनपुट के लिए सामान्य परंपरा का पालन करता है।
आउटपुट डिक्शनरी में float32
और आकार [batch_size, num_classes]
का "default"
आउटपुट होता है। batch_size
इनपुट के समान है, लेकिन ग्राफ़ निर्माण के समय ज्ञात नहीं है। num_classes
वर्गीकरण में वर्गों की संख्या है, जो इनपुट आकार से स्वतंत्र एक ज्ञात स्थिरांक है।
outputs["default"][i, c]
का मूल्यांकन करने से सूचकांक c
के साथ कक्षा में उदाहरण i
की सदस्यता की भविष्यवाणी करने वाला एक अंक प्राप्त होता है।
यह अंतर्निहित वर्गीकरण पर निर्भर करता है कि क्या ये स्कोर सॉफ्टमैक्स (पारस्परिक रूप से अनन्य वर्गों के लिए), सिग्मॉइड (ऑर्थोगोनल वर्गों के लिए), या कुछ और के साथ उपयोग किए जाने के लिए हैं। मॉड्यूल दस्तावेज़ीकरण में इसका वर्णन होना चाहिए, और वर्ग सूचकांकों की परिभाषा का संदर्भ देना चाहिए।
आउटपुट शब्दकोश आगे के आउटपुट प्रदान कर सकता है, उदाहरण के लिए, मॉड्यूल के अंदर छिपी हुई परतों की सक्रियता। उनकी कुंजियाँ और मान मॉड्यूल-निर्भर हैं। आर्किटेक्चर नाम के साथ आर्किटेक्चर-निर्भर कुंजियों को उपसर्ग करने की अनुशंसा की जाती है (उदाहरण के लिए, मध्यवर्ती परत "InceptionV3/Mixed_5c"
सबसे ऊपरी कनवल्शनल लेयर "InceptionV2/Mixed_5c"
के साथ भ्रमित होने से बचाने के लिए)।
छवि इनपुट
यह सभी प्रकार के छवि मॉड्यूल और छवि हस्ताक्षरों के लिए सामान्य है।
एक हस्ताक्षर जो छवियों के एक बैच को इनपुट के रूप में लेता है, उन्हें डीटाइप float32
और आकार के घने 4-डी टेंसर के रूप में स्वीकार करता है [batch_size, height, width, 3]
जिनके तत्व पिक्सेल के आरजीबी रंग मान हैं जो सीमा के लिए सामान्यीकृत होते हैं [0, 1] . यह आपको tf.image.decode_*()
और उसके बाद tf.image.convert_image_dtype(..., tf.float32)
से मिलता है।
छवियों के बिल्कुल एक (या एक प्रिंसिपल) इनपुट वाला मॉड्यूल इस इनपुट के लिए "images"
नाम का उपयोग करता है।
मॉड्यूल किसी भी batch_size
स्वीकार करता है, और तदनुसार TensorInfo.tensor_shape के पहले आयाम को "अज्ञात" पर सेट करता है। अंतिम आयाम RGB चैनलों की संख्या 3
पर तय किया गया है। height
और width
आयाम इनपुट छवियों के अपेक्षित आकार के अनुसार तय किए गए हैं। (भविष्य के कार्य पूरी तरह से कन्वेन्शनल मॉड्यूल के लिए उस प्रतिबंध को हटा सकते हैं।)
मॉड्यूल के उपभोक्ताओं को सीधे आकार का निरीक्षण नहीं करना चाहिए, बल्कि मॉड्यूल या मॉड्यूल विनिर्देश पर hub.get_expected_image_size() को कॉल करके आकार की जानकारी प्राप्त करनी चाहिए, और उनसे तदनुसार इनपुट छवियों का आकार बदलने की उम्मीद की जाती है (आमतौर पर बैचिंग से पहले/बैचिंग के दौरान)।
सादगी के लिए, टीएफ-हब मॉड्यूल टेंसर के channels_last
(या NHWC
) लेआउट का उपयोग करते हैं, और यदि आवश्यक हो तो channels_first
(या NCHW
) को फिर से लिखने के लिए इसे टेन्सरफ्लो के ग्राफ ऑप्टिमाइज़र पर छोड़ देते हैं। यह TensorFlow संस्करण 1.7 के बाद से डिफ़ॉल्ट रूप से ऐसा कर रहा है।