מעבר מ-TF1 ל-TF2 עם TensorFlow Hub

דף זה מסביר כיצד להמשיך להשתמש ב- TensorFlow Hub בזמן העברת קוד TensorFlow שלך מ- TensorFlow 1 ל- TensorFlow 2. הוא משלים את מדריך ההגירה הכללי של TensorFlow.

עבור TF2, TF Hub התרחק מה- hub.Module API מדור קודם לבניית 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 (במצב eager וגרפי) וב-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. (ייתכן שהיא אפילו עטיפה נוחה עבור SavedModels טעונים המשמשים בדרכים אחרות.)

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

מדריכים רבים מציגים ממשקי API אלה בפעולה. הנה כמה דוגמאות:

שימוש ב-API החדש בהדרכה של Estimator

אם אתה משתמש ב-TF2 SavedModel באומד לאימון עם שרתי פרמטרים (או אחרת ב-TF1 Session עם משתנים המוצבים במכשירים מרוחקים), עליך להגדיר 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.)