2018 में अपने लॉन्च के समय, TensorFlow हब ने एक ही प्रकार की संपत्ति की पेशकश की: TensorFlow 1 कार्यक्रमों में आयात के लिए TF1 हब प्रारूप।
यह पृष्ठ बताता है कि hub.Module
क्लास और संबंधित एपीआई के साथ टीएफ1 (या टीएफ2 का टीएफ1 संगतता मोड) में टीएफ1 हब प्रारूप का उपयोग कैसे करें। (सामान्य उपयोग tf.compat.layers
या tf.layers
के साथ TF1 हब प्रारूप में एक या अधिक मॉडलों को जोड़कर, संभवतः TF1 Estimator
के अंदर एक tf.Graph
बनाना है)।
TensorFlow 2 (TF1 संगतता मोड के बाहर) के उपयोगकर्ताओं को hub.load()
या hub.KerasLayer
के साथ नए API का उपयोग करना होगा। नया एपीआई नए टीएफ2 सेव्डमॉडल एसेट प्रकार को लोड करता है, लेकिन टीएफ1 हब फॉर्मेट को टीएफ2 में लोड करने के लिए इसमें सीमित समर्थन भी है।
TF1 हब प्रारूप में एक मॉडल का उपयोग करना
TF1 हब प्रारूप में एक मॉडल को इंस्टेंट करना
TF1 हब प्रारूप में एक मॉडल को उसके URL या फ़ाइल सिस्टम पथ के साथ एक स्ट्रिंग से hub.Module
ऑब्जेक्ट बनाकर TensorFlow प्रोग्राम में आयात किया जाता है, जैसे:
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 SavedModel प्रारूप में प्रकाशन पर विचार करें।
TF1 हब प्रारूप वाक्य-विन्यास स्तर (समान फ़ाइल नाम और प्रोटोकॉल संदेश) पर TensorFlow 1 के सेव्डमॉडल प्रारूप के समान है, लेकिन मॉड्यूल के पुन: उपयोग, संरचना और पुन: प्रशिक्षण (उदाहरण के लिए, संसाधन प्रारंभकर्ताओं के अलग-अलग भंडारण, अलग-अलग टैगिंग) की अनुमति देने के लिए शब्दार्थ रूप से भिन्न है। मेटाग्राफ के लिए कन्वेंशन)। डिस्क पर उन्हें अलग बताने का सबसे आसान तरीका tfhub_module.pb
फ़ाइल की उपस्थिति या अनुपस्थिति है।
सामान्य दृष्टिकोण
एक नए मॉड्यूल को परिभाषित करने के लिए, एक प्रकाशक एक फ़ंक्शन 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 Estimator के साथ अनुकूलता के लिए, hub.LatestModuleExporter
नवीनतम चेकपॉइंट से मॉड्यूल निर्यात करता है, ठीक वैसे ही जैसे tf.estimator.LatestExporter
नवीनतम चेकपॉइंट से संपूर्ण मॉडल निर्यात करता है।
जब संभव हो तो मॉड्यूल प्रकाशकों को एक सामान्य हस्ताक्षर लागू करना चाहिए, ताकि उपभोक्ता आसानी से मॉड्यूल का आदान-प्रदान कर सकें और अपनी समस्या के लिए सबसे अच्छा मॉड्यूल ढूंढ सकें।
वास्तविक उदाहरण
सामान्य टेक्स्ट एम्बेडिंग प्रारूप से मॉड्यूल बनाने के वास्तविक दुनिया के उदाहरण के लिए हमारे टेक्स्ट एम्बेडिंग मॉड्यूल निर्यातक पर एक नज़र डालें।
फ़ाइन ट्यूनिंग
किसी आयातित मॉड्यूल के वेरिएबल्स को उसके आस-पास के मॉडल के वेरिएबल्स के साथ प्रशिक्षित करना फाइन-ट्यूनिंग कहलाता है। फ़ाइन-ट्यूनिंग से बेहतर गुणवत्ता प्राप्त हो सकती है, लेकिन नई जटिलताएँ जुड़ जाती हैं। हम उपभोक्ताओं को सलाह देते हैं कि वे सरल गुणवत्ता वाले बदलावों की खोज के बाद ही फाइन-ट्यूनिंग पर ध्यान दें, और केवल तभी जब मॉड्यूल प्रकाशक इसकी अनुशंसा करता है।
उपभोक्ताओं के लिए
फ़ाइन-ट्यूनिंग सक्षम करने के लिए, मॉड्यूल को hub.Module(..., trainable=True)
के साथ इंस्टेंट करें ताकि इसके वेरिएबल्स को प्रशिक्षित किया जा सके और TensorFlow के REGULARIZATION_LOSSES
आयात किया जा सके। यदि मॉड्यूल में कई ग्राफ़ वेरिएंट हैं, तो प्रशिक्षण के लिए उपयुक्त एक को चुनना सुनिश्चित करें। आमतौर पर, यह टैग {"train"}
वाला होता है।
ऐसी प्रशिक्षण व्यवस्था चुनें जो पूर्व-प्रशिक्षित भार को बर्बाद न करे, उदाहरण के लिए, शुरुआत से प्रशिक्षण की तुलना में सीखने की दर कम हो।
प्रकाशकों के लिए
उपभोक्ताओं के लिए फ़ाइन-ट्यूनिंग को आसान बनाने के लिए, कृपया निम्नलिखित का ध्यान रखें:
फाइन-ट्यूनिंग को नियमितीकरण की आवश्यकता है। आपका मॉड्यूल
REGULARIZATION_LOSSES
संग्रह के साथ निर्यात किया जाता है, जो आपकी पसंदtf.layers.dense(..., kernel_regularizer=...)
आदि को उपभोक्ता कोtf.losses.get_regularization_losses()
से प्राप्त होने वाली राशि में डालता है। एल1/एल2 नियमितीकरण हानियों को परिभाषित करने के इस तरीके को प्राथमिकता दें।प्रकाशक मॉडल में,
tf.train.FtrlOptimizer
,tf.train.ProximalGradientDescentOptimizer
और अन्य समीपस्थ ऑप्टिमाइज़र केl1_
औरl2_regularization_strength
पैरामीटर के माध्यम से L1/L2 नियमितीकरण को परिभाषित करने से बचें। इन्हें मॉड्यूल के साथ निर्यात नहीं किया जाता है, और वैश्विक स्तर पर नियमितीकरण की ताकत निर्धारित करना उपभोक्ता के लिए उपयुक्त नहीं हो सकता है। विस्तृत (यानी विरल रैखिक) या विस्तृत और गहरे मॉडल में एल1 नियमितीकरण को छोड़कर, इसके बजाय व्यक्तिगत नियमितीकरण घाटे का उपयोग करना संभव होना चाहिए।यदि आप ड्रॉपआउट, बैच सामान्यीकरण, या इसी तरह की प्रशिक्षण तकनीकों का उपयोग करते हैं, तो उनके हाइपरपैरामीटर को उन मानों पर सेट करें जो कई अपेक्षित उपयोगों के लिए समझ में आते हैं। ड्रॉपआउट दर को लक्ष्य समस्या की ओवरफिटिंग की प्रवृत्ति के अनुसार समायोजित करना पड़ सकता है। बैच सामान्यीकरण में, गति (जिसे क्षय गुणांक भी कहा जाता है) इतना छोटा होना चाहिए कि छोटे डेटासेट और/या बड़े बैचों के साथ फ़ाइन-ट्यूनिंग सक्षम हो सके। उन्नत उपभोक्ताओं के लिए, एक हस्ताक्षर जोड़ने पर विचार करें जो महत्वपूर्ण हाइपरपैरामीटर पर नियंत्रण को उजागर करता है।