TensorFlow 2 از چند جهت با TF1.x تفاوت اساسی دارد. همچنان میتوانید کد TF1.x اصلاحنشده ( به جز contrib ) را در برابر نصبهای باینری TF2 اجرا کنید:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
با این حال، این رفتارها و APIهای TF2 را اجرا نمی کند و ممکن است با کدهای نوشته شده برای TF2 مطابق انتظار عمل نکند. اگر با رفتارهای TF2 فعال اجرا نمی کنید، در واقع TF1.x را در بالای نصب TF2 اجرا می کنید. راهنمای رفتارهای TF1 در مقابل TF2 را برای جزئیات بیشتر در مورد تفاوت TF2 با TF1.x بخوانید.
این راهنما یک نمای کلی از فرآیند انتقال کد TF1.x به TF2 ارائه می دهد. این به شما امکان میدهد از پیشرفتهای ویژگیهای جدید و آینده بهره ببرید و همچنین کد خود را سادهتر، کارآمدتر و نگهداری آسانتر کنید.
اگر از APIهای سطح بالای tf.keras
استفاده میکنید و به طور انحصاری با model.fit
آموزش میدهید، کد شما باید کم و بیش کاملاً با TF2 سازگار باشد، به جز اخطارهای زیر:
- TF2 نرخ های یادگیری پیش فرض جدیدی برای بهینه ساز Keras دارد.
- TF2 ممکن است "نام" را تغییر داده باشد که معیارها به آن وارد شده اند.
فرآیند مهاجرت TF2
قبل از مهاجرت، با مطالعه راهنما در مورد رفتار و تفاوت های API بین TF1.x و TF2 بیاموزید.
- اسکریپت خودکار را اجرا کنید تا مقداری از استفاده از API TF1.x خود را به
tf.compat.v1
تبدیل کنید. - نمادهای قدیمی
tf.contrib
را حذف کنید ( TF Addons و TF-Slim را بررسی کنید). - گذرهای رو به جلو مدل TF1.x خود را در TF2 با اجرای مشتاقانه فعال کنید.
- کد TF1.x خود را برای حلقه های آموزشی و ذخیره/بارگذاری مدل ها به معادل های TF2 ارتقا دهید.
- (اختیاری) APIهای سازگار با TF2
tf.compat.v1
خود را به APIهای اصطلاحی TF2 منتقل کنید.
بخشهای زیر مراحلی را که در بالا ذکر شد گسترش میدهند.
اسکریپت تبدیل نماد را اجرا کنید
این یک پاس اولیه برای بازنویسی نمادهای کد شما برای اجرا در برابر باینری های TF 2.x انجام می دهد، اما کد شما را به TF 2.x اصطلاحی نمی کند و همچنین کد شما را به طور خودکار با رفتارهای TF2 سازگار نمی کند.
به احتمال زیاد کد شما همچنان از نقاط پایانی tf.compat.v1
برای دسترسی به مکانها، جلسات، مجموعهها و سایر عملکردهای سبک TF1.x استفاده میکند.
راهنما را بخوانید تا درباره بهترین روشهای استفاده از اسکریپت تبدیل نماد اطلاعات بیشتری کسب کنید.
استفاده از tf.contrib
را حذف کنید
ماژول tf.contrib
غروب شده است و چندین زیرماژول آن در هسته TF2 API ادغام شده اند. زیر ماژول های دیگر اکنون به پروژه های دیگری مانند TF IO و TF Addons تبدیل شده اند.
مقدار زیادی کد TF1.x قدیمی از کتابخانه Slim استفاده می کند که با TF1.x به عنوان tf.contrib.layers
بسته بندی شده است. وقتی کد Slim خود را به TF2 منتقل میکنید، استفادههای Slim API خود را تغییر دهید تا به بسته tf-slim pip اشاره کنید. سپس، راهنمای نگاشت مدل را بخوانید تا نحوه تبدیل کد اسلیم را بیاموزید.
از طرف دیگر، اگر از مدلهای از پیش آموزشدیده Slim استفاده میکنید، میتوانید مدلهای از پیش تمرینشده Keras را از tf.keras.applications
یا TF Hub TF2 SavedModel
که از کد اصلی Slim صادر شده است امتحان کنید.
گذرهای رو به جلو مدل TF1.x را با رفتارهای TF2 فعال کنید
ردیابی متغیرها و ضررها
TF2 از مجموعه های جهانی پشتیبانی نمی کند.
اجرای مشتاق در TF2 از API های مبتنی بر مجموعه tf.Graph
پشتیبانی نمی کند. این بر نحوه ساخت و ردیابی متغیرها تأثیر می گذارد.
برای کد TF2 جدید، به جای v1.get_variable
از tf.Variable
و به جای tf.compat.v1.variable_scope
از اشیاء پایتون برای جمع آوری و ردیابی متغیرها استفاده می کنید. به طور معمول این یکی از موارد زیر خواهد بود:
لیستی از متغیرها (مانند tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
را با ویژگی های .variables
و .trainable_variables
اشیاء Layer
، Module
یا Model
جمع آوری کنید.
کلاس های Layer
و Model
چندین ویژگی دیگر را پیاده سازی می کنند که نیاز به مجموعه های سراسری را برطرف می کند. ویژگی .losses
آنها می تواند جایگزینی برای استفاده از مجموعه tf.GraphKeys.LOSSES
باشد.
راهنمای نگاشت مدل را بخوانید تا درباره استفاده از شیم های مدل سازی کد TF2 برای جاسازی کدهای مبتنی بر get_variable
و variable_scope
موجود خود در Layers
، Models
و Modules
بیشتر بدانید. این به شما امکان می دهد پاس های رو به جلو را با اجرای مشتاقانه بدون بازنویسی عمده فعال کنید.
انطباق با سایر تغییرات رفتاری
اگر راهنمای نگاشت مدل به خودی خود برای به جلو بردن مجوز مدل شما برای اجرای سایر تغییرات رفتاری که ممکن است جزئیات بیشتری باشد کافی نیست، به راهنمای رفتارهای TF1.x در مقابل TF2 مراجعه کنید تا در مورد سایر تغییرات رفتاری و نحوه انطباق با آنها اطلاعات کسب کنید. . همچنین برای جزئیات ، ساخت لایهها و مدلهای جدید را از طریق راهنمای subclassing بررسی کنید.
اعتبارسنجی نتایج شما
راهنمای اعتبارسنجی مدل را برای ابزارهای آسان و راهنمایی در مورد اینکه چگونه میتوانید (به صورت عددی) تأیید کنید که مدل شما در زمانی که اجرای مشتاق فعال است، درست عمل میکند، مراجعه کنید. هنگامی که با راهنمای نقشه برداری مدل جفت می شود، ممکن است این مورد برای شما مفید باشد.
ارتقا آموزش، ارزیابی و کد واردات/صادرات
حلقه های آموزشی TF1.x ساخته شده با tf.estimator.Estimator
به سبک v1.Session
و سایر رویکردهای مبتنی بر مجموعه با رفتارهای جدید TF2 سازگار نیستند. مهم است که تمام کد آموزشی TF1.x خود را منتقل کنید زیرا ترکیب آن با کد TF2 می تواند باعث رفتارهای غیرمنتظره شود.
شما می توانید از بین چندین استراتژی برای این کار انتخاب کنید.
رویکرد بالاترین سطح استفاده از tf.keras
است. توابع سطح بالا در Keras بسیاری از جزئیات سطح پایین را مدیریت می کنند که اگر حلقه آموزشی خود را بنویسید ممکن است به راحتی از دست بدهید. به عنوان مثال، آنها به طور خودکار تلفات منظم سازی را جمع آوری می کنند و هنگام فراخوانی مدل، آرگومان training=True
را تنظیم می کنند.
برای یادگیری نحوه انتقال کد tf.estimator.Estimator
برای استفاده از حلقه های آموزشی وانیلی و سفارشی tf.keras
به راهنمای مهاجرت Estimator مراجعه کنید.
حلقه های آموزشی سفارشی به شما کنترل دقیق تری بر مدل خود می دهد، مانند ردیابی وزن لایه های جداگانه. راهنمای ساخت حلقه های آموزشی را از ابتدا بخوانید تا نحوه استفاده از tf.GradientTape
برای بازیابی وزن مدل و استفاده از آنها برای به روز رسانی مدل را بیاموزید.
بهینه سازهای TF1.x را به بهینه سازهای Keras تبدیل کنید
بهینه سازهای موجود در tf.compat.v1.train
، مانند بهینه ساز Adam و بهینه ساز نزولی گرادیان ، معادل هایی در tf.keras.optimizers
دارند.
جدول زیر به طور خلاصه نحوه تبدیل این بهینه سازهای قدیمی را به معادل های Keras خود نشان می دهد. میتوانید مستقیماً نسخه TF1.x را با نسخه TF2 جایگزین کنید، مگر اینکه مراحل اضافی (مانند بهروزرسانی نرخ یادگیری پیشفرض ) مورد نیاز باشد.
توجه داشته باشید که تبدیل بهینه سازهای شما ممکن است نقاط بازرسی قدیمی را ناسازگار کند .
TF1.x | TF2 | مراحل اضافی |
---|---|---|
«tf.v1.train.GradientDescentOptimizer». | tf.keras.optimizers.SGD | هیچ کدام |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | آرگومان «تحرک» را درج کنید |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | آرگومان های «بتا1» و «بتا2» را به «بتا_1» و «بتا_2» تغییر نام دهید |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | آرگومان "decay" را به "rho" تغییر نام دهید |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | هیچ کدام |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | هیچ کدام |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | آرگومان های "accum_name" و "linear_name" را حذف کنید |
«tf.contrib.AdamaxOptimizer». | tf.keras.optimizers.Adamax | آرگومانهای «beta1» و «beta2» را به «beta_1» و «beta_2» تغییر نام دهید |
`tf.contrib.nadam` | tf.keras.optimizers.Nadam | آرگومانهای «beta1» و «beta2» را به «beta_1» و «beta_2» تغییر نام دهید |
خطوط لوله ورودی داده را ارتقا دهید
راه های زیادی برای تغذیه داده ها به مدل tf.keras
وجود دارد. آنها مولدهای پایتون و آرایه های Numpy را به عنوان ورودی می پذیرند.
روش توصیه شده برای تغذیه داده ها به یک مدل، استفاده از بسته tf.data
است که شامل مجموعه ای از کلاس های عملکرد بالا برای دستکاری داده ها است. dataset
متعلق به tf.data
کارآمد، گویا و به خوبی با 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
را برای اطلاعات بیشتر در مورد انتقال SavedModel
در TF1.x به TF2 بخوانید. به طور کلی،
- TF1.x saved_models در TF2 کار می کنند.
- اگر همه عملیات ها پشتیبانی شوند، TF2 saved_models در TF1.x کار می کنند.
همچنین برای اطلاعات بیشتر در مورد کار با اشیاء Graph.pb
و Graph.pbtxt
به بخش GraphDef
در راهنمای مهاجرت SavedModel
مراجعه کنید.
(اختیاری) نمادهای tf.compat.v1
را خارج کنید
ماژول tf.compat.v1
حاوی API کامل TF1.x با معنای اصلی آن است.
حتی پس از انجام مراحل بالا و دریافت کدی که کاملاً با همه رفتارهای TF2 سازگار است، احتمالاً ممکن است موارد زیادی از apis compat.v1
که اتفاقاً با TF2 سازگار هستند، ذکر شود. شما باید از استفاده از این apiهای قدیمی compat.v1
برای هر کد جدیدی که می نویسید خودداری کنید، اگرچه آنها برای کدهای قبلاً نوشته شده شما به کار خود ادامه می دهند.
با این حال، میتوانید استفادههای موجود را به APIهای غیر قدیمی TF2 منتقل کنید. رشتههای اسناد نمادهای جداگانه compat.v1
اغلب نحوه انتقال آنها به APIهای غیر قدیمی TF2 را توضیح میدهند. علاوه بر این، بخش راهنمای نقشهبرداری مدل در مورد مهاجرت تدریجی به APIهای اصطلاحی TF2 نیز ممکن است به این امر کمک کند.
منابع و مطالعه بیشتر
همانطور که قبلا ذکر شد، انتقال تمام کدهای TF1.x به TF2 روش خوبی است. برای کسب اطلاعات بیشتر، راهنماهای بخش مهاجرت به TF2 راهنمای TensorFlow را بخوانید.