पुन: प्रयोज्य सहेजे गए मॉडल

परिचय

TensorFlow हब अन्य परिसंपत्तियों के अलावा, TensorFlow 2 के लिए SavedModels को होस्ट करता है। उन्हें obj = hub.load(url) [ और जानें ] के साथ पायथन प्रोग्राम में वापस लोड किया जा सकता है। लौटाया गया obj tf.saved_model.load() का परिणाम है (TensorFlow की SavedModel गाइड देखें)। इस ऑब्जेक्ट में मनमानी विशेषताएँ हो सकती हैं जो tf.functions, tf.Variables (उनके पूर्व-प्रशिक्षित मानों से प्रारंभ), अन्य संसाधन और, पुनरावर्ती रूप से, ऐसी और भी वस्तुएं हैं।

यह पृष्ठ TensorFlow Python प्रोग्राम में पुन: उपयोग करने के लिए लोड किए गए obj द्वारा कार्यान्वित किए जाने वाले इंटरफ़ेस का वर्णन करता है। इस इंटरफ़ेस के अनुरूप SaveModels को पुन: प्रयोज्य SaveModels कहा जाता है।

पुन: उपयोग का अर्थ है obj चारों ओर एक बड़ा मॉडल बनाना, जिसमें इसे ठीक करने की क्षमता भी शामिल है। फाइन-ट्यूनिंग का अर्थ है आसपास के मॉडल के हिस्से के रूप में लोड किए गए obj में वजन का आगे प्रशिक्षण। हानि फ़ंक्शन और अनुकूलक आसपास के मॉडल द्वारा निर्धारित किए जाते हैं; obj केवल आउटपुट एक्टिवेशन ("फॉरवर्ड पास") के लिए इनपुट की मैपिंग को परिभाषित करता है, जिसमें संभवतः ड्रॉपआउट या बैच सामान्यीकरण जैसी तकनीकें शामिल हैं।

TensorFlow हब टीम उन सभी SavedModels में पुन: प्रयोज्य SavedModel इंटरफ़ेस को लागू करने की अनुशंसा करती है जिनका उपरोक्त अर्थ में पुन: उपयोग किया जाना है। tensorflow_hub लाइब्रेरी की कई उपयोगिताओं, विशेष रूप से hub.KerasLayer , को इसे लागू करने के लिए SavedModels की आवश्यकता होती है।

सिग्नेचरडिफ्स से संबंध

tf.functions और अन्य TF2 सुविधाओं के संदर्भ में यह इंटरफ़ेस SavedModel के हस्ताक्षरों से अलग है, जो TF1 के बाद से उपलब्ध हैं और अनुमान के लिए TF2 में उपयोग किया जाना जारी है (जैसे कि SavedModels को TF सर्विंग या TF लाइट में तैनात करना)। अनुमान के लिए हस्ताक्षर फ़ाइन-ट्यूनिंग का समर्थन करने के लिए पर्याप्त अभिव्यंजक नहीं हैं, और tf.function पुन: उपयोग किए गए मॉडल के लिए अधिक प्राकृतिक और अभिव्यंजक पायथन एपीआई प्रदान करता है।

मॉडल-निर्माण पुस्तकालयों से संबंध

एक पुन: प्रयोज्य सेव्डमॉडल केवल TensorFlow 2 प्राइमेटिव का उपयोग करता है, जो केरस या सॉनेट जैसी किसी विशेष मॉडल-बिल्डिंग लाइब्रेरी से स्वतंत्र होता है। यह मूल मॉडल-बिल्डिंग कोड पर निर्भरता से मुक्त होकर, मॉडल-बिल्डिंग लाइब्रेरीज़ में पुन: उपयोग की सुविधा प्रदान करता है।

कुछ मात्रा में अनुकूलन की आवश्यकता होगी, पुन: प्रयोज्य सहेजे गए मॉडल को किसी दिए गए मॉडल-बिल्डिंग लाइब्रेरी में लोड करें या सहेजें। केरस के लिए, hub.KerasLayer लोडिंग प्रदान करता है, और इस इंटरफ़ेस का सुपरसेट प्रदान करने के लक्ष्य के साथ सेव्डमॉडल प्रारूप में केरस की अंतर्निहित बचत को TF2 के लिए फिर से डिज़ाइन किया गया है (मई 2019 से RFC देखें)।

कार्य-विशिष्ट "कॉमन सेव्डमॉडल एपीआई" से संबंध

इस पृष्ठ पर इंटरफ़ेस परिभाषा किसी भी संख्या और प्रकार के इनपुट और आउटपुट की अनुमति देती है। टीएफ हब के लिए कॉमन सेव्डमॉडल एपीआई मॉडल को आसानी से विनिमेय बनाने के लिए विशिष्ट कार्यों के लिए उपयोग परंपराओं के साथ इस सामान्य इंटरफ़ेस को परिष्कृत करते हैं।

