TensorBoard Scalars: ведение журнала показателей обучения в Keras

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub

Обзор

Машинное обучение неизменно предполагает понимание ключевых показателей, таких как потери, и того, как они меняются по мере обучения. Эти показатели могут помочь вам понять , если вы переобучения , например, или , если вы излишне обучение слишком долго. Возможно, вы захотите сравнить эти метрики при разных тренировках, чтобы помочь отладить и улучшить вашу модель.

TensorBoard в Скалярах Dashboard позволяет визуализировать эти показатели с помощью простого API с очень небольшим усилием. В этом руководстве представлены очень простые примеры, которые помогут вам узнать, как использовать эти API с TensorBoard при разработке модели Keras. Вы узнаете, как использовать обратный вызов Keras TensorBoard и API сводки 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 , суффиксом по датируемые подкаталоге. Подкаталог с отметкой времени позволяет вам легко идентифицировать и выбирать обучающие прогоны, когда вы используете 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]]