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

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

ملخص

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

سكالارس لوحة TensorBoard يسمح لك لتصور هذه المقاييس باستخدام 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 نقاط البيانات تقريبا على طول الخط ذ = 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 إلى Keras " Model.fit () .

يقرأ TensorBoard بيانات السجل من التسلسل الهرمي لدليل السجل. في هذه المفكرة، دليل السجل الجذر هو logs/scalars ، suffixed بواسطة دليل فرعي قتية. يمكّنك الدليل الفرعي ذي الطابع الزمني من التعرف بسهولة على عمليات التدريب واختيارها أثناء استخدام 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(learning_rate=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 حقبة ، لأن التدريب لم يتحسن كثيرًا بعد تلك المرحلة.

تحوم فوق الرسم البياني لرؤية نقاط بيانات محددة. يمكنك أيضًا محاولة التكبير باستخدام الماوس ، أو تحديد جزء منها لعرض مزيد من التفاصيل.

لاحظ محدد "Runs" على اليسار. يمثل "تشغيل" مجموعة من السجلات من جولة تدريب ، وفي هذه الحالة تكون نتيجة Model.fit (). عادةً ما يكون للمطورين العديد والعديد من عمليات التشغيل ، حيث يقومون بتجربة وتطوير نموذجهم بمرور الوقت.

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

حسنًا ، يوضح الرسم البياني للخسارة في TensorBoard أن الخسارة انخفضت باستمرار لكل من التدريب والتحقق ثم استقرت بعد ذلك. هذا يعني أن مقاييس النموذج من المحتمل أن تكون جيدة جدًا! الآن انظر كيف يتصرف النموذج في الواقع في الواقع.

ونظرا لإدخال البيانات (60، 25، 2)، خط ذ = 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

باستخدام "يعمل" محدد على اليسار، لاحظ أن لديك <timestamp>/metrics التشغيل. يؤدي تحديد هذا التشغيل إلى عرض الرسم البياني "لمعدل التعلم" الذي يسمح لك بالتحقق من تقدم معدل التعلم أثناء هذا التشغيل.

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

كيف يعمل هذا النموذج؟

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