TensorBoard 入門

在 TensorFlow.org 上檢視 在 Google Colab 中執行 在 GitHub 上檢視原始碼 下載筆記本

在機器學習中,為了改進某些事物,您通常需要能夠衡量它。TensorBoard 是一種工具,可在機器學習工作流程期間提供所需的衡量和視覺化功能。它能夠追蹤實驗指標 (例如損失和準確度)、視覺化模型圖、將嵌入投影到較低維度的空間,以及更多功能。

這個快速入門指南將示範如何快速開始使用 TensorBoard。本網站的其餘指南提供有關特定功能的更多詳細資訊,其中許多功能未包含在此處。

# Load the TensorBoard notebook extension
%load_ext tensorboard
import tensorflow as tf
import datetime
# Clear any logs from previous runs
rm -rf ./logs/

MNIST 資料集為例,將資料標準化,並編寫一個函數,以建立一個簡單的 Keras 模型,將圖片分類為 10 個類別。

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), name='layers_flatten'),
    tf.keras.layers.Dense(512, activation='relu', name='layers_dense'),
    tf.keras.layers.Dropout(0.2, name='layers_dropout'),
    tf.keras.layers.Dense(10, activation='softmax', name='layers_dense_2')
  ])
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step

將 TensorBoard 與 Keras Model.fit() 搭配使用

使用 Keras 的 Model.fit() 進行訓練時,新增 tf.keras.callbacks.TensorBoard 回呼可確保建立和儲存記錄。此外,使用 histogram_freq=1 (預設為關閉) 啟用每個 epoch 的直方圖計算

將記錄放在具有時間戳記的子目錄中,以便輕鬆選取不同的訓練執行。

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。這兩個介面大致相同。在筆記本中,使用 %tensorboard 行指令 magic。在命令列中,執行相同的命令,但不含 "%"。

%tensorboard --logdir logs/fit

簡要概述此範例中建立的視覺化效果,以及儀表板 (頂端導覽列中的索引標籤),您可以在其中找到這些視覺化效果

  • 純量顯示損失和指標如何隨每個 epoch 變化。您也可以使用它們來追蹤訓練速度、學習率和其他純量值。純量可以在時間序列純量儀表板中找到。
  • 圖形可協助您視覺化模型。在此範例中,會顯示 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 函數可讓您記錄其他資料類型。

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

就是這樣!您現在已經了解如何透過 Keras 回呼以及透過 tf.summary 用於更多自訂情境來使用 TensorBoard。