このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorBoard Scalars:Kerasでのトレーニングメトリックのログ記録

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示

概要概要

機械学習には、損失などの主要な指標と、トレーニングが進むにつれてそれらがどのように変化するかを理解することが常に含まれます。これらのメトリックは、たとえば、過剰適合しているかどうか、または不必要に長時間トレーニングしている場合に理解するのに役立ちます。モデルのデバッグと改善に役立てるために、さまざまなトレーニング実行間でこれらのメトリックを比較することをお勧めします。

TensorBoardのスカラーダッシュボードには、あなたは非常に少ない労力でシンプルなAPIを使用してこれらの指標を可視化することができます。このチュートリアルでは、Kerasモデルを開発するときにTensorBoardでこれらのAPIを使用する方法を学ぶのに役立つ非常に基本的な例を示します。 KerasTensorBoardコールバックとTensorFlowSummary APIを使用して、デフォルトとカスタムのスカラーを視覚化する方法を学習します。

セットアップ

# 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を使用して、エポック間でトレーニングとテストの損失がどのように変化するかを観察します。うまくいけば、トレーニングとテストの損失が時間の経過とともに減少し、その後安定したままになることがわかります。

まず、 y = 0.5x +2の線にほぼ沿って1000個のデータポイントを生成します。これらのデータポイントをトレーニングセットとテストセットに分割します。あなたの希望は、ニューラルネットがこの関係を学習することです。

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. KerasTensorBoardコールバックを作成する
  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(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のUIが起動するまで数秒待ちます。

%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]]

悪くない!

カスタムスカラーのロギング

動的学習率などのカスタム値をログに記録する場合はどうなりますか?これを行うには、TensorFlow SummaryAPIを使用する必要があります。

回帰モデルを再トレーニングし、カスタム学習率を記録します。方法は次のとおりです。

  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]]