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

TensorBoard Scalars: מדדי אימוני כריתת עצים בכרסאס

צפה ב TensorFlow.org הפעל ב- Google Colab צפה במקור ב- GitHub

סקירה כללית

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

לוח המחוונים Scalars של TensorBoard מאפשר לך להמחיש מדדים אלה באמצעות ממשק API פשוט עם מעט מאוד מאמץ. במדריך זה מוצגות דוגמאות בסיסיות מאוד שיעזרו לכם ללמוד כיצד להשתמש בממשקי API אלה עם TensorBoard בעת פיתוח מודל Keras שלכם. תלמד כיצד להשתמש בממשקי ה- API של Keras TensorBoard התקשרות וב- TensorFlow סיכום כדי לדמיין סקלרים ברירת מחדל ומותאמים אישית.

להכין

 # Load the TensorBoard notebook extension.
%load_ext tensorboard
 
 from datetime import datetime
from packaging import version

import tensorflow as tf
from tensorflow import keras

import numpy as np

print("TensorFlow version: ", tf.__version__)
assert version.parse(tf.__version__).release[0] >= 2, \
    "This notebook requires TensorFlow 2.0 or above."
 
TensorFlow version:  2.2

הגדר נתונים לרגרסיה פשוטה

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

אתה מתכוון להשתמש ב- TensorBoard כדי לראות כיצד האימונים ואובדן המבחנים משתנים לאורך התקופות. יש לקוות שתראו אימונים ואובדן המבחנים יורדים עם הזמן ואז יישארו יציבים.

ראשית, צור 1000 נקודות נתונים בערך לאורך y = 0.5x + 2 . חלק את נקודות הנתונים הללו למערכות אימונים ומבחנים. התקווה שלך היא שהרשת העצבית לומדת קשר זה.

 data_size = 1000
# 80% of the data is for training.
train_pct = 0.8

train_size = int(data_size * train_pct)

# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size)
np.random.shuffle(x)

# Generate the output data.
# y = 0.5x + 2 + noise
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))

# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size]
x_test, y_test = x[train_size:], y[train_size:]
 

הכשרת המודל ואובדן רישום

עכשיו אתה מוכן להגדיר, לאמן ולהעריך את המודל שלך.

כדי לרשום את סקלר האובדן כשאתה מתאמן, בצע את הפעולות הבאות:

  1. צור את ההתקשרות של Keras TensorBoard
  2. ציין ספריית יומן
  3. העבירו את ה- TensorBoard התקשרות אל Model.fit של קרס () .

TensorBoard קורא נתוני יומן מההיררכיה של ספריות היומנים. במחברת זו, ספריית יומן השורש היא logs/scalars , המסודרים על ידי ספריית משנה שחותמת זמן. ספריית המשנה עם חותמת הזמן מאפשרת לך לזהות ולבחור בקלות ריצות אימונים בזמן שאתה משתמש ב- TensorBoard ולחזור על המודל שלך.

 logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(lr=0.2),
)

print("Training ... With default parameters, this takes less than 10 seconds.")
training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback],
)

print("Average test loss: ", np.average(training_history.history['loss']))
 
Training ... With default parameters, this takes less than 10 seconds.
Average test loss:  0.05271831926424056

בחינת הפסד באמצעות TensorBoard

כעת, התחל את TensorBoard, ציין את ספריית יומן השורש בה השתמשת למעלה.

המתן מספר שניות לממשק המשתמש של TensorBoard להתפוצץ.

 %tensorboard --logdir logs/scalars
 

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

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

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

שימו לב לבורר 'פועל' משמאל. "ריצה" מייצגת מערכת יומנים מסבב אימונים, במקרה זה התוצאה של Model.fit (). למפתחים בדרך כלל יש ריצות רבות ורבות בזמן שהם מתנסים ומפתחים את המודל שלהם לאורך זמן.

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

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

בהתחשב בנתוני הקלט (60, 25, 2), השורה y = 0.5x + 2 אמורה להניב (32, 14.5, 3). האם הדגם מסכים?

 print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
 
[[32.234306 ]
 [14.5974245]
 [ 3.0074697]]

לא רע!

רישום סקלרים מותאמים אישית

מה אם ברצונך לרשום ערכים מותאמים אישית, כגון שיעור למידה דינמי ? לשם כך עליכם להשתמש בממשק ה- API של סיכום TensorFlow.

נסוך מחדש את מודל הרגרסיה ורשם שיעור למידה בהתאמה אישית. הנה כיצד:

  1. צור כותב קבצים באמצעות tf.summary.create_file_writer() .
  2. הגדירו פונקציה של קצב למידה בהתאמה אישית. זה יועבר להתקשרות של Keras LearningRateScheduler .
  3. בתוך פונקציית קצב הלמידה השתמש ב- tf.summary.scalar() כדי לרשום את קצב הלמידה המותאם אישית.
  4. העבירו את ההתקשרות של LearningRateScheduler ל- Model.fit ().

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

 logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()

def lr_schedule(epoch):
  """
  Returns a custom learning rate that decreases as epochs progress.
  """
  learning_rate = 0.2
  if epoch > 10:
    learning_rate = 0.02
  if epoch > 20:
    learning_rate = 0.01
  if epoch > 50:
    learning_rate = 0.005

  tf.summary.scalar('learning rate', data=learning_rate, step=epoch)
  return learning_rate

lr_callback = keras.callbacks.LearningRateScheduler(lr_schedule)
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(),
)

training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback, lr_callback],
)
 

בואו נסתכל שוב על TensorBoard.

 %tensorboard --logdir logs/scalars
 

בעזרת בורר "פועל" בצד שמאל, שימו לב שיש לכם הפעלת <timestamp>/metrics . בחירת ריצה זו מציגה גרף "קצב למידה" המאפשר לאמת את התקדמות קצב הלמידה במהלך ריצה זו.

אתה יכול גם להשוות בין עקומות האימונים והאובדן אימות ריצה זו לעומת הריצות הקודמות שלך.

איך המודל הזה עושה?

 print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
 
[[32.234013 ]
 [14.5973015]
 [ 3.0074618]]