![]() | ![]() | ![]() |
機械学習では、何かを改善するには、それを測定できる必要があることがよくあります。 TensorBoardは、機械学習ワークフロー中に必要な測定と視覚化を提供するためのツールです。これにより、損失や精度などの実験指標の追跡、モデルグラフの視覚化、低次元空間への埋め込みの投影などが可能になります。
このクイックスタートでは、TensorBoardをすばやく開始する方法を説明します。このWebサイトの残りのガイドでは、特定の機能の詳細を説明していますが、その多くはここには含まれていません。
# Load the TensorBoard notebook extension
%load_ext tensorboard
import tensorflow as tf
import datetime
# Clear any logs from previous runs
rm -rf ./logs/
例としてMNISTデータセットを使用して、データを正規化し、画像を10のクラスに分類するための単純なKerasモデルを作成する関数を記述します。
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11493376/11490434 [==============================] - 0s 0us/step
Keras Model.fit()でTensorBoardを使用する
tf.keras.callbacks.TensorBoard
のModel.fit()を使用してトレーニングする場合、 tf.keras.callbacks.TensorBoard
コールバックを追加すると、ログが確実に作成および保存されます。さらに、 histogram_freq=1
エポックごとにヒストグラム計算を有効にします(これはデフォルトでオフになっています)
タイムスタンプ付きのサブディレクトリにログを配置して、さまざまなトレーニング実行を簡単に選択できるようにします。
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
Train on 60000 samples, validate on 10000 samples Epoch 1/5 60000/60000 [==============================] - 15s 246us/sample - loss: 0.2217 - accuracy: 0.9343 - val_loss: 0.1019 - val_accuracy: 0.9685 Epoch 2/5 60000/60000 [==============================] - 14s 229us/sample - loss: 0.0975 - accuracy: 0.9698 - val_loss: 0.0787 - val_accuracy: 0.9758 Epoch 3/5 60000/60000 [==============================] - 14s 231us/sample - loss: 0.0718 - accuracy: 0.9771 - val_loss: 0.0698 - val_accuracy: 0.9781 Epoch 4/5 60000/60000 [==============================] - 14s 227us/sample - loss: 0.0540 - accuracy: 0.9820 - val_loss: 0.0685 - val_accuracy: 0.9795 Epoch 5/5 60000/60000 [==============================] - 14s 228us/sample - loss: 0.0433 - accuracy: 0.9862 - val_loss: 0.0623 - val_accuracy: 0.9823 <tensorflow.python.keras.callbacks.History at 0x7fc8a5ee02e8>
コマンドラインまたはノートブックエクスペリエンス内でTensorBoardを起動します。 2つのインターフェースは一般的に同じです。ノートブックでは、 %tensorboard
使用します。コマンドラインで、「%」を指定せずに同じコマンドを実行します。
%tensorboard --logdir logs/fit
表示されているダッシュボードの概要(上部のナビゲーションバーのタブ):
- Scalarsダッシュボードは、エポックごとに損失とメトリックがどのように変化するかを示します。これを使用して、トレーニング速度、学習率、およびその他のスカラー値を追跡することもできます。
- グラフダッシュボードは、モデルを視覚化するのに役立ちます。この場合、レイヤーのKerasグラフが表示され、正しく構築されていることを確認できます。
- 分布とヒストグラムのダッシュボードには、時間の経過に伴うテンソルの分布が表示されます。これは、重みとバイアスを視覚化し、それらが期待どおりに変化していることを確認するのに役立ちます。
他のタイプのデータをログに記録すると、追加のTensorBoardプラグインが自動的に有効になります。たとえば、Keras TensorBoardコールバックを使用すると、画像や埋め込みもログに記録できます。右上にある[非アクティブ]ドロップダウンをクリックすると、TensorBoardで使用できる他のプラグインを確認できます。
TensorBoardを他の方法で使用する
tf.GradientTape()
などのメソッドを使用してトレーニングする場合は、 tf.summary
を使用して必要な情報をログに記録します。
上記と同じデータセットを使用しますが、バッチ機能を利用するには、tf.data.Dataset
に変換します。
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
train_dataset = train_dataset.shuffle(60000).batch(64)
test_dataset = test_dataset.batch(64)
トレーニングコードは高度なクイックスタートチュートリアルに従いますが、メトリックをTensorBoardに記録する方法を示しています。損失とオプティマイザーを選択します。
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
トレーニング中に値を累積し、いつでもログに記録するために使用できるステートフルメトリックを作成します。
# Define our metrics
train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('train_accuracy')
test_loss = tf.keras.metrics.Mean('test_loss', dtype=tf.float32)
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy('test_accuracy')
トレーニングおよびテスト機能を定義します。
def train_step(model, optimizer, x_train, y_train):
with tf.GradientTape() as tape:
predictions = model(x_train, training=True)
loss = loss_object(y_train, predictions)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
train_loss(loss)
train_accuracy(y_train, predictions)
def test_step(model, x_test, y_test):
predictions = model(x_test)
loss = loss_object(y_test, predictions)
test_loss(loss)
test_accuracy(y_test, predictions)
サマリーライターを設定して、サマリーを別のログディレクトリのディスクに書き込みます。
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = 'logs/gradient_tape/' + current_time + '/train'
test_log_dir = 'logs/gradient_tape/' + current_time + '/test'
train_summary_writer = tf.summary.create_file_writer(train_log_dir)
test_summary_writer = tf.summary.create_file_writer(test_log_dir)
トレーニングを開始します。 tf.summary.scalar()
を使用して、サマリーライターのスコープ内でトレーニング/テスト中にメトリック(損失と精度tf.summary.scalar()
をログに記録し、サマリーをディスクに書き込みます。ログに記録するメトリックとその頻度を制御できます。他のtf.summary
関数を使用すると、他のタイプのデータをログに記録できます。
model = create_model() # reset our model
EPOCHS = 5
for epoch in range(EPOCHS):
for (x_train, y_train) in train_dataset:
train_step(model, optimizer, x_train, y_train)
with train_summary_writer.as_default():
tf.summary.scalar('loss', train_loss.result(), step=epoch)
tf.summary.scalar('accuracy', train_accuracy.result(), step=epoch)
for (x_test, y_test) in test_dataset:
test_step(model, x_test, y_test)
with test_summary_writer.as_default():
tf.summary.scalar('loss', test_loss.result(), step=epoch)
tf.summary.scalar('accuracy', test_accuracy.result(), step=epoch)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print (template.format(epoch+1,
train_loss.result(),
train_accuracy.result()*100,
test_loss.result(),
test_accuracy.result()*100))
# Reset metrics every epoch
train_loss.reset_states()
test_loss.reset_states()
train_accuracy.reset_states()
test_accuracy.reset_states()
Epoch 1, Loss: 0.24321186542510986, Accuracy: 92.84333801269531, Test Loss: 0.13006582856178284, Test Accuracy: 95.9000015258789 Epoch 2, Loss: 0.10446818172931671, Accuracy: 96.84833526611328, Test Loss: 0.08867532759904861, Test Accuracy: 97.1199951171875 Epoch 3, Loss: 0.07096975296735764, Accuracy: 97.80166625976562, Test Loss: 0.07875105738639832, Test Accuracy: 97.48999786376953 Epoch 4, Loss: 0.05380449816584587, Accuracy: 98.34166717529297, Test Loss: 0.07712937891483307, Test Accuracy: 97.56999969482422 Epoch 5, Loss: 0.041443776339292526, Accuracy: 98.71833038330078, Test Loss: 0.07514958828687668, Test Accuracy: 97.5
TensorBoardをもう一度開きます。今回は、新しいログディレクトリをポイントします。トレーニングの進行中にトレーニングを監視するためにTensorBoardを開始することもできます。
%tensorboard --logdir logs/gradient_tape
それでおしまい!これで、 tf.summary
コールバックとtf.summaryの両方でTensorBoardを使用して、より多くのカスタムシナリオをtf.summary
する方法を見てきました。
TensorBoard.dev:ML実験結果をホストして共有する
TensorBoard.devは、TensorBoardログをアップロードし、学術論文、ブログ投稿、ソーシャルメディアなどで全員と共有できるパーマリンクを取得できる無料の公共サービスです。これにより、再現性とコラボレーションが向上します。
TensorBoard.devを使用するには、次のコマンドを実行します。
!tensorboard dev upload \
--logdir logs/fit \
--name "(optional) My latest experiment" \
--description "(optional) Simple comparison of several hyperparameters" \
--one_shot
この呼び出しでは、パーセントプレフィックス( %
)ではなく感嘆プレフィックス( !
)を使用してシェルを呼び出し、colabマジックを呼び出すことに注意してください。コマンドラインからこのコマンドを呼び出す場合、どちらのプレフィックスも必要ありません。
TensorBoard.devの使用方法の詳細については、 https: //tensorboard.dev/#get-startedを参照してください。