TensorFlow 2 שונה מהותית מ-TF1.x בכמה דרכים. אתה עדיין יכול להריץ קוד TF1.x ללא שינוי ( למעט contrib ) נגד התקנות בינאריות של TF2 כך:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
עם זאת, זה לא מפעיל התנהגויות וממשקי API של TF2, וייתכן שלא יעבוד כצפוי עם קוד שנכתב עבור TF2. אם אינך פועל עם התנהגויות TF2 פעילות, אתה למעשה מפעיל את TF1.x על גבי התקנת TF2. קרא את המדריך להתנהגויות TF1 לעומת TF2 לפרטים נוספים על ההבדל בין TF2 ל-TF1.x.
מדריך זה מספק סקירה כללית של התהליך להעברת קוד TF1.x ל-TF2. זה מאפשר לך לנצל את היתרונות של שיפורים בתכונות חדשות ועתידיות וגם להפוך את הקוד שלך לפשוט יותר, ביצועי יותר וקל יותר לתחזוקה.
אם אתה משתמש בממשקי ה-API ברמה הגבוהה של tf.keras
ומתאמן באופן בלעדי עם model.fit
, הקוד שלך אמור להיות תואם פחות או יותר ל-TF2 למעט האזהרות הבאות:
- ל-TF2 יש קצבי למידה חדשים המוגדרים כברירת מחדל עבור מטובי Keras.
- ייתכן ש-TF2 שינה את ה"שם" שאליו נרשמים מדדים.
תהליך הגירה של TF2
לפני ההעברה, למד על ההתנהגות וההבדלים ב-API בין TF1.x ו-TF2 על ידי קריאת המדריך .
- הפעל את הסקריפט האוטומטי כדי להמיר חלק מהשימוש ב-API של TF1.x ל-
tf.compat.v1
. - הסר סמלי
tf.contrib
ישנים (בדוק TF Addons ו- TF-Slim ). - הפוך את מודל ה-TF1.x למעבר קדימה לרוץ ב-TF2 כאשר ביצוע להוט מופעל.
- שדרג את קוד ה-TF1.x שלך עבור לולאות אימון ושמירה/טעינה של מודלים למקבילות TF2.
- (אופציונלי) העבר את ממשקי ה-API של
tf.compat.v1
התואמים ל-TF2 לממשקי API של TF2 אידיומטיים.
הסעיפים הבאים מרחיבים את השלבים המתוארים לעיל.
הפעל את סקריפט המרת הסמלים
זה מבצע מעבר ראשוני בשכתוב סמלי הקוד שלך כך שיפעלו נגד קבצים בינאריים של TF 2.x, אבל לא יהפוך את הקוד שלך לאידיומטי ל-TF 2.x וגם לא יהפוך את הקוד שלך אוטומטית לתואם להתנהגויות TF2.
סביר להניח שהקוד שלך עדיין יעשה שימוש בנקודות קצה tf.compat.v1
כדי לגשת למצייני מיקום, הפעלות, אוספים ופונקציונליות אחרת בסגנון TF1.x.
קרא את המדריך למידע נוסף על השיטות המומלצות לשימוש בסקריפט להמרת סמלים.
הסר את השימוש ב- tf.contrib
מודול tf.contrib
הושק בשמש וכמה מתתי-מודולים שלו שולבו ב-API הליבה של TF2. תת-המודולים האחרים מחולקים כעת לפרויקטים אחרים כמו TF IO ו- TF Addons .
כמות גדולה של קוד TF1.x ישן יותר משתמשת בספריית Slim , שנארזה עם TF1.x כ- tf.contrib.layers
. בעת העברת קוד ה-Slim שלך ל-TF2, שנה את השימושים שלך ב-Slim API כך שיצביע על חבילת tf-slim pip . לאחר מכן, קרא את מדריך מיפוי המודלים כדי ללמוד כיצד להמיר קוד Slim.
לחלופין, אם אתה משתמש בדגמים מאומנים מראש של Slim, תוכל לשקול לנסות את הדגמים המוכשרים מראש של Keras מ- tf.keras.applications
או מ-TF2 SavedModel
של TF Hub שיוצאו מקוד ה-Slim המקורי.
הפוך את המעבר קדימה של מודל TF1.x לרוץ כאשר התנהגויות TF2 מופעלות
עקוב אחר משתנים והפסדים
TF2 אינו תומך באוספים גלובליים.
ביצוע להוט ב-TF2 אינו תומך בממשקי API מבוססי אוסף tf.Graph
. זה משפיע על האופן שבו אתה בונה ועוקב אחר משתנים.
עבור קוד TF2 חדש, תשתמש ב- tf.Variable
במקום v1.get_variable
ותשתמש באובייקטים של Python כדי לאסוף ולעקוב אחר משתנים במקום tf.compat.v1.variable_scope
. בדרך כלל זה יהיה אחד מ:
צברו רשימות של משתנים (כמו tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) עם התכונות .variables
ו- .trainable_variables
של האובייקטים Layer
, Module
או Model
.
המחלקות Layer
ו- Model
מיישמות מספר מאפיינים אחרים שמסירים את הצורך באוספים גלובליים. מאפיין ה- .losses
שלהם יכול להוות תחליף לשימוש באוסף tf.GraphKeys.LOSSES
.
קרא את מדריך מיפוי המודלים כדי לגלות עוד על השימוש ב-shims מודלים של קוד TF2 כדי להטמיע את הקוד הקיים שלך מבוסס get_variable
ו- variable_scope
בתוך Layers
, Models
Modules
. זה יאפשר לך לבצע מעברים קדימה עם ביצוע להוט מופעל ללא שכתובים גדולים.
הסתגלות לשינויי התנהגות אחרים
אם מדריך מיפוי המודלים בפני עצמו אינו מספיק כדי להעביר את המודל שלך קדימה לשינויי התנהגות אחרים שעשויים להיות פרטים נוספים, עיין במדריך על התנהגויות TF1.x לעומת TF2 כדי ללמוד על שינויי ההתנהגות האחרים וכיצד תוכל להסתגל אליהם . בדוק גם את יצירת שכבות ודגמים חדשים באמצעות מדריך סיווג משנה לפרטים.
אימות התוצאות שלך
עיין במדריך אימות המודל לקבלת כלים קלים והכוונה כיצד תוכל (מספרית) לאמת שהמודל שלך מתנהג כהלכה כאשר הפעלה נלהבת מופעלת. ייתכן שתמצא את זה שימושי במיוחד בשילוב עם מדריך מיפוי המודלים .
שדרוג הדרכה, הערכה וקוד ייבוא/ייצוא
לולאות אימון TF1.x שנבנו עם v1.Session
-style tf.estimator.Estimator
s וגישות אחרות מבוססות אוספים אינן תואמות את ההתנהגויות החדשות של TF2. חשוב שתעביר את כל קוד האימון שלך TF1.x מכיוון ששילובו עם קוד TF2 עלול לגרום להתנהגויות בלתי צפויות.
אתה יכול לבחור מבין כמה אסטרטגיות לעשות זאת.
הגישה ברמה הגבוהה ביותר היא להשתמש tf.keras
. הפונקציות ברמה הגבוהה ב-Keras מנהלות הרבה מהפרטים ברמה נמוכה שאולי קל לפספס אם תכתוב לולאת אימון משלך. לדוגמה, הם אוספים אוטומטית את הפסדי הרגוליזציה, ומגדירים את הטיעון training=True
כאשר קוראים למודל.
עיין במדריך ההגירה של Estimator כדי ללמוד כיצד ניתן להעביר את הקוד של tf.estimator.Estimator
כדי להשתמש בלולאות אימון של וניל ובהתאמה אישית tf.keras
.
לולאות אימון מותאמות אישית נותנות לך שליטה עדינה יותר על הדגם שלך, כגון מעקב אחר המשקלים של שכבות בודדות. קרא את המדריך לבניית לולאות אימון מאפס כדי ללמוד כיצד להשתמש ב- tf.GradientTape
כדי לאחזר משקולות של מודל ולהשתמש בהם כדי לעדכן את המודל.
המר את כלי האופטימיזציה של TF1.x למיטובי Keras
לאופטימיזציית tf.compat.v1.train
, כגון ה- Adam Optimizer ו- Gradient Descent Optimizer , יש מקבילות ב- tf.keras.optimizers
.
הטבלה שלהלן מסכמת כיצד ניתן להמיר את כלי האופטימיזציה מדור קודם אלה למקבילותיהם של Keras. אתה יכול להחליף ישירות את גרסת TF1.x בגרסת TF2 אלא אם נדרשים שלבים נוספים (כגון עדכון קצב הלמידה המוגדר כברירת מחדל ).
שים לב שהמרת כלי האופטימיזציה שלך עלולה להפוך נקודות ביקורת ישנות לבלתי תואמות .
TF1.x | TF2 | שלבים נוספים |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | אַף לֹא אֶחָד |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | כלול את ארגומנט ה'מומנטום' |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | שנה את שם הארגומנטים 'beta1' ו-'beta2' ל-'beta_1' ו-'beta_2' |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | שנה את שם הארגומנט `דעיכה` ל`rho` |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | אַף לֹא אֶחָד |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | אַף לֹא אֶחָד |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | הסר את הארגומנטים `accum_name` ו`linear_name` |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | שנה את השם של הארגומנטים `beta1` ו-`beta2` ל-`beta_1` ו-`beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | שנה את השם של הארגומנטים `beta1` ו-`beta2` ל-`beta_1` ו-`beta_2` |
שדרוג צינורות קלט נתונים
ישנן דרכים רבות להזין נתונים למודל tf.keras
. הם יקבלו מחוללי Python ומערכי Numpy כקלט.
הדרך המומלצת להזין נתונים למודל היא להשתמש בחבילת tf.data
, המכילה אוסף של מחלקות ביצועים גבוהים למניפולציה של נתונים. dataset
השייכים ל- tf.data
יעילים, אקספרסיביים ומשתלבים היטב עם TF2.
ניתן להעביר אותם ישירות לשיטת tf.keras.Model.fit
.
model.fit(dataset, epochs=5)
ניתן לבצע איטרציה על פייתון סטנדרטי ישירות:
for example_batch, label_batch in dataset:
break
אם אתה עדיין משתמש ב- tf.queue
, אלה נתמכים כעת רק כמבני נתונים, לא כצינורות קלט.
עליך גם להעביר את כל קוד העיבוד המקדים של תכונות המשתמשות ב- tf.feature_columns
. קרא את מדריך ההגירה לפרטים נוספים.
שמירה וטעינת דגמים
TF2 משתמש בנקודות ביקורת מבוססות אובייקטים. קרא את מדריך העברת נקודות הבידוק למידע נוסף על העברת נקודות TF1.x מבוססות שמות. קרא גם את מדריך המחסומים במסמכי הליבה של TensorFlow.
אין חששות תאימות משמעותיים עבור דגמים שמורים. קרא את המדריך SavedModel
למידע נוסף על העברת SavedModel
s ב-TF1.x ל-TF2. בִּכלָל,
- TF1.x saved_models פועלים ב-TF2.
- TF2 saved_models פועלים ב-TF1.x אם כל האופציות נתמכות.
עיין גם בסעיף GraphDef
במדריך הגירה SavedModel
למידע נוסף על עבודה עם אובייקטים Graph.pb
ו- Graph.pbtxt
.
(אופציונלי) העבר את סמלי tf.compat.v1
מודול tf.compat.v1
מכיל את ה-API המלא של TF1.x, עם הסמנטיקה המקורית שלו.
גם לאחר ביצוע השלבים שלמעלה והסתיים בקוד שתואם באופן מלא לכל התנהגויות TF2, סביר להניח שיהיו אזכורים רבים של compat.v1
apis שבמקרה תואמים ל-TF2. עליך להימנע משימוש בממשקי compat.v1
מדור קודם עבור כל קוד חדש שאתה כותב, אם כי הם ימשיכו לעבוד עבור הקוד שכבר נכתב.
עם זאת, תוכל לבחור להעביר את השימושים הקיימים לממשקי API של TF2 שאינם מדור קודם. המחרוזות של סמלים בודדים compat.v1
יסבירו לעתים קרובות כיצד להעביר אותם לממשקי API של TF2 שאינם מדור קודם. בנוסף, הקטע של מדריך מיפוי המודלים בנושא העברה מצטברת לממשקי API אידיומטיים של TF2 עשוי לעזור גם בכך.
משאבים וקריאה נוספת
כפי שהוזכר קודם לכן, מומלץ להעביר את כל קוד ה-TF1.x ל-TF2. קרא את המדריכים בקטע Migrate to TF2 במדריך TensorFlow למידע נוסף.