इंटरफ़ेस परिभाषा

गुण

एक पुन: प्रयोज्य सेव्डमॉडल एक TensorFlow 2 सेव्डमॉडल है जैसे कि obj = tf.saved_model.load(...) एक ऑब्जेक्ट लौटाता है जिसमें निम्नलिखित विशेषताएँ होती हैं

  • __call__ । आवश्यक। नीचे दिए गए विनिर्देश के अधीन मॉडल की गणना ("फॉरवर्ड पास") को कार्यान्वित करने वाला एक tf.फ़ंक्शन।

  • variables : tf.Variable ऑब्जेक्ट्स की एक सूची, __call__ के किसी भी संभावित आह्वान द्वारा उपयोग किए जाने वाले सभी वेरिएबल्स को सूचीबद्ध करती है, जिसमें प्रशिक्षण योग्य और गैर-प्रशिक्षित दोनों शामिल हैं।

    खाली होने पर यह सूची छोड़ी जा सकती है।

  • trainable_variables : tf.Variable ऑब्जेक्ट्स की एक सूची जैसे कि v.trainable सभी तत्वों के लिए सत्य है। ये चर variables का एक उपसमूह होना चाहिए। ये वे वेरिएबल हैं जिन्हें ऑब्जेक्ट को फाइन-ट्यूनिंग करते समय प्रशिक्षित किया जाना चाहिए। सेव्डमॉडल निर्माता यहां कुछ वेरिएबल्स को छोड़ना चुन सकता है जो मूल रूप से यह इंगित करने के लिए प्रशिक्षित किए जाने योग्य थे कि इन्हें फ़ाइन-ट्यूनिंग के दौरान संशोधित नहीं किया जाना चाहिए।

    खाली होने पर यह सूची छोड़ी जा सकती है, विशेष रूप से, यदि सेव्डमॉडल फाइन-ट्यूनिंग का समर्थन नहीं करता है।

  • regularization_losses : tf.फ़ंक्शनों की एक सूची, प्रत्येक शून्य इनपुट लेता है और एक एकल स्केलर फ़्लोट टेंसर लौटाता है। फाइन-ट्यूनिंग के लिए, सेव्डमॉडल उपयोगकर्ता को इन्हें नुकसान में अतिरिक्त नियमितीकरण शर्तों के रूप में शामिल करने की सलाह दी जाती है (आगे स्केलिंग के बिना सबसे सरल मामले में)। आमतौर पर, इनका उपयोग वजन नियमित करने वालों को दर्शाने के लिए किया जाता है। (इनपुट की कमी के कारण, ये tf.functions गतिविधि नियमितकर्ताओं को व्यक्त नहीं कर सकते हैं।)

    खाली होने पर इस सूची को छोड़ा जा सकता है, विशेष रूप से, यदि सेव्डमॉडल फाइन-ट्यूनिंग का समर्थन नहीं करता है या वजन नियमितीकरण निर्धारित नहीं करना चाहता है।

__call__ फ़ंक्शन

एक पुनर्स्थापित SaveModel obj एक obj.__call__ विशेषता है जो एक पुनर्स्थापित tf.function है और obj निम्नानुसार कॉल करने की अनुमति देता है।

सारांश (छद्म कोड):

outputs = obj(inputs, trainable=..., **kwargs)

बहस

तर्क इस प्रकार हैं.

  • SaveModel के इनपुट सक्रियणों के एक बैच के साथ एक स्थितीय, आवश्यक तर्क है। इसका प्रकार एक है

    • एकल इनपुट के लिए एक एकल टेंसर,
    • अनाम इनपुट के क्रमबद्ध अनुक्रम के लिए टेंसर की एक सूची,
    • इनपुट नामों के एक विशेष सेट द्वारा कुंजीबद्ध टेंसर का एक निर्देश।

    (इस इंटरफ़ेस के भविष्य के संशोधन अधिक सामान्य घोंसले की अनुमति दे सकते हैं।) सेव्डमॉडल निर्माता उनमें से एक और टेंसर आकार और डीटाइप को चुनता है। जहां उपयोगी हो, आकार के कुछ आयाम अपरिभाषित होने चाहिए (विशेषकर बैच आकार)।

  • एक वैकल्पिक कीवर्ड तर्क training हो सकता है जो पायथन बूलियन, True या False को स्वीकार करता है। डिफॉल्ट False है । यदि मॉडल फाइन-ट्यूनिंग का समर्थन करता है, और यदि इसकी गणना दोनों के बीच भिन्न होती है (उदाहरण के लिए, ड्रॉपआउट और बैच सामान्यीकरण में), तो यह अंतर इस तर्क के साथ लागू किया जाता है। अन्यथा, यह तर्क अनुपस्थित हो सकता है.

    यह आवश्यक नहीं है कि __call__ टेंसर-मूल्यवान training तर्क को स्वीकार करे। यदि आवश्यक हो तो उनके बीच प्रेषण के लिए tf.cond() उपयोग करना कॉलर पर निर्भर करता है।

  • सेव्डमॉडल निर्माता विशेष नामों के अधिक वैकल्पिक kwargs स्वीकार करना चुन सकता है।

    • टेन्सर-मूल्यवान तर्कों के लिए, सेव्डमॉडल निर्माता उनके अनुमेय dtypes और आकृतियों को परिभाषित करता है। tf.function एक तर्क पर पायथन डिफ़ॉल्ट मान स्वीकार करता है जिसे tf.TensorSpec इनपुट के साथ ट्रेस किया जाता है। ऐसे तर्कों का उपयोग __call__ (उदाहरण के लिए, ड्रॉपआउट दर) में शामिल संख्यात्मक हाइपरपैरामीटर के अनुकूलन की अनुमति देने के लिए किया जा सकता है।

    • पायथन-मूल्यवान तर्कों के लिए, सेव्डमॉडल निर्माता उनके अनुमेय मूल्यों को परिभाषित करता है। इस तरह के तर्कों का उपयोग ट्रेस किए गए फ़ंक्शन में अलग-अलग विकल्प बनाने के लिए झंडे के रूप में किया जा सकता है (लेकिन निशानों के संयुक्त विस्फोट पर ध्यान दें)।

