ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

TensorBoard Scalars: تسجيل مقاييس التدريب في Keras

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب

نظرة عامة

يتضمن التعلم الآلي دائمًا فهم المقاييس الرئيسية مثل الخسارة وكيف تتغير مع تقدم التدريب. يمكن أن تساعدك هذه المقاييس على فهم ما إذا كنت تتأهب بشكل مفرط ، على سبيل المثال ، أو إذا كنت تتدرب بلا داع لفترة طويلة. قد ترغب في مقارنة هذه المقاييس عبر دورات التدريب المختلفة للمساعدة في تصحيح النموذج وتحسينه.

تسمح لك لوحة معلومات Scalars الخاصة بـ TensorBoard بتصور هذه المقاييس باستخدام واجهة برمجة تطبيقات بسيطة بجهد قليل جدًا. يقدم هذا البرنامج التعليمي أمثلة أساسية جدًا لمساعدتك على تعلم كيفية استخدام واجهات برمجة التطبيقات هذه مع 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 (). عادةً ما يطور المطورون العديد من الجري ، وهم يجربون ويطورون نموذجهم بمرور الوقت.

استخدم محدد Runs لاختيار عمليات تشغيل معينة ، أو اختر من التدريب أو التحقق من الصحة فقط. ستساعدك مقارنة عمليات التشغيل على تقييم إصدار الشفرة الذي يحل مشكلتك بشكل أفضل.

حسنًا ، يوضح الرسم البياني للخسارة في 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]]

ليس سيئا!

تسجيل مقاييس مخصصة

ماذا لو كنت تريد تسجيل القيم المخصصة ، مثل معدل التعلم الديناميكي ؟ للقيام بذلك ، تحتاج إلى استخدام TensorFlow Summary API.

أعد تدريب نموذج الانحدار وسجل معدل تعلم مخصص. إليك الطريقة:

  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
 

باستخدام محدد "Runs" على اليسار ، لاحظ أن لديك <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]]