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

TensorBoard Scalars: מדדי הכשרת רישום בקראס

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה במקור ב- GitHub

סקירה כללית

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

לוח המחוונים של Scalars של TensorBoard מאפשר לך לדמיין את המדדים הללו באמצעות ממשק API פשוט עם מעט מאוד מאמץ. הדרכה זו מציגה דוגמאות בסיסיות מאוד שיעזרו לך ללמוד כיצד להשתמש בממשקי API אלה עם TensorBoard בעת פיתוח מודל Keras שלך. תלמד כיצד להשתמש בממשקי קריאה להתקשרות חוזרת של 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 של Keras () .

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