דף זה תורגם על ידי Cloud Translation API.
Switch to English

פורמט רכזת TF1

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

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

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

שימוש בדגם בפורמט רכזת TF1

הפעלת דגם בפורמט רכזת TF1

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

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

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

מודולי מטמון

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

החלת מודול

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

 y = m(x)
 

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

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

אם לחתימה יש כניסות מרובות, יש להעביר אותן כמכתיב, כאשר המקשים מוגדרים על ידי החתימה. באופן דומה, אם לחתימה יש פלטים מרובים, ניתן לאחזר אותם as_dict=True ידי העברת 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() כתלות של יעד ב- tf.Session.run() . אכן, מפרסמי המודולים עשויים לבחור לספק פלטים שונים לשימושים מתקדמים (כמו הפעלה של שכבות ביניים) יחד עם התפוקות העיקריות. על צרכני המודולים להתמודד עם תפוקות נוספות בחינניות.

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

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

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

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

הערת תאימות

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

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

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