מָבוֹא
TensorFlow Hub מארח את SavedModels עבור TensorFlow 2, בין היתר. ניתן לטעון אותם בחזרה לתוכנית Python באמצעות obj = hub.load(url) [ למידע נוסף ]. ה- obj המוחזר הוא תוצאה של tf.saved_model.load() (ראה את מדריך SavedModel של TensorFlow). אובייקט זה יכול להכיל תכונות שרירותיות שהן tf.functions, tf.Variables (שאותחלו מהערכים שאומנו מראש), משאבים אחרים, ובאופן רקורסיבי, אובייקטים נוספים כאלה.
דף זה מתאר ממשק שיוטמע על ידי ה- obj שנטען על מנת לעשות בו שימוש חוזר בתוכנית TensorFlow Python. SavedModels התואמים לממשק זה נקראים Reusable SavedModels .
שימוש חוזר פירושו בניית מודל גדול יותר סביב obj , כולל היכולת לכוונן אותו. כוונון עדין פירושו אימון נוסף של המשקלים ב- obj שנטען כחלק מהמודל שמסביב. פונקציית ההפסד והממטב נקבעים על ידי המודל שמסביב; obj מגדיר רק את המיפוי של הפעלות קלט לפלט ("מעבר קדימה"), וייתכן שיכללו טכניקות כגון נשירה או נורמליזציה של אצווה.
צוות TensorFlow Hub ממליץ ליישם את ממשק SavedModel לשימוש חוזר בכל ה-SavedModels המיועדים לשימוש חוזר במובן הנ"ל. כלי עזר רבים מספריית tensorflow_hub , ובמיוחד hub.KerasLayer , דורשים SavedModels כדי ליישם אותו.
קשר ל-SignatureDefs
ממשק זה, מבחינת tf.functions ותכונות TF2 אחרות, נפרד מחתימות ה-SavedModel, הזמינות מאז TF1 וממשיכות לשמש ב-TF2 לצורך הסקה (כגון פריסת SavedModels ב-TF Serving או TF Lite). חתימות לצורך הסקה אינן אקספרסיביות מספיק כדי לתמוך בכוונון עדין, ו- tf.function מספק API Python טבעי ואקספרסיבי יותר עבור המודל שנעשה בו שימוש חוזר.
קשר לספריות בניית מודלים
מודל SavedModel הניתן לשימוש חוזר משתמש רק בפרימיטיבים של TensorFlow 2, ללא תלות בספריית בניית מודלים מסוימת כמו Keras או Sonnet. זה מאפשר שימוש חוזר בספריות בניית מודלים, ללא תלות בקוד בניית המודל המקורי.
יידרש מידה מסוימת של הסתגלות כדי לטעון Reusable SavedModels לתוך או לשמור אותם מכל ספריית בניית מודלים נתונה. עבור Keras, hub.KerasLayer מספק את הטעינה, והשמירה המובנית של Keras בפורמט SavedModel עוצבה מחדש עבור TF2 במטרה לספק קבוצת-על של ממשק זה (ראה את ה- RFC ממאי 2019).
קשר ל-"ממשקי API של SavedModel נפוצים" ספציפיים למשימה
הגדרת הממשק בדף זה מאפשרת כל מספר וסוג של קלט ופלט. ממשקי ה-API של Common SavedModel עבור TF Hub משפרים את הממשק הכללי הזה עם מוסכמות שימוש עבור משימות ספציפיות כדי להפוך מודלים לניתנים להחלפה בקלות.
הגדרת ממשק
תכונות
מודל SavedModel הניתן לשימוש חוזר הוא מודל SavedModel של TensorFlow 2 כך ש- obj = tf.saved_model.load(...) מחזיר אובייקט בעל התכונות הבאות
__call__. נדרש. פונקציה tf.function המיישמת את חישוב המודל ("המעבר קדימה") בכפוף למפרט שלהלן.variables: רשימה של אובייקטים מסוג tf.Variable, המפרטת את כל המשתנים המשמשים כל קריאה אפשרית של__call__, כולל משתנים הניתנים לאימון וגם כאלה שאינם ניתנים לאימון.ניתן להשמיט רשימה זו אם היא ריקה.
trainable_variables: רשימה של אובייקטים מסוג tf.Variable כך ש-v.trainableנכון עבור כל האלמנטים. משתנים אלה חייבים להיות תת-קבוצה שלvariables. אלו הם המשתנים שיש לאמן בעת כוונון עדין של האובייקט. יוצר ה-SavedModel עשוי לבחור להשמיט כאן כמה משתנים שהיו ניתנים לאימון במקור כדי לציין שאין לשנות אותם במהלך כוונון עדין.ניתן להשמיט רשימה זו אם היא ריקה, בפרט אם ה-SavedModel אינו תומך בכוונון עדין.
regularization_losses: רשימה של פונקציות tf.function, שכל אחת מהן מקבלת אפס קלטים ומחזירה טנזור צף סקלר יחיד. לצורך כוונון עדין, מומלץ למשתמש SavedModel לכלול אותן כאיברי רגולריזציה נוספים לתוך ההפסד (במקרה הפשוט ביותר ללא קנה מידה נוסף). בדרך כלל, אלה משמשים לייצוג מפקדי משקל. (בשל היעדר קלטים, פונקציות tf.function אלו אינן יכולות לבטא מפקדי פעילות.)ניתן להשמיט רשימה זו אם היא ריקה, בפרט אם ה-SavedModel אינו תומך בכוונון עדין או אינו מעוניין לקבוע רגולציה של משקל.
הפונקציה __call__
ל- obj Restored SavedModel יש תכונה obj.__call__ שהיא פונקציה tf.function restored המאפשרת קריאה obj באופן הבא.
תקציר (פסאודו-קוד):
outputs = obj(inputs, trainable=..., **kwargs)
טיעונים
הטיעונים הם כדלקמן.
ישנו ארגומנט מיקומי אחד, נדרש, עם קבוצת הפעלות קלט של ה-SavedModel. הסוג שלו הוא אחד מ-
- טנזור יחיד עבור קלט יחיד,
- רשימה של טנזורים עבור רצף מסודר של קלטים ללא שם,
- כתב של טנזורים הממופתחים על ידי קבוצה מסוימת של שמות קלט.
(ייתכן שיתאפשרו עריכות עתידיות של ממשק זה קינים כלליים יותר.) יוצר ה-SavedModel בוחר אחת מאלה ואת צורות הטנזור וסוגי ה-d. במידת הצורך, חלק ממדי הצורה צריכים להיות בלתי מוגדרים (בעיקר גודל האצווה).
ייתכן שיהיה
trainingאופציונלי לארגומנט מילות מפתח המקבל ערך בוליאני של פייתון,TrueאוFalse. ברירת המחדל היאFalse. אם המודל תומך בכוונון עדין, ואם החישוב שלו שונה בין השניים (למשל, כמו ב-dropout וב-batch normalization), הבחנה זו מיושם עם ארגומנט זה. אחרת, ארגומנט זה עשוי להיעדר.אין צורך ש
__call__יקבל ארגומנטtrainingבעל ערך טנזור. על הקורא להשתמשtf.cond()במידת הצורך כדי לשגר ביניהם.יוצר ה-SavedModel רשאי לבחור לקבל
kwargsאופציונליים יותר של שמות מסוימים.עבור ארגומנטים בעלי ערך טנזור, יוצר ה-SavedModel מגדיר את סוגי ה-d והצורות המותרים שלהם.
tf.functionמקבלת ערך ברירת מחדל של Python על ארגומנט שעובר מעקב באמצעות קלט tf.TensorSpec. ניתן להשתמש בארגומנטים כאלה כדי לאפשר התאמה אישית של היפר-פרמטרים מספריים המעורבים ב__call__(למשל, שיעור נשירה).עבור ארגומנטים בעלי ערך פייתון, יוצר SavedModel מגדיר את הערכים המותרים שלהם. ארגומנטים כאלה יכולים לשמש כדגלים כדי לבצע בחירות דיסקרטיות בפונקציה המעקבת (אך שימו לב לפיצוץ הקומבינטורית של מעקבים).
הפונקציה __call__ ששוחזרה חייבת לספק עקבות עבור כל צירופי הארגומנטים המותרים. החלפת training בין True ו- False לא צריכה לשנות את אישור הארגומנטים.
תוֹצָאָה
outputs מקריאה ל- obj יכול להיות
- טנזור יחיד עבור פלט יחיד,
- רשימה של טנזורים עבור רצף מסודר של פלטים ללא שם,
- כתב של טנזורים הממופתחים על ידי קבוצה מסוימת של שמות פלט.
(ייתכן שיתאפשרו ערכים עתידיים של ממשק זה קינים כלליים יותר.) סוג ההחזרה עשוי להשתנות בהתאם לkwargs בעלי ערך פייתון. זה מאפשר דגלים המייצרים פלטים נוספים. יוצר SavedModel מגדיר את סוגי ה-d והצורות של הפלט ואת התלות שלהם בקלטים.
חובות ניתנים לקריאה (callables)
מודל SavedModel לשימוש חוזר יכול לספק מספר חלקי מודל באופן שתואר לעיל על ידי הצבתם בתת-אובייקטים בעלי שם, לדוגמה, obj.foo , obj.bar וכן הלאה. כל תת-אובייקט מספק מתודה __call__ ומאפיינים תומכים לגבי המשתנים וכו' הספציפיים לאותו חלק מודל. עבור הדוגמה לעיל, יהיו obj.foo.__call__ , obj.foo.variables וכן הלאה.
שים לב שממשק זה אינו מכסה את הגישה של הוספת tf.function רקום ישירות כ- tf.foo .
משתמשי Reusable SavedModels צפויים להתמודד רק עם רמת קינון אחת ( obj.bar אבל לא obj.bar.baz ). (עדכונים עתידיים של ממשק זה עשויים לאפשר קינון עמוק יותר, וייתכן ולוותר על הדרישה שהאובייקט ברמה העליונה יהיה ניתן לקריאה בעצמו.)
דברי סיכום
קשר ל-APIs בתהליך
מסמך זה מתאר ממשק של מחלקת Python המורכב מפרימיטיבים כמו tf.function ו-tf.Variable אשר שורדים סיבוב הלוך ושוב בסידור דרך tf.saved_model.save() ו- tf.saved_model.load() . עם זאת, הממשק כבר היה קיים באובייקט המקורי שהועבר ל- tf.saved_model.save() . התאמה לממשק זה מאפשרת החלפה של חלקי מודל בין ממשקי API של בניית מודלים בתוך תוכנית TensorFlow אחת.