机器学习通常波及在训练期间可视化和度量模型的性能。有许多工具可用于此工作。在本文中,咱们将重点介绍 TensorFlow 的开源工具套件,称为 TensorBoard,尽管他是 TensorFlow 的一部分,然而能够独立装置,并且服务于 Pytorch 等其余的框架。
什么是 TensorBoard?
TensorBoard 是一组用于数据可视化的工具。它蕴含在风行的开源机器学习库 Tensorflow 中。TensorBoard 的次要性能包含:
- 可视化模型的网络架构
- 跟踪模型指标,如损失和准确性等
- 查看机器学习工作流程中权重、偏差和其余组件的直方图
- 显示非表格数据,包含图像、文本和音频
- 将高维嵌入投影到低维空间
TensorBoard 算是蕴含在 TensorFlow 中的一个子服务。TensorFlow 库是一个专门为机器学习利用程序设计的开源库。Google Brain 于 2011 年构建了较早的 DistBelief 零碎。随着其用户群的快速增长,它被简化并重构为咱们当初称为 Tensorflow 的库。TensorFlow 随后于 2015 年向公众公布。TensorBoard 刚呈现时只能用于查看 TensorFlow 的指标和 TensorFlow 模型的可视化,然而起初通过多方的致力其余深度学习框架也能够应用 TensorBoard 的性能,例如 Pytorch 曾经摈弃了自家的 visdom(听到过这个名字的人应该都不多了吧)而全面反对 TensorBoard。
如何装置 TensorBoard
TensorBoard 蕴含在 TensorFlow 库中,所以如果咱们胜利装置了 TensorFlow,咱们也能够应用 TensorBoard。要独自装置 TensorBoard 能够应用如下命令:
pip install tensorboard
须要留神的是:因为 TensorBoard 依赖 Tensorflow,所以会主动装置 Tensorflow 的最新版
启动 TensorBoard
1、本地启动 TensorBoard
要启动 TensorBoard,关上终端或命令提示符并运行:
tensorboard --logdir=<directory_name>
将
directory_name
标记替换为保留数据的目录。默认是“logs”。
运行此命令后,咱们将看到以下提醒:
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass –bind_allTensorBoard 2.2.0 at http://localhost:6006/ (Press CTRL+C to quit)
这阐明 TensorBoard 曾经胜利上线。咱们能够用浏览器关上 http://localhost:6006/ 查看。
当页面第一次关上时,咱们将看到如下内容:
2、在 Jupyter Notebooks 中应用 TensorBoard
如果想在 Jupyter Notebooks 中应用 TensorBoard,能够应用以下命令:
%load_ext tensorboard
运行这行代码将加载 TensorBoard 并容许咱们将其用于可视化。加载扩大后,咱们当初能够启动 TensorBoard:
%tensorboard --logdir logs
3、将 TensorBoard 与 Google Colab 一起应用
应用 Google Colab 时,一旦创立一个新的 notebook,TensorFlow 和 TensorBoard 就曾经装置好了。要运行它,咱们能够遵循与 Jupyter Notebooks 概述的雷同过程。只需在笔记本单元格中输出以下内容:
%load_ext tensorboard
咱们会看到 TensorBoard 应用程序。
应用 TensorBoard
咱们曾经启动并运行 TensorBoard,上面以 TensorFlow 为例介绍如何应用 TensorBoard
1、本地应用 TensorBoard
TensorBoard callback 在 TensorFlow 库提供的回调。它是如何工作的?
依据 Keras 文档,回调是能够在训练的各个阶段执行操作的对象。当咱们想在训练过程中的特定工夫节点(例如,在每次 epoch/batch 之后)主动执行工作时,咱们都能够应用回调。
如何应用 TensorBoard callback 的疾速示例。
首先,应用 TensorFlow 创立一个简略的模型,并在 MNIST 数据集上对其进行训练。
import tensorflow as tf
# Load and normalize MNIST data
mnist_data = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist_data.load_data()
X_train, X_test = X_train / 255.0, X_test / 255.0
# Define the model
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
# Compile the model
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
编译模型后,咱们须要创立一个回调并在调用
fit
办法时应用。
tf_callback = tf.keras.callbacks.TensorBoard(log_dir="./logs")
当初能够在模型上调用
fit
办法时将回调作为参数传入。在工作目录中创立了
logs
文件夹,并将其作为参数传递给
log_dir
。上面调用 fit 并将其作为回调传入。
model.fit(X_train, y_train, epochs=5, callbacks=[tf_callback])
调用 fit 办法后,进入 localhost:6006 查看后果。
咱们看到了一个两个不同的图表。第一个显示了模型在每个 epoch 的准确性。第二个显示的损失。
2、近程运行 TensorBoard
除了在本地运行之外,还能够近程运行 TensorBoard。如果咱们在具备更弱小 GPU 的不同服务器之间进行并行训练,也能够本地查看后果。
首先,应用 SSH 并将近程服务器的端口映射到本地的计算机。
ssh -L 6006:127.0.0.1:6006 username@server_ip
而后只须要在近程服务器上启动 TensorBoard。在近程服务器上运行:
tensorboard --logdir=’logs’--port=6006
咱们能够拜访 localhost:6006 来查看近程的 TensorBoard。
TensorBoard 仪表板
TensorBoard 仪表板由用于可视化数据的不同组件组成。咱们将深入研究每一个组件。
1、TensorBoard Scalars
机器学习过程须要跟踪与模型性能相干的不同指标。这对于疾速发现问题并确定模型是否适度拟合等十分重要。
应用 TensorBoard 的 Scalars Dashboard,能够可视化这些指标并更轻松地调试模型。第一个示例,在 MNIST 数据集上绘制模型的损失和准确性,应用的就是 Scalars。
创立回调、指定一个目录来记录数据、在调用 fit 办法时传递回调。这种形式实用于大多数状况,然而如果咱们想要记录一个不容易取得的自定义 Scalars 怎么办?能够应用 TensorFlow 的 Summary API。这个非凡的 API 用于收集摘要数据,以便当前的可视化和剖析。
让咱们看一个例子来更好地了解这一点。应用一个简略的正弦波作为想要在 TensorBoard 上显示的 Scalars。
# Specify a directory for logging data
logdir = "./logs"
# Create a file writer to write data to our logdir
file_writer = tf.summary.create_file_writer(logdir)
# Loop from 0 to 199 and get the sine value of each number
for i in range(200):
with file_writer.as_default():
tf.summary.scalar('sine wave', np.math.sin(i), step=i)
tf.summary 中的 scalar 办法,能够记录简直任何咱们想要的标量数据。应用 TensorBoard 时,不仅限于损失和指标。运行上述命令后仪表板的输入如下:
2、TensorBoard Images
在解决图像数据时,如果心愿查看数据查找问题,或者查看样本以确保数据品质,则能够应用 TensorBoard 的 Image Summary API。
持续回到 MNIST 数据集,看看图像在 TensorBoard 中是如何显示的:
# Load and normalize MNIST data
mnist_data = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist_data.load_data()
X_train, X_test = X_train / 255.0, X_test / 255.0
将数据的第一张图像并将其可视化。
# Reshape the first image
img = np.reshape(X_train[0], (-1, 28, 28, 1))
# Specify a directory for logging data
logdir = "./logs"# Create a file writer to write data to our logdir
file_writer = tf.summary.create_file_writer(logdir)
# With the file writer, log the image data
with file_writer.as_default():
tf.summary.image("Training data", img, step=0)
查看图像须要抉择 IMAGES 选项:
3、TensorBoard Graphs
所有模型都能够看作是一个计算图。有时很难通过独自查看代码来理解模型的体系结构。对其进行可视化能够很容易看到模型的构造,也可能确保应用的架构是咱们想要或设计的。
上面可视化之前用于 MNIST 数据集的模型。上面是模型定义。
# Define the model
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
还须要创立一个 TensorBoard 回调并在训练模型时应用它。
# Create a callback
tf_callback = tf.keras.callbacks.TensorBoard(log_dir="./logs")
# Pass in the callback when fitting the model
model.fit(X_train, y_train, epochs=5, callbacks=[tf_callback])
训练后,查看 Graphs 选项:
这里显示的是模型的操作级图(逐层显示模型架构)。这对于查看咱们的模型是否正确以及每一层是否合乎咱们的预期十分重要。该图的数据从底部流向顶部。
如果须要,还能够查看概念图。在侧边栏中找到 Tag 题目并将其更改为 Keras:
能够查看模型的构造是否正确。图中的节点表明模型是一个程序模型。
4、TensorBoard Distributions and Histograms 散布和直方图
TensorBoard 散布和直方图是跟踪模型另一种好办法。应用官网提供的回调,在训练后 TensorBoard 上会显示几个选项。如果咱们转到 Distributions 选项卡,将看到如下图:
这组图表显示了形成模型的张量。在每个图的程度轴上显示 epoch 数,在垂直轴上显示了每个张量的值。这些图表基本上显示了这些张量如何随着训练的进行而随工夫变动。较暗的区域显示值在某个区域停留了更长的工夫(没更新)。如果放心模型权重在每个 epoch 都没有正确更新,能够应用此选项发现这些问题。
咱们在 Histograms 选项上看到了一组不同的图表,它们示意模型的张量。
这些图显示了模型中张量的不同视图。每个图都有五个互相重叠的直方图,代表训练过的五个 epoch 中的每一个。它们显示了张量权重偏向于集中在哪个区域的信息。这对于调试模型的行为,发现异常十分有用。
5、TEXT
文本是创立机器学习模型时罕用的数据类型。很多时候,很难将文本数据可视化。TensorBoard 能够应用 Text Summary API 轻松地可视化文本数据。让咱们看看它是如何工作的。
应用文本 Hello World 作为一个简略的示例。
# Our sample text
sample_text = "Hello world!"
# Specify a directory for logging data
logdir = "./logs/text/"
# Create a file writer to write data to our logdir
file_writer = tf.summary.create_file_writer(logdir)
# With the file writer, log the text data
with file_writer.as_default():
tf.summary.text("sample_text", sample_text, step=0)
TensorBoar 的 Text 选项卡中输出的文本。
6、TensorBoard projector 投影
深度学习模型通常实用于具备大量维度的数据。可视化这些维度能够让咱们深刻理解进步模型的性能。TensorBoard 提供一个嵌入的投影,能够轻松的可视化高维数据。
首先,须要从 TensorBoard 导入投影插件。
from tensorboard.plugins import projector
咱们将应用 IMDB 电影评论数据集来可视化嵌入。
import os
import tensorflow as tf
import tensorflow_datasets as tfds
# Load the data
(train_data, test_data), info = tfds.load(
"imdb_reviews/subwords8k",
split=(tfds.Split.TRAIN, tfds.Split.TEST),
with_info=True,
as_supervised=True,)encoder = info.features["text"].encoder
# Create training batches
train_batches = train_data.shuffle(1000).padded_batch(10, padded_shapes=((None,), ())
)
# Create testing batches
test_batches = test_data.shuffle(1000).padded_batch(10, padded_shapes=((None,), ())
)
# Get the first batch
train_batch, train_labels = next(iter(train_batches))
在下面的代码中,加载并预处理数据,上面代码将创立一个简略的模型来为文本生成嵌入,训练模型 epoch=1 并可视化后果。
# Create an embedding layer
embedding_dim = 16
embedding = tf.keras.layers.Embedding(
encoder.vocab_size,
embedding_dim)
# Configure the embedding layer as part of a Keras model
model = tf.keras.Sequential([
embedding,
tf.keras.layers.GlobalAveragePooling1D(),
tf.keras.layers.Dense(16, activation="relu"),
tf.keras.layers.Dense(1),])
# Compile the model
model.compile(
optimizer="adam",
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=["accuracy"],
)
# Train the model for a single epoch
history = model.fit(train_batches, epochs=1, validation_data=test_batches)
拟合模型时须要将数据写入
logdir
,相似于咱们在后面局部中所做的。
# Set up a log dir, just like in previous sections
log_dir='/logs/imdb-example/'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# Save labels separately in a line-by-line manner.
with open(os.path.join(log_dir, 'metadata.tsv'), "w") as f:
for subwords in encoder.subwords:
f.write("{}\n".format(subwords))
# Fill in the rest of the labels with "unknown"
for unknown in range(1, encoder.vocab_size - len(encoder.subwords)):
f.write("unknown #{}\n".format(unknown))
# Save the weights we want to analyze as a variable
weights = tf.Variable(model.layers[0].get_weights()[0][1:])
# Create a checkpoint from embedding, the filename and key are the
# name of the tensor
checkpoint = tf.train.Checkpoint(embedding=weights)
checkpoint.save(os.path.join(log_dir, "embedding.ckpt"))
# Set up config
config = projector.ProjectorConfig()
embedding = config.embeddings.add()
# The name of the tensor will be suffixed by
# `/.ATTRIBUTES/VARIABLE_VALUE`
embedding.tensor_name = "embedding/.ATTRIBUTES/VARIABLE_VALUE"
embedding.metadata_path = 'metadata.tsv'
projector.visualize_embeddings(log_dir, config)
在 TensorBoard 右上角的下拉菜单中的 projector 选项能够查看可视化的嵌入:
TensorBoard 插件
TensorBoard 还提供了很多不同的插件能够帮忙咱们实现各种不同的需要,上面介绍一些十分有用的插件
1、TensorFlow Profiler
TensorFlow Profiler 用于剖析 TensorFlow 代码的执行状况。这很重要,因为咱们想晓得正在运行的模型是否失去了适当的优化。这里须要装置了 Profiler 插件。
pip install tensorboard_plugin_profile
创立一个模型,而后在拟合时应用 TensorBoard 回调。
# Create a callback
tf_callback = tf.keras.callbacks.TensorBoard(log_dir="./logs")
# Pass in the callback when fitting the model
model.fit(X_train, y_train, epochs=5, callbacks=[tf_callback])
当进入 TensorBoard 页面时,咱们将看到一个名为 Profile 的新选项。切换到此选项,将看到相似于下图的内容。
这是有很多信息的概览页面,所以让咱们合成一下:
- 页面右上角有一个 Step-time 图,显示训练过程的哪些局部破费的工夫最多。能够看到模型不是输出绑定的,很多工夫都花在了启动内核上。
- 还看到了一些优化模型性能的倡议
- 在咱们的例子中,计算都没有应用 16 位操作,能够通过转换进步性能。
在左侧,有一个名为“Tools”的下拉菜单。能够抉择 Trace Viewer 来查看模型性能的瓶颈呈现在哪里。Trace Viewer 显示剖析期间产生的 GPU 和 CPU 事件的工夫线。
垂直轴显示具备不同跟踪事件的事件组。从 CPU 和 GPU 收集跟踪事件。每个矩形都是一个独自的跟踪事件。能够单击其中任何一个来关注跟踪事件并对其进行剖析。还能够拖动光标一次抉择多个事件。
在“Tools”下拉列表中,还能够应用“input_pipeline_analyzer”,能够依据收集的数据查看模型的输出管道性能。
这里能够通知咱们模型是否是输出绑定的。例如上图意味着模型破费大量工夫期待输出而不是运行推理。它还能够通知咱们管道中的哪个阶段最慢。
为了更深刻地理解不同的 TensorFlow 操作,还有另一个名为 TensorFlow stats 选项,能够显示模型正在执行的不同操作的细分。
运行模型时,饼图显示了正在计算的不同操作。包含编码、矩阵乘法等计算,以及须要执行的许多其余推理操作。在优化模型时,能够关注其中哪些破费最多的工夫的操作。
2、Fairness Indicators Dashboard
Fairness Indicators Dashboard 帮忙咱们计算二进制和多类分类器的不同偏心指标。能够评估模型在不同运行中的公平性,并比拟它们在不同组之间的性能。
要开始在咱们的数据上应用 Fairness Indicators Dashboard,须要装置一些依赖:
pip install fairness_indicators
pip install tensorboard-plugin-fairness-indicators
导入插件:
from tensorboard_plugin_fairness_indicators import summary_v2
summary_v2
的应用办法与在后面章节中将数据记录到
logdir
时应用
tf.summary
一样。
# Create a file writer to write data to our logdir
file_writer = tf.summary.create_file_writer(logdir)
# Write data to our result directory
with file_writer.as_default():
summary_v2.FairnessIndicators(result_dir, step=1)
后果如下:
在 TensorBoard 中会有一个新的 Fairness Indicators 选项卡。在这里,能够查看模型预测的不同类别值的细分以及它们与基线的百分比差别,以确定模型是否偏心。
应用 What-If 工具理解模型
TensorBoard 附带一个假如剖析工具 (WIT),能够帮忙咱们了解黑盒分类和回归模型。应用这个工具,能够对一组数据进行预测,并以不同的形式可视化后果。
也能够手动或以编程形式编辑示例,查看更改它们如何影响模型的预测。
要应用 WIT 须要提供模型和数据,如果想要更深刻的摸索模型必须带有分类、回归或预测 API 的 TensorFlow Serving 进行部署。
另外要进行预测的数据集应该以 TFRecord 格局存储,并且能够由咱们运行 TensorBoard 的服务器拜访。
设置实现后,转到 TensorBoard Dashboard 并从页面右上角的下拉菜单中抉择 What-If Tool 选项。应该看到一个如下所示的页面:
第一个字段是提供模型的推理地址。如果在本地提供 TensorFlow Serving,这将等于
localhost:port
。还须要输出模型名称、可选的模型版本和模型的签名。
输出数据所在的门路。下面提到的
TFRecord
文件。
最初单击 Accept 按钮,咱们就会跳转到后果页面。
数据集中的每个点当初都依据它们的类进行着色。能够对数据进行分箱、分桶、创立散点图和对数据点进行不同着色等操作。
将 TensorBoard 数据作为 DataFrame 进行拜访
TensorBoard 次要是一个用于可视化数据的 GUI 工具。然而一些用户可能心愿以编程形式与 TensorBoard 数据进行交互,例如自定义可视化和长期的剖析。所以能够将 TensorBoard 数据作为 DataFrame 拜访,这样能够在独自的程序中应用。
这个 API 仍处于试验阶段,因而可能后续版本还会有重大的更改。
咱们只需将“logdir”上传到 TensorBoard.dev 能力应用此性能,这部分咱们须要一些依赖项。首先须要确认曾经装置了 Pandas。还须要一种可视化数据的办法。罕用的库是 Matplotlib 和 Seaborn。
TensorBoard.dev 上的 TensorBoard
logdir
被称为 experiment。每个 experiment 都有一个惟一的 ID,咱们能够应用它以编程形式拜访数据。
# Change the experiment id to our own
experiment_id = "insert experiment ID here"
# Get the experiment using the id
experiment = tb.data.experimental.ExperimentFromDev(experiment_id)
# Save the scalars to a dataframe
df = experiment.get_scalars()
当初 df 中领有所有可用的 logdir 数据。
当初能够像操作任何其余 DataFrame 一样操作它来进一步剖析。
将 TensorBoard 与 PyTorch 联合应用
PyTorch 是另一个深受钻研人员欢送的深度学习框架。PyTorch 当初也曾经反对 TensorBoard 了。
在应用 TensorFlow 时,应用 Summary API 创立了将数据记录到
logdir
文件夹的对象。在应用 PyTorch 时,官网也提供了相似的 API。
# Import the summary writer
from torch.utils.tensorboard import SummaryWriter# Create an instance of the object
writer = SummaryWriter()
这样就能够应用与 TensorFlow 雷同的形式解决的雷同 MNIST 数据集。
import torch
import torchvision
from torchvision import datasets, transforms
# Compose a set of transforms to use later on
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# Load in the MNIST dataset
trainset = datasets.MNIST(
'mnist_train',
train=True,
download=True,
transform=transform
)
# Create a data loader
trainloader = torch.utils.data.DataLoader(
trainset,
batch_size=64,
shuffle=True
)
# Get a pre-trained ResNet18 model
model = torchvision.models.resnet18(False)
# Change the first layer to accept grayscale images
model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
# Get the first batch from the data loader
images, labels = next(iter(trainloader))
# Write the data to TensorBoard
grid = torchvision.utils.make_grid(images)
writer.add_image('images', grid, 0)
writer.add_graph(model, images)
writer.close()
运行此程序后,转到 TensorBoard 并查看保留的输入。
失去了与应用 TensorFlow 时类似的输入。
应用 TensorBoard.dev 上传和共享后果
TensorBoard.dev 是 TensorBoard 的一个组件,它容许咱们在网络上托管机器学习后果。对于那些渴望展现他们的成绩的人来说这是适宜的工具。
能够应用以下命令从终端或命令提示符将其上传到 TensorBoard.dev:
tensorboard dev upload --logdir {logs}
请确保不要上传任何敏感数据!
应用 Google 帐户受权上传后,会取得一个代码。输出代码后,返回一个指向上传的 TensorBoard 日志的链接。
当初能够与任何人分享这个链接,让他们看到咱们所做的工作。
应用 TensorBoard 的限度
只管 TensorBoard 附带了许多用于可视化咱们的数据和模型的工具,但它也有其局限性。
1、不足用户治理
TensorBoard 没有用户的概念,因为它在繁多环境中工作。也不能在同一台机器上运行多个 TensorBoard 实例,因而如果咱们同时解决多个我的项目,应用起来可能会很有挑战性。
2、难以在团队环境中应用
与上述限度相似,TensorBoard 实例不能在其余用户之间共享。如果有几个人在同一个我的项目上工作,须要一个集中的 dashboard 和每个人的独自工作区。TensorBoard 不反对此性能。
3、不反对数据和模型版本控制
在调整模型或设置超参数值时,咱们须要保留不同的模型和训练数据版本。尤其是在进行试验时,心愿同时查看不同版本的模型和数据。TensorBoard 不能将某个运行或一组数据标记为特地重要。
4、执行大量运行时会呈现问题
TensorBoard 并没有思考到大量间断运行。如果持续运行模型并重复记录数据,将遇到 UI 问题,使界面难以使用。
5、不反对可视化视频文件和非结构化数据格式
某些数据类型无奈在 TensorBoard 中可视化。特地是罕用的视频数据。如果工作波及对此类数据进行建模,则很难应用 TensorBoard。
总结
本文曾经具体介绍了 TensorBoard,它是用于可视化机器学习模型的数据可视化工具包。本文介绍了 TensorBoard 所有根本组件以及新的试验性功能,例如假如工具和偏心指标组件。借助这些性能,能够可能轻松查看和调试咱们训练的模型的外部工作,并最终进步它们的性能。
https://www.overfit.cn/post/68f56127b3094cae88010203beba76d8
作者:Zito Relova