TensorFlow 2 कई मायनों में TF1.x से मौलिक रूप से भिन्न है। आप अभी भी TF2 बाइनरी इंस्टॉलेशन के विरुद्ध अनमॉडिफाइड TF1.x कोड ( contrib को छोड़कर ) चला सकते हैं:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
हालाँकि, यह TF2 व्यवहार और API नहीं चला रहा है, और TF2 के लिए लिखे गए कोड के साथ अपेक्षा के अनुरूप काम नहीं कर सकता है। यदि आप सक्रिय TF2 व्यवहार के साथ नहीं चल रहे हैं, तो आप प्रभावी रूप से TF2 इंस्टॉलेशन के शीर्ष पर TF1.x चला रहे हैं। TF2, TF1.x से किस प्रकार भिन्न है, इसके बारे में अधिक जानकारी के लिए TF1 बनाम TF2 व्यवहार मार्गदर्शिका पढ़ें।
यह मार्गदर्शिका आपके TF1.x कोड को TF2 में स्थानांतरित करने की प्रक्रिया का अवलोकन प्रदान करती है। यह आपको नए और भविष्य के फीचर सुधारों का लाभ उठाने में सक्षम बनाता है और आपके कोड को सरल, अधिक प्रदर्शन करने वाला और बनाए रखने में आसान बनाता है।
यदि आप tf.keras
के उच्च स्तरीय API का उपयोग कर रहे हैं और विशेष रूप से model.fit
के साथ प्रशिक्षण ले रहे हैं, तो आपका कोड निम्नलिखित चेतावनियों को छोड़कर कमोबेश TF2 के साथ पूरी तरह से संगत होना चाहिए:
- TF2 में केरस ऑप्टिमाइज़र के लिए नई डिफ़ॉल्ट सीखने की दरें हैं।
- हो सकता है कि TF2 ने वह "नाम" बदल दिया हो जिससे मेट्रिक्स लॉग इन होते हैं।
TF2 माइग्रेशन प्रक्रिया
माइग्रेट करने से पहले, गाइड पढ़कर TF1.x और TF2 के बीच व्यवहार और API अंतर के बारे में जानें।
- अपने कुछ TF1.x API उपयोग को
tf.compat.v1
में बदलने के लिए स्वचालित स्क्रिप्ट चलाएँ। - पुराने
tf.contrib
प्रतीक हटाएँ ( TF Addons और TF-Slim जाँचें)। - उत्सुक निष्पादन सक्षम करके अपने TF1.x मॉडल फॉरवर्ड पास को TF2 में चलाएं।
- प्रशिक्षण लूप और मॉडल को सहेजने/लोड करने के लिए अपने TF1.x कोड को TF2 समकक्षों में अपग्रेड करें।
- (वैकल्पिक) अपने TF2-संगत
tf.compat.v1
API को मुहावरेदार TF2 API में माइग्रेट करें।
निम्नलिखित अनुभाग ऊपर उल्लिखित चरणों पर विस्तार करते हैं।
प्रतीक रूपांतरण स्क्रिप्ट चलाएँ
यह TF 2.x बायनेरिज़ के विरुद्ध चलाने के लिए आपके कोड प्रतीकों को फिर से लिखने पर एक प्रारंभिक पास निष्पादित करता है, लेकिन यह आपके कोड को TF 2.x के लिए मुहावरेदार नहीं बनाएगा और न ही यह स्वचालित रूप से आपके कोड को TF2 व्यवहारों के साथ संगत बनाएगा।
आपका कोड संभवतः अभी भी प्लेसहोल्डर, सत्र, संग्रह और अन्य TF1.x-शैली कार्यक्षमता तक पहुंचने के लिए tf.compat.v1
एंडपॉइंट का उपयोग करेगा।
प्रतीक रूपांतरण स्क्रिप्ट का उपयोग करने की सर्वोत्तम प्रथाओं के बारे में अधिक जानने के लिए मार्गदर्शिका पढ़ें।
tf.contrib
का उपयोग हटाएँ
tf.contrib
मॉड्यूल को बंद कर दिया गया है और इसके कई सबमॉड्यूल को कोर TF2 API में एकीकृत किया गया है। अन्य सबमॉड्यूल अब TF IO और TF Addons जैसी अन्य परियोजनाओं में बदल दिए गए हैं।
बड़ी मात्रा में पुराने TF1.x कोड स्लिम लाइब्रेरी का उपयोग करते हैं, जिसे TF1.x के साथ tf.contrib.layers
के रूप में पैक किया गया था। अपने स्लिम कोड को टीएफ2 पर माइग्रेट करते समय, अपने स्लिम एपीआई उपयोग को टीएफ-स्लिम पिप पैकेज पर इंगित करने के लिए स्विच करें। फिर, स्लिम कोड को परिवर्तित करने का तरीका जानने के लिए मॉडल मैपिंग गाइड पढ़ें।
वैकल्पिक रूप से, यदि आप स्लिम पूर्व-प्रशिक्षित मॉडल का उपयोग करते हैं तो आप tf.keras.applications
से केरस के पूर्व-ट्रेम किए गए मॉडल या मूल स्लिम कोड से निर्यात किए गए TF हब के TF2 SavedModel
एस को आज़माने पर विचार कर सकते हैं।
TF1.x मॉडल फॉरवर्ड पास को TF2 व्यवहार सक्षम करके चलाएं
परिवर्तन और हानियों को ट्रैक करें
TF2 वैश्विक संग्रह का समर्थन नहीं करता.
TF2 में उत्सुक निष्पादन tf.Graph
संग्रह-आधारित API का समर्थन नहीं करता है। यह इस बात को प्रभावित करता है कि आप वेरिएबल का निर्माण और ट्रैक कैसे करते हैं।
नए TF2 कोड के लिए आप v1.get_variable
के बजाय tf.Variable
उपयोग करेंगे और tf.compat.v1.variable_scope
के बजाय वेरिएबल्स को इकट्ठा करने और ट्रैक करने के लिए Python ऑब्जेक्ट का उपयोग करेंगे। आमतौर पर यह इनमें से एक होगा:
Layer
, Module
या Model
ऑब्जेक्ट के .variables
और .trainable_variables
विशेषताओं के साथ वेरिएबल्स (जैसे tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) की समग्र सूचियाँ।
Layer
और Model
वर्ग कई अन्य गुणों को लागू करते हैं जो वैश्विक संग्रह की आवश्यकता को दूर करते हैं। उनकी .losses
संपत्ति tf.GraphKeys.LOSSES
संग्रह का उपयोग करने के लिए प्रतिस्थापन हो सकती है।
Layers
, Models
और Modules
के अंदर अपने मौजूदा get_variable
और variable_scope
आधारित कोड को एम्बेड करने के लिए TF2 कोड मॉडलिंग शिम्स का उपयोग करने के बारे में अधिक जानने के लिए मॉडल मैपिंग गाइड पढ़ें। यह आपको बड़े पुनर्लेखन के बिना उत्सुक निष्पादन सक्षम के साथ फॉरवर्ड पास निष्पादित करने देगा।
अन्य व्यवहार परिवर्तनों को अपनाना
यदि मॉडल मैपिंग गाइड आपके मॉडल को आगे बढ़ाने के लिए अन्य व्यवहार परिवर्तनों को चलाने के लिए अपर्याप्त है, जो अधिक विवरण हो सकते हैं, तो अन्य व्यवहार परिवर्तनों के बारे में जानने के लिए TF1.x बनाम TF2 व्यवहार पर गाइड देखें और आप उन्हें कैसे अनुकूलित कर सकते हैं . विवरण के लिए उपवर्गीकरण मार्गदर्शिका के माध्यम से नई परतें और मॉडल बनाना भी देखें।
आपके परिणामों का सत्यापन किया जा रहा है
आसान टूल और मार्गदर्शन के लिए मॉडल सत्यापन मार्गदर्शिका देखें कि आप कैसे (संख्यात्मक रूप से) सत्यापित कर सकते हैं कि उत्सुक निष्पादन सक्षम होने पर आपका मॉडल सही ढंग से व्यवहार कर रहा है। मॉडल मैपिंग गाइड के साथ जोड़े जाने पर आपको यह विशेष रूप से उपयोगी लग सकता है।
प्रशिक्षण, मूल्यांकन और आयात/निर्यात कोड को उन्नत करें
v1.Session
-style tf.estimator.Estimator
s और अन्य संग्रह-आधारित दृष्टिकोणों के साथ निर्मित TF1.x प्रशिक्षण लूप TF2 के नए व्यवहारों के साथ संगत नहीं हैं। यह महत्वपूर्ण है कि आप अपने सभी TF1.x प्रशिक्षण कोड को माइग्रेट करें क्योंकि इसे TF2 कोड के साथ संयोजित करने से अप्रत्याशित व्यवहार हो सकता है।
ऐसा करने के लिए आप कई रणनीतियों में से चुन सकते हैं।
उच्चतम-स्तरीय दृष्टिकोण tf.keras
उपयोग करना है। केरस में उच्च स्तरीय फ़ंक्शन बहुत से निम्न-स्तरीय विवरणों को प्रबंधित करते हैं जिन्हें यदि आप अपना स्वयं का प्रशिक्षण लूप लिखते हैं तो आसानी से अनदेखा किया जा सकता है। उदाहरण के लिए, वे स्वचालित रूप से नियमितीकरण घाटे को एकत्र करते हैं, और मॉडल को कॉल करते समय training=True
तर्क सेट करते हैं।
यह जानने के लिए एस्टिमेटर माइग्रेशन गाइड देखें कि आप वेनिला और कस्टम tf.keras
प्रशिक्षण लूप का उपयोग करने के लिए tf.estimator.Estimator
के कोड को कैसे माइग्रेट कर सकते हैं।
कस्टम प्रशिक्षण लूप आपको अपने मॉडल पर बेहतर नियंत्रण प्रदान करते हैं जैसे कि व्यक्तिगत परतों के वजन को ट्रैक करना। मॉडल वजन प्राप्त करने के लिए tf.GradientTape
उपयोग कैसे करें और मॉडल को अपडेट करने के लिए उनका उपयोग कैसे करें, यह जानने के लिए स्क्रैच से प्रशिक्षण लूप बनाने पर गाइड पढ़ें।
TF1.x ऑप्टिमाइज़र को केरस ऑप्टिमाइज़र में कनवर्ट करें
tf.compat.v1.train
में ऑप्टिमाइज़र, जैसे एडम ऑप्टिमाइज़र और ग्रेडिएंट डिसेंट ऑप्टिमाइज़र , tf.keras.optimizers
में समकक्ष हैं।
नीचे दी गई तालिका सारांशित करती है कि आप इन लीगेसी ऑप्टिमाइज़र को उनके केरास समकक्षों में कैसे परिवर्तित कर सकते हैं। जब तक अतिरिक्त चरणों (जैसे डिफ़ॉल्ट सीखने की दर को अपडेट करना ) की आवश्यकता न हो, आप TF1.x संस्करण को सीधे TF2 संस्करण से बदल सकते हैं।
ध्यान दें कि आपके ऑप्टिमाइज़र को परिवर्तित करने से पुराने चेकपॉइंट असंगत हो सकते हैं ।
TF1.x | TF2 | अतिरिक्त कदम |
---|---|---|
`tf.v1.train.GradientDescentऑप्टिमाइज़र` | tf.keras.optimizers.SGD | कोई नहीं |
`tf.v1.ट्रेन.मोमेंटमऑप्टिमाइज़र` | tf.keras.optimizers.SGD | `संवेग` तर्क शामिल करें |
`tf.v1.train.Adamऑप्टिमाइज़र` | tf.keras.optimizers.Adam | `बीटा1` और `बीटा2` तर्कों का नाम बदलकर `बीटा_1` और `बीटा_2` करें |
`tf.v1.train.RMSpropऑप्टिमाइज़र` | tf.keras.optimizers.RMSprop | 'क्षय' तर्क का नाम बदलकर 'rho' कर दें |
`tf.v1.train.Adadeltaऑप्टिमाइज़र` | tf.keras.optimizers.Adadelta | कोई नहीं |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | कोई नहीं |
`tf.v1.train.Ftrlऑप्टिमाइज़र` | tf.keras.optimizers.Ftrl | `accum_name` और `linear_name` तर्क हटाएँ |
`tf.contrib.Adamaxऑप्टिमाइज़र` | tf.keras.optimizers.Adamax | `बीटा1` और `बीटा2` तर्कों का नाम बदलकर `बीटा_1` और `बीटा_2` करें |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | `बीटा1` और `बीटा2` तर्कों का नाम बदलकर `बीटा_1` और `बीटा_2` करें |
डेटा इनपुट पाइपलाइनों को अपग्रेड करें
tf.keras
मॉडल में डेटा फ़ीड करने के कई तरीके हैं। वे इनपुट के रूप में पायथन जनरेटर और नम्पी ऐरे को स्वीकार करेंगे।
किसी मॉडल में डेटा फ़ीड करने का अनुशंसित तरीका tf.data
पैकेज का उपयोग करना है, जिसमें डेटा में हेरफेर करने के लिए उच्च प्रदर्शन कक्षाओं का संग्रह शामिल है। tf.data
से संबंधित dataset
कुशल, अभिव्यंजक और TF2 के साथ अच्छी तरह से एकीकृत हैं।
उन्हें सीधे tf.keras.Model.fit
विधि में पारित किया जा सकता है।
model.fit(dataset, epochs=5)
उन्हें सीधे मानक पायथन पर पुनरावृत्त किया जा सकता है:
for example_batch, label_batch in dataset:
break
यदि आप अभी भी tf.queue
उपयोग कर रहे हैं, तो ये अब केवल डेटा-संरचनाओं के रूप में समर्थित हैं, इनपुट पाइपलाइनों के रूप में नहीं।
आपको tf.feature_columns
का उपयोग करने वाले सभी फ़ीचर प्रीप्रोसेसिंग कोड को भी माइग्रेट करना चाहिए। अधिक विवरण के लिए माइग्रेशन मार्गदर्शिका पढ़ें.
मॉडल सहेजना और लोड करना
TF2 ऑब्जेक्ट-आधारित चौकियों का उपयोग करता है। नाम-आधारित TF1.x चेकपॉइंट से माइग्रेट करने के बारे में अधिक जानने के लिए चेकपॉइंट माइग्रेशन गाइड पढ़ें। मुख्य TensorFlow डॉक्स में चेकप्वाइंट गाइड भी पढ़ें।
सहेजे गए मॉडलों के लिए कोई महत्वपूर्ण अनुकूलता संबंधी चिंताएँ नहीं हैं। SavedModel
s को TF1.x से TF2 में माइग्रेट करने के बारे में अधिक जानकारी के लिए SavedModel
गाइड पढ़ें। सामान्य तौर पर,
- TF1.x save_models TF2 में काम करता है।
- यदि सभी ऑप्स समर्थित हैं तो TF2 save_models TF1.x में काम करते हैं।
Graph.pb
और Graph.pbtxt
ऑब्जेक्ट के साथ काम करने के बारे में अधिक जानकारी के लिए SavedModel
माइग्रेशन गाइड में GraphDef
अनुभाग भी देखें।
(वैकल्पिक) tf.compat.v1
प्रतीकों से माइग्रेट करें
tf.compat.v1
मॉड्यूल में संपूर्ण TF1.x API शामिल है, इसके मूल शब्दार्थ के साथ।
उपरोक्त चरणों का पालन करने और सभी TF2 व्यवहारों के साथ पूरी तरह से संगत कोड के साथ समाप्त होने के बाद भी, यह संभव है कि compat.v1
एपीआई के कई उल्लेख हो सकते हैं जो TF2 के साथ संगत होते हैं। आपको अपने द्वारा लिखे गए किसी भी नए कोड के लिए इन लीगेसी compat.v1
एपीआई का उपयोग करने से बचना चाहिए, हालांकि वे आपके पहले से लिखे गए कोड के लिए काम करना जारी रखेंगे।
हालाँकि, आप मौजूदा उपयोगों को गैर-विरासत TF2 API में स्थानांतरित करना चुन सकते हैं। व्यक्तिगत compat.v1
प्रतीकों के डॉकस्ट्रिंग अक्सर समझाएंगे कि उन्हें गैर-विरासत TF2 API में कैसे स्थानांतरित किया जाए। इसके अतिरिक्त, मुहावरेदार टीएफ2 एपीआई में वृद्धिशील माइग्रेशन पर मॉडल मैपिंग गाइड का अनुभाग भी इसमें मदद कर सकता है।
संसाधन और आगे पढ़ना
जैसा कि पहले उल्लेख किया गया है, अपने सभी TF1.x कोड को TF2 में स्थानांतरित करना एक अच्छा अभ्यास है। अधिक जानने के लिए TensorFlow गाइड के माइग्रेट टू TF2 अनुभाग में गाइड पढ़ें।