在 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
行魔法。在命令行中,运行相同的命令,但没有 "%".
%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,以实现更自定义的场景。