TF1 हब प्रारूप

2018 में अपने लॉन्च पर, TensorFlow हब ने एक ही प्रकार की संपत्ति की पेशकश की: TensorFlow 1 प्रोग्राम में आयात के लिए TF1 हब प्रारूप।

यह पृष्ठ हब के साथ TF1 (या TF1 की TF1 संगतता मोड) में TF1 हब स्वरूप का उपयोग करने का तरीका बताता है। hub.Module वर्ग और संबद्ध API। (सामान्य उपयोग एक tf.Graph बनाने के लिए है, संभवतः एक TF1 Estimator के अंदर, TF1 हब प्रारूप में tf.compat.layers या tf.layers के साथ एक या अधिक मॉडल को मिलाकर)।

TensorFlow 2 (TF1 संगतता मोड के बाहर) के उपयोगकर्ताओं को नए API का उपयोग hub.load() या hub.KerasLayer के साथ करना चाहिए। नया एपीआई नए TF2 SavedModel एसेट टाइप को लोड करता है, लेकिन TF1 हब फॉर्मेट को TF2 में लोड करने के लिए सीमित सपोर्ट भी है।

TF1 हब प्रारूप में एक मॉडल का उपयोग करना

TF1 हब प्रारूप में एक मॉडल को इंस्टेंट करना

TF1 हब प्रारूप में एक मॉडल को एक हब बनाकर एक hub.Module प्रोग्राम में आयात किया जाता है। एक स्ट्रिंग से उसके URL या फाइल सिस्टम पथ के साथ मॉड्यूल ऑब्जेक्ट, जैसे:

m = hub.Module("path/to/a/module_dir")

यह मॉड्यूल के चर को वर्तमान TensorFlow ग्राफ़ में जोड़ता है। उनके प्रारंभकर्ताओं को चलाने से डिस्क से उनके पूर्व-प्रशिक्षित मान पढ़ जाएंगे। इसी तरह, टेबल और अन्य राज्य को ग्राफ में जोड़ा जाता है।

कैशिंग मॉड्यूल

URL से मॉड्यूल बनाते समय, मॉड्यूल सामग्री को स्थानीय सिस्टम अस्थायी निर्देशिका में डाउनलोड और कैश किया जाता है। जिस स्थान पर मॉड्यूल कैश किए जाते हैं, उसे TFHUB_CACHE_DIR पर्यावरण चर का उपयोग करके ओवरराइड किया जा सकता है। विवरण के लिए, कैशिंग देखें।

एक मॉड्यूल लागू करना

एक बार इंस्टेंट होने के बाद, मॉड्यूल m को शून्य या अधिक बार कहा जा सकता है, जैसे कि टेंसर इनपुट से लेकर टेंसर आउटपुट तक पायथन फ़ंक्शन:

y = m(x)

ऐसी प्रत्येक कॉल x से y की गणना करने के लिए वर्तमान TensorFlow ग्राफ़ में संचालन जोड़ती है। यदि इसमें प्रशिक्षित भार वाले चर शामिल हैं, तो इन्हें सभी अनुप्रयोगों के बीच साझा किया जाता है।

मॉड्यूल एक से अधिक तरीकों से लागू होने की अनुमति देने के लिए कई नामित हस्ताक्षरों को परिभाषित कर सकते हैं (इसी तरह पायथन ऑब्जेक्ट्स के तरीके कैसे हैं)। एक मॉड्यूल के दस्तावेज़ में उपलब्ध हस्ताक्षरों का वर्णन होना चाहिए। उपरोक्त कॉल "default" नाम के हस्ताक्षर को लागू करता है। किसी भी हस्ताक्षर को उसके नाम को वैकल्पिक signature= तर्क में पास करके चुना जा सकता है।

यदि एक हस्ताक्षर में कई इनपुट हैं, तो उन्हें हस्ताक्षर द्वारा परिभाषित कुंजियों के साथ एक निर्देश के रूप में पारित किया जाना चाहिए। इसी तरह, यदि किसी हस्ताक्षर में कई आउटपुट हैं, तो उन्हें हस्ताक्षर द्वारा परिभाषित कुंजियों के तहत as_dict=True पास करके एक ताना के रूप में पुनर्प्राप्त किया जा सकता है (कुंजी "default" एकल आउटपुट के लिए है यदि as_dict=False )। तो मॉड्यूल लागू करने का सबसे सामान्य रूप इस तरह दिखता है:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

एक कॉलर को हस्ताक्षर द्वारा परिभाषित सभी इनपुट की आपूर्ति करनी चाहिए, लेकिन मॉड्यूल के सभी आउटपुट का उपयोग करने की कोई आवश्यकता नहीं है। TensorFlow मॉड्यूल के केवल उन हिस्सों को चलाएगा जो tf.Session.run() में लक्ष्य की निर्भरता के रूप में समाप्त होते हैं। दरअसल, मॉड्यूल प्रकाशक मुख्य आउटपुट के साथ उन्नत उपयोगों (जैसे मध्यवर्ती परतों की सक्रियता) के लिए विभिन्न आउटपुट प्रदान करना चुन सकते हैं। मॉड्यूल उपभोक्ताओं को अतिरिक्त आउटपुट को इनायत से संभालना चाहिए।

वैकल्पिक मॉड्यूल की कोशिश कर रहा है

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

इसके लिए, हम लोकप्रिय कार्यों के लिए अनुशंसित सामान्य हस्ताक्षरों का एक संग्रह बनाए रखते हैं।

