在 TensorFlow.org 上檢視
|
在 Google Colab 中執行
|
在 GitHub 上檢視原始碼
|
下載筆記本
|
在機器學習中,為了改進某些東西,通常需要能夠對其進行衡量。TensorBoard 是一個用於提供機器學習工作流程中所需測量和視覺化的工具。它支援跟蹤損失 (loss) 和準確率 (accuracy) 等實驗指標、視覺化模型圖、將嵌入 (embeddings) 投影到低維空間等等。
本快速入門指南將展示如何快速上手 TensorBoard。本網站的其他指南提供了關於特定功能的更多詳細資訊,其中許多功能未包含在此處。
# Load the TensorBoard notebook extension
%load_ext tensorboard
import tensorflow as tf
import datetime
# Clear any logs from previous runsrm -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.Input(shape=(28, 28), name='layers_input'),
tf.keras.layers.Flatten(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>
透過命令列或 Notebook 環境啟動 TensorBoard。這兩種介面的功能基本相同。在 Notebook 中,使用 %tensorboard 行魔法命令。在命令列中,執行相同的命令但不加“%”。
%tensorboard --logdir logs/fit

本示例中建立的視覺化效果以及可以找到它們的資料面板(頂部導航欄中的選項卡)的簡要概述。
- 標量 (Scalars) 顯示了損失和指標隨每個 epoch 的變化情況。您還可以使用它們來跟蹤訓練速度、學習率和其他標量值。標量可以在 Time Series(時間序列)或 Scalars(標量)面板中找到。
- 圖 (Graphs) 幫助您視覺化模型。在本例中,顯示了 Keras 層圖,這有助於確保模型構建正確。圖可以在 Graphs(圖)面板中找到。
- 直方圖 (Histograms) 和 分佈 (Distributions) 顯示了 Tensor 隨時間的分佈情況。這對於視覺化權重和偏差,並驗證它們是否按預期變化非常有用。直方圖可以在 Time Series(時間序列)或 Histograms(直方圖)面板中找到。分佈可以在 Distributions(分佈)面板中找到。
當您記錄其他型別的資料時,額外的 TensorBoard 面板會自動啟用。例如,Keras TensorBoard 回撥函式還允許您記錄影像和嵌入。透過點選右上角的“inactive”(未啟用)下拉選單,您可以檢視 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)
設定摘要寫入器 (summary writers),將摘要寫入磁碟中的不同日誌目錄。
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_state()
test_loss.reset_state()
train_accuracy.reset_state()
test_accuracy.reset_state()
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。
在 TensorFlow.org 上檢視
在 Google Colab 中執行
在 GitHub 上檢視原始碼
下載筆記本