פורמט TF1 Hub

בהשקתו ב-2018, TensorFlow Hub הציעה סוג יחיד של נכס: פורמט TF1 Hub לייבוא ​​לתוכניות TensorFlow 1.

דף זה מסביר כיצד להשתמש בפורמט TF1 Hub ב-TF1 (או במצב תאימות TF1 של TF2) עם המחלקה hub.Module וממשקי API משויכים. (השימוש האופייני הוא לבנות tf.Graph , אולי בתוך TF1 Estimator , על ידי שילוב של מודל אחד או יותר בפורמט TF1 Hub עם tf.compat.layers או tf.layers ).

משתמשי TensorFlow 2 (מחוץ למצב תאימות TF1) חייבים להשתמש ב-API החדש עם hub.load() או hub.KerasLayer . ה-API החדש טוען את סוג הנכס החדש TF2 SavedModel, אך יש לו גם תמיכה מוגבלת בטעינת פורמט TF1 Hub לתוך TF2 .

שימוש בדגם בפורמט TF1 Hub

יצירת מודל בפורמט TF1 Hub

מודל בפורמט TF1 Hub מיובא לתוכנית TensorFlow על ידי יצירת אובייקט hub.Module ממחרוזת עם כתובת ה-URL או נתיב מערכת הקבצים שלו, כגון:

m = hub.Module("path/to/a/module_dir")

זה מוסיף את המשתנים של המודול לגרף TensorFlow הנוכחי. הפעלת המאתחלים שלהם תקרא את הערכים המאומנים מראש שלהם מהדיסק. כמו כן, טבלאות ומצבים אחרים מתווספים לגרף.

מודולי מטמון

בעת יצירת מודול מכתובת URL, תוכן המודול מוריד ונשמר בספרייה הזמנית של המערכת המקומית. ניתן לעקוף את המיקום שבו מודולים מאוחסנים במטמון באמצעות משתנה הסביבה TFHUB_CACHE_DIR . לפרטים, ראה שמירה במטמון .

החלת מודול

לאחר מופע, ניתן לקרוא למודול m אפס או יותר פעמים כמו פונקציית Python מכניסות טנסור ליציאות טנסור:

y = m(x)

כל קריאה כזו מוסיפה פעולות לגרף TensorFlow הנוכחי כדי לחשב y מ- x . אם זה כולל משתנים עם משקלים מאומנים, אלה מחולקים בין כל היישומים.

מודולים יכולים להגדיר חתימות מרובות בשמות כדי לאפשר יישום ביותר מדרך אחת (בדומה לאופן שבו לאובייקטים של Python יש שיטות ). תיעוד של מודול צריך לתאר את החתימות הזמינות. הקריאה למעלה מחילה את החתימה בשם "default" . ניתן לבחור כל חתימה על ידי העברת שמה לארגומנט האופציונלי signature= .

אם לחתימה יש מספר כניסות, יש להעביר אותן כהכתבה, כשהמפתחות מוגדרים על ידי החתימה. באופן דומה, אם לחתימה יש יציאות מרובות, ניתן לאחזר אותן כ-dict על ידי העברת as_dict=True , מתחת למפתחות שהוגדרו על ידי החתימה (המפתח "default" מיועד לפלט היחיד שמוחזר אם as_dict=False ). אז הצורה הכללית ביותר של יישום מודול נראית כך:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

מתקשר חייב לספק את כל הכניסות המוגדרות בחתימה, אך אין דרישה להשתמש בכל היציאות של המודול. TensorFlow יריץ רק את אותם חלקים של המודול שבסופו של דבר כתלות של יעד ב- tf.Session.run() . אכן, מפרסמי מודולים עשויים לבחור לספק פלטים שונים לשימושים מתקדמים (כמו הפעלות של שכבות ביניים) יחד עם הפלטים העיקריים. צרכני מודול צריכים לטפל בתפוקות נוספות בחן.

מנסה מודולים חלופיים

בכל פעם שיש מודולים מרובים לאותה משימה, TensorFlow Hub מעודד לצייד אותם בחתימות (ממשקים) תואמות כך שניסיון מודולים שונים הוא קל כמו לשנות את ידית המודול כמו היפרפרמטר בעל ערך מחרוזת.

לשם כך, אנו מקיימים אוסף של חתימות נפוצות מומלצות למשימות פופולריות.

יצירת מודול חדש

הערת תאימות

פורמט TF1 Hub מיועד ל-TensorFlow 1. הוא נתמך רק באופן חלקי על ידי TF Hub ב-TensorFlow 2. אנא שקול לפרסם במקום זאת בפורמט החדש TF2 SavedModel .

פורמט TF1 Hub דומה לפורמט SavedModel של TensorFlow 1 ברמה תחבירית (אותם שמות קבצים והודעות פרוטוקול) אך שונה מבחינה סמנטית כדי לאפשר שימוש חוזר במודול, הרכבה והדרכה מחדש (למשל, אחסון שונה של מאתחלי משאבים, תיוג שונה מוסכמות למטאגרפים). הדרך הקלה ביותר להבדיל ביניהם בדיסק היא נוכחות או היעדרו של הקובץ tfhub_module.pb .

