مهاجرت از TF1 به TF2 با TensorFlow Hub

این صفحه نحوه ادامه استفاده از TensorFlow Hub را در حین انتقال کد TensorFlow از TensorFlow 1 به TensorFlow 2 توضیح می دهد. این راهنمای انتقال کلی TensorFlow را تکمیل می کند.

برای TF2، TF Hub از API قدیمی hub.Module برای ساخت یک tf.compat.v1.Graph مانند tf.contrib.v1.layers جدا شده است. در عوض، اکنون یک hub.KerasLayer برای استفاده در کنار سایر لایه‌های Keras برای ساخت یک tf.keras.Model (معمولاً در محیط اجرای مشتاق جدید TF2) و روش hub.load() زیربنایی آن برای کد TensorFlow سطح پایین وجود دارد.

hub.Module API در کتابخانه tensorflow_hub برای استفاده در TF1 و در حالت سازگاری TF1 TF2 در دسترس است. فقط می تواند مدل ها را در قالب TF1 Hub بارگیری کند.

API جدید hub.load() و hub.KerasLayer برای TensorFlow 1.15 (در حالت اشتیاق و نمودار) و در TensorFlow 2 کار می کند. این API جدید می تواند دارایی های جدید TF2 SavedModel را بارگیری کند، و با محدودیت های ارائه شده در مدل راهنمای سازگاری ، مدل‌های قدیمی در قالب TF1 Hub.

به طور کلی، توصیه می شود تا حد امکان از API جدید استفاده کنید.

خلاصه ای از API جدید

hub.load() تابع سطح پایین جدیدی برای بارگیری SavedModel از TensorFlow Hub (یا سرویس های سازگار) است. tf.saved_model.load() TF2 را می پیچد. راهنمای SavedModel TensorFlow توضیح می‌دهد که با نتیجه چه کاری می‌توانید انجام دهید.

m = hub.load(handle)
outputs = m(inputs)

کلاس hub.KerasLayer hub.load() را فراخوانی می کند و نتیجه را برای استفاده در Keras در کنار سایر لایه های Keras تطبیق می دهد. (حتی ممکن است برای SavedModel های بارگذاری شده که به روش های دیگر استفاده می شوند، یک پوشش مناسب باشد.)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

بسیاری از آموزش ها این API ها را در عمل نشان می دهند. در اینجا چند نمونه آورده شده است:

استفاده از API جدید در آموزش Estimator

اگر از TF2 SavedModel در برآوردگر برای آموزش با سرورهای پارامتر استفاده می کنید (یا در غیر این صورت در جلسه TF1 با متغیرهایی که در دستگاه های راه دور قرار داده شده اند)، باید experimental.share_cluster_devices_in_session را در ConfigProto tf.Session تنظیم کنید، در غیر این صورت با خطا مواجه خواهید شد. مانند "دستگاه اختصاص داده شده "/job:ps/replica:0/task:0/device:CPU:0" با هیچ دستگاهی مطابقت ندارد."

گزینه لازم را می توان مانند تنظیم کرد

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

با شروع با TF2.2، این گزینه دیگر آزمایشی نیست و می توان قطعه .experimental را حذف کرد.

بارگیری مدل های قدیمی در قالب TF1 Hub

ممکن است اتفاق بیفتد که یک TF2 SavedModel جدید هنوز برای مورد استفاده شما در دسترس نیست و باید یک مدل قدیمی را در قالب TF1 Hub بارگیری کنید. با شروع نسخه 0.7 tensorflow_hub ، می‌توانید از مدل قدیمی در قالب TF1 Hub همراه با hub.KerasLayer مانند شکل زیر استفاده کنید:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

علاوه بر این KerasLayer توانایی تعیین tags ، signature ، output_key و signature_outputs_as_dict را برای استفاده‌های خاص‌تر از مدل‌های قدیمی در قالب TF1 Hub و SavedModels قدیمی نشان می‌دهد.

برای اطلاعات بیشتر در مورد سازگاری قالب TF1 Hub به راهنمای سازگاری مدل مراجعه کنید.

استفاده از API های سطح پایین تر

مدل‌های قالب TF1 Hub قدیمی را می‌توان از طریق tf.saved_model.load بارگیری کرد. به جای

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

توصیه می شود از:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

در این مثال‌ها m.signatures دستوری از توابع بتنی TensorFlow است که با نام‌های امضا کلید می‌خورد. فراخوانی چنین تابعی تمام خروجی های آن را حتی اگر استفاده نشده باشد محاسبه می کند. (این با ارزیابی تنبل حالت نمودار TF1 متفاوت است.)