tf1.x -& gt ؛ نمای کلی مهاجرت TF2

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

قبل از مهاجرت، با مطالعه راهنما در مورد رفتار و تفاوت های API بین TF1.x و TF2 بیاموزید.

  1. اسکریپت خودکار را اجرا کنید تا مقداری از استفاده از API TF1.x خود را به tf.compat.v1 تبدیل کنید.
  2. نمادهای قدیمی tf.contrib را حذف کنید ( TF Addons و TF-Slim را بررسی کنید).
  3. گذرهای رو به جلو مدل TF1.x خود را در TF2 با اجرای مشتاقانه فعال کنید.
  4. کد TF1.x خود را برای حلقه های آموزشی و ذخیره/بارگذاری مدل ها به معادل های TF2 ارتقا دهید.
  5. (اختیاری) 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 را بخوانید.