पुनर्स्थापित __call__ फ़ंक्शन को तर्कों के सभी अनुमत संयोजनों के लिए निशान प्रदान करना होगा। True और False के बीच फ़्लिपिंग training से तर्कों की स्वीकार्यता में बदलाव नहीं होना चाहिए।

परिणाम

obj कॉल करने से outputs हो सकते हैं

  • एकल आउटपुट के लिए एक एकल टेंसर,
  • अनाम आउटपुट के क्रमबद्ध अनुक्रम के लिए टेंसर की एक सूची,
  • आउटपुट नामों के एक विशेष सेट द्वारा कुंजीबद्ध टेंसर का एक निर्देश।

(इस इंटरफ़ेस के भविष्य के संशोधन अधिक सामान्य घोंसले की अनुमति दे सकते हैं।) पायथन-मूल्य वाले क्वार्ग के आधार पर रिटर्न प्रकार भिन्न हो सकता है। यह झंडों को अतिरिक्त आउटपुट उत्पन्न करने की अनुमति देता है। सेव्डमॉडल निर्माता आउटपुट dtypes और आकृतियों और इनपुट पर उनकी निर्भरता को परिभाषित करता है।

नामित कॉलेबल्स

एक पुन: प्रयोज्य सेव्डमॉडल ऊपर वर्णित तरीके से कई मॉडल टुकड़े प्रदान कर सकता है, उन्हें नामित उप-वस्तुओं में डालकर, उदाहरण के लिए, obj.foo , obj.bar इत्यादि। प्रत्येक सबऑब्जेक्ट एक __call__ विधि और उस मॉडल टुकड़े के लिए विशिष्ट चर आदि के बारे में सहायक विशेषताएँ प्रदान करता है। उपरोक्त उदाहरण के लिए, obj.foo.__call__ , obj.foo.variables इत्यादि होंगे।

ध्यान दें कि यह इंटरफ़ेस किसी नंगे tf.function को सीधे tf.foo के रूप में जोड़ने के दृष्टिकोण को कवर नहीं करता है।

पुन: प्रयोज्य सेव्डमॉडल के उपयोगकर्ताओं से केवल एक स्तर के नेस्टिंग ( obj.bar लेकिन obj.bar.baz नहीं) को संभालने की अपेक्षा की जाती है। (इस इंटरफ़ेस के भविष्य के संशोधनों से गहरी नेस्टिंग की अनुमति मिल सकती है, और यह आवश्यकता समाप्त हो सकती है कि शीर्ष-स्तरीय ऑब्जेक्ट स्वयं कॉल करने योग्य हो।)

अंतिम शब्द

इन-प्रोसेस एपीआई से संबंध

यह दस्तावेज़ एक पायथन क्लास के इंटरफ़ेस का वर्णन करता है जिसमें tf.function और tf.Variable जैसे प्राइमिटिव शामिल हैं जो tf.saved_model.save() और tf.saved_model.load() के माध्यम से क्रमबद्धता के माध्यम से एक राउंड-ट्रिप से बचे रहते हैं। हालाँकि, इंटरफ़ेस पहले से ही मूल ऑब्जेक्ट पर मौजूद था जिसे tf.saved_model.save() को पास कर दिया गया था। उस इंटरफ़ेस का अनुकूलन एक एकल TensorFlow प्रोग्राम के भीतर मॉडल-बिल्डिंग एपीआई में मॉडल के टुकड़ों के आदान-प्रदान को सक्षम बनाता है।