एक नया मॉड्यूल बनाना

संगतता नोट

TF1 हब प्रारूप TensorFlow 1 की ओर तैयार है। यह TensorFlow 2 में केवल आंशिक रूप से TF हब द्वारा समर्थित है। कृपया इसके बजाय नए TF2 सहेजे गए मॉडल प्रारूप में प्रकाशित करने पर विचार करें।

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

सामान्य पहूंच

एक नया मॉड्यूल परिभाषित करने के लिए, एक प्रकाशक मॉड्यूल_fn फ़ंक्शन के साथ module_fn hub.create_module_spec() को कॉल करता है। यह फ़ंक्शन कॉलर द्वारा आपूर्ति किए जाने वाले इनपुट के लिए tf.placeholder() का उपयोग करके मॉड्यूल की आंतरिक संरचना का प्रतिनिधित्व करने वाला एक ग्राफ बनाता है। फिर यह hub.add_signature(name, inputs, outputs) एक या अधिक बार कॉल करके हस्ताक्षर को परिभाषित करता है।

उदाहरण के लिए:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

एक विशेष TensorFlow ग्राफ के भीतर एक मॉड्यूल ऑब्जेक्ट को इंस्टेंट करने के लिए, एक पथ के बजाय, hub.create_module_spec() के परिणाम का उपयोग किया जा सकता है। ऐसे मामले में, कोई चेकपॉइंट नहीं है, और मॉड्यूल इंस्टेंस इसके बजाय वेरिएबल इनिशियलाइज़र का उपयोग करेगा।

किसी भी मॉड्यूल इंस्टेंस को उसके export(path, session) विधि के माध्यम से डिस्क पर क्रमबद्ध किया जा सकता है। एक मॉड्यूल का निर्यात session में अपने चर की वर्तमान स्थिति के साथ पारित पथ में इसकी परिभाषा को क्रमबद्ध करता है। इसका उपयोग पहली बार किसी मॉड्यूल को निर्यात करते समय, साथ ही साथ ठीक ट्यून किए गए मॉड्यूल को निर्यात करते समय किया जा सकता है।

TensorFlow अनुमानकों के साथ संगतता के लिए, हब. hub.LatestModuleExporter नवीनतम चेकपॉइंट से मॉड्यूल निर्यात करता है, जैसे tf.estimator.LatestExporter पूरे मॉडल को नवीनतम चेकपॉइंट से निर्यात करता है।

मॉड्यूल प्रकाशकों को जब भी संभव हो एक सामान्य हस्ताक्षर लागू करना चाहिए, ताकि उपभोक्ता आसानी से मॉड्यूल का आदान-प्रदान कर सकें और अपनी समस्या के लिए सबसे अच्छा एक ढूंढ सकें।

वास्तविक उदाहरण

एक सामान्य टेक्स्ट एम्बेडिंग प्रारूप से मॉड्यूल कैसे बनाया जाए, इसके वास्तविक दुनिया के उदाहरण के लिए हमारे टेक्स्ट एम्बेडिंग मॉड्यूल निर्यातक पर एक नज़र डालें।

फ़ाइन ट्यूनिंग

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

उपभोक्ताओं के लिए

फाइन-ट्यूनिंग को सक्षम करने के लिए, मॉड्यूल को hub.Module(..., trainable=True) के साथ इंस्टेंट करें ताकि इसके वेरिएबल्स को प्रशिक्षित किया जा सके और टेंसरफ्लो के REGULARIZATION_LOSSES को आयात किया जा सके। यदि मॉड्यूल में कई ग्राफ़ वेरिएंट हैं, तो प्रशिक्षण के लिए उपयुक्त एक को चुनना सुनिश्चित करें। आमतौर पर, यह {"train"} टैग वाला होता है।

एक प्रशिक्षण व्यवस्था चुनें जो पूर्व-प्रशिक्षित वजन को बर्बाद न करे, उदाहरण के लिए, खरोंच से प्रशिक्षण की तुलना में कम सीखने की दर।

प्रकाशकों के लिए

उपभोक्ताओं के लिए फ़ाइन-ट्यूनिंग को आसान बनाने के लिए, कृपया निम्न बातों का ध्यान रखें:

  • फाइन-ट्यूनिंग को नियमित करने की आवश्यकता है। आपका मॉड्यूल REGULARIZATION_LOSSES संग्रह के साथ निर्यात किया जाता है, जो कि tf.layers.dense(..., kernel_regularizer=...) आदि की आपकी पसंद को tf.losses.get_regularization_losses() से उपभोक्ता को प्राप्त होने वाली सामग्री में tf.losses.get_regularization_losses() है। L1/L2 नियमितीकरण हानियों को परिभाषित करने के इस तरीके को प्राथमिकता दें।

  • प्रकाशक मॉडल में, tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer और अन्य समीपस्थ अनुकूलक के l1_ और l2_regularization_strength मापदंडों के माध्यम से L1/L2 नियमितीकरण को परिभाषित करने से बचें। इन्हें मॉड्यूल के साथ निर्यात नहीं किया जाता है, और वैश्विक स्तर पर नियमितीकरण की ताकत निर्धारित करना उपभोक्ता के लिए उपयुक्त नहीं हो सकता है। वाइड (यानी विरल लीनियर) या वाइड एंड डीप मॉडल में L1 नियमितीकरण को छोड़कर, इसके बजाय व्यक्तिगत नियमितीकरण नुकसान का उपयोग करना संभव होना चाहिए।

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