גישה כללית

כדי להגדיר מודול חדש, בעל אתר קורא hub.create_module_spec() עם הפונקציה module_fn . פונקציה זו בונה גרף המייצג את המבנה הפנימי של המודול, תוך שימוש ב- tf.placeholder() עבור תשומות שיסופקו על ידי המתקשר. לאחר מכן הוא מגדיר חתימות על ידי קריאה hub.add_signature(name, inputs, outputs) פעם אחת או יותר.

לדוגמה:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

התוצאה של hub.create_module_spec() יכולה לשמש, במקום נתיב, כדי ליצור אובייקט מודול בתוך גרף TensorFlow מסוים. במקרה כזה, אין נקודת ביקורת, ומופע המודול ישתמש במתחללי המשתנים במקום זאת.

כל מופע מודול יכול להיות מסודר לדיסק באמצעות שיטת export(path, session) . ייצוא מודול מסדר את ההגדרה שלו יחד עם המצב הנוכחי של המשתנים שלו session אל הנתיב שעבר. זה יכול לשמש בעת ייצוא מודול בפעם הראשונה, כמו גם בעת ייצוא מודול מכוון עדין.

לצורך תאימות עם TensorFlow Estimators, hub.LatestModuleExporter מייצאת מודולים מהמחסום העדכני ביותר, בדיוק כמו tf.estimator.LatestExporter מייצאת את כל הדגם מהמחסום העדכני ביותר.

מפרסמי מודולים צריכים ליישם חתימה משותפת במידת האפשר, כך שצרכנים יוכלו בקלות להחליף מודולים ולמצוא את החתימה הטובה ביותר לבעיה שלהם.

דוגמא אמיתית

עיין ביצואן מודול הטבעת הטקסט שלנו לקבלת דוגמה מהעולם האמיתי כיצד ליצור מודול מפורמט נפוץ של הטבעת טקסט.

כוונון עדין

אימון המשתנים של מודול מיובא יחד עם אלו של המודל סביבו נקרא כוונון עדין . כוונון עדין יכול להביא לאיכות טובה יותר, אך מוסיף סיבוכים חדשים. אנו ממליצים לצרכנים לבחון כוונון עדין רק לאחר בחינת שיפורי איכות פשוטים יותר, ורק אם מפרסם המודול ממליץ על כך.

עבור צרכנים

כדי לאפשר כוונון עדין, הפעל את המודול באמצעות hub.Module(..., trainable=True) כדי להפוך את המשתנים שלו לניתנים לאימון ולייבא את REGULARIZATION_LOSSES של REGULARIZATION_LOSSES . אם למודול יש גרסאות מרובות של גרפים, הקפד לבחור את המתאימה לאימון. בדרך כלל, זה עם התגים {"train"} .

בחרו משטר אימונים שלא הורס את המשקולות שאומנו מראש, למשל, שיעור למידה נמוך יותר מאשר לאימון מאפס.

לבעלי אתרים

כדי להקל על כוונון עדין לצרכנים, אנא שים לב לדברים הבאים:

  • כוונון עדין זקוק להסדרה. המודול שלך מיוצא עם אוסף REGULARIZATION_LOSSES , וזה מה שמכניס את הבחירה שלך ב- tf.layers.dense(..., kernel_regularizer=...) וכו' למה שהצרכן מקבל מ- tf.losses.get_regularization_losses() . העדיפו את הדרך הזו להגדרת הפסדי רגולציה L1/L2.

  • במודל המפרסם, הימנע מהגדרת רגוליזציה L1/L2 באמצעות הפרמטרים l1_ ו- l2_regularization_strength של tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer פרוקסימלי אחרים. אלה אינם מיוצאים לצד המודול, וייתכן שהגדרת חוזקות הרגולציה גלובלית לא תתאים לצרכן. למעט רגוליזציה L1 במודלים רחבים (כלומר ליניארי דליל) או רחבים ועמוקים, זה אמור להיות אפשרי להשתמש בהפסדי רגולציה בודדים במקום זאת.

  • אם אתה משתמש בנשירה, נורמליזציה של אצווה או טכניקות אימון דומות, הגדר את ההיפרפרמטרים שלהן לערכים הגיוניים בשימושים צפויים רבים. ייתכן שיהיה צורך להתאים את שיעור הנשירה לנטייה של בעיית היעד להתאמת יתר. בנורמליזציה של אצווה, המומנטום (המכונה מקדם דעיכה) צריך להיות קטן מספיק כדי לאפשר כוונון עדין עם מערכי נתונים קטנים ו/או אצווה גדולה. עבור צרכנים מתקדמים, שקול להוסיף חתימה החושפת שליטה על הפרמטרים קריטיים.