Google I/O में ट्यूनिंग के लिए धन्यवाद। मांग पर सभी सत्र देखें मांग पर देखें

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

परिचय

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

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

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

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

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

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

मॉडल-बिल्डिंग लाइब्रेरी से संबंध

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

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

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

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

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

गुण

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

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

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

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

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

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

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

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

__call__ फ़ंक्शन

एक पुनर्स्थापित सहेजे गए मॉडल obj में एक obj.__call__ विशेषता है जो एक पुनर्स्थापित टीएफ.फंक्शन है और obj को निम्नानुसार कॉल करने की अनुमति देता है।

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

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

बहस

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

  • सहेजे गए मॉडल के इनपुट सक्रियण के बैच के साथ एक स्थितीय, आवश्यक तर्क है। इसका प्रकार एक है

    • एकल इनपुट के लिए एकल टेन्सर,
    • अनाम निविष्टियों के क्रमित अनुक्रम के लिए टेंसरों की एक सूची,
    • इनपुट नामों के एक विशेष सेट द्वारा की गई टेंसरों की एक तानाशाही।

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

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

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

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

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

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

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

परिणाम

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

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

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

नामांकित कॉल करने योग्य

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

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

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

अंतिम शब्द

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

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