如何使用 Keras 的 Tensorboard 回调?

Posted

技术标签:

【中文标题】如何使用 Keras 的 Tensorboard 回调?【英文标题】:How do I use the Tensorboard callback of Keras? 【发布时间】:2017-06-26 00:28:54 【问题描述】:

我已经用 Keras 构建了一个神经网络。我会通过 Tensorboard 可视化它的数据,因此我使用了:

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,
                            write_graph=True, write_images=True)

如keras.io 中所述。当我运行回调时,我得到<keras.callbacks.TensorBoard at 0x7f9abb3898>,但我的文件夹“Graph”中没有任何文件。我使用这个回调的方式有问题吗?

【问题讨论】:

我建议将histogram_freq 设置为1。 “histogram_freq:计算模型层的激活直方图的频率(以时期为单位)。如果设置为 0,则不会计算直方图。” 注意:“/Graph”在根目录中创建一个目录,而“./Graph”在工作目录中创建一个。 @MattKleinsmith 如果设置为 0,则不会通过验证数据计算模型层的激活和权重直方图,但仍会记录指标。 我认为最好给 logdir 赋予唯一的名称看看***.com/a/54949146/1179925 【参考方案1】:
keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

这一行创建了一个回调 Tensorboard 对象,您应该捕获该对象并将其提供给模型的 fit 函数。

tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
...
model.fit(...inputs and parameters..., callbacks=[tbCallBack])

通过这种方式,您将回调对象提供给函数。它将在训练期间运行,并输出可与 tensorboard 一起使用的文件。

如果您想可视化训练期间创建的文件,请在终端中运行

tensorboard --logdir path_to_current_dir/Graph 

希望这会有所帮助!

【讨论】:

当 write_images=False 时我使用了这个并出现以下错误 InvalidArgumentError(参见上文的回溯):张量必须是 4-D,最后一个暗淡为 1、3 或 4,而不是 [1,3,3,256,256,1] [[Node: conv_3.2_2/ kernel_0_1 = ImageSummary[T=DT_FLOAT, bad_color=Tensor, max_images=3, _device="/job:localhost/replica:0/task:0/ cpu:0"](conv_3.2_2/kernel_0_1/tag, ExpandDims_50)]] 当 True Any Idea 时缺少 dtype = float 的占位符? 标量选项卡仍然是空的,尽管我可以在图表选项卡上看到我的模型架构? 这只会产生用于训练损失和准确性的标量。你如何对传递给 fit 函数的 validation_data 做同样的事情?【参考方案2】:

这就是你使用TensorBoard callback的方式:

from keras.callbacks import TensorBoard

tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0,
                          write_graph=True, write_images=False)
# define model
model.fit(X_train, Y_train,
          batch_size=batch_size,
          epochs=nb_epoch,
          validation_data=(X_test, Y_test),
          shuffle=True,
          callbacks=[tensorboard])

【讨论】:

有没有办法更好地构造 tensorboard 的输出? Keras 是否在这方面做了一些优化? @nickpick 我不明白你的意思。但我认为这可能是另一个问题的候选者。 我们开始:***.com/questions/45309153/… 需要注意的是,如果 tensorboard 没有记录 tf.summary.histogram 的任何直方图,则设置 histogram_freq=0 - 否则 histogram_freq 不等于 0!【参考方案3】:

改变

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

tbCallBack = keras.callbacks.TensorBoard(log_dir='Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

并设置你的模型

tbCallback.set_model(model)

在终端中运行

tensorboard  --logdir Graph/

【讨论】:

我收到了AttributeError: 'TensorBoard' object has no attribute 'set_model'【参考方案4】:

如果您正在使用 Keras 库并想使用 tensorboard 来打印您的准确度图和其他变量,那么下面是要遵循的步骤。

步骤1:使用以下命令初始化keras回调库以导入张量板

from keras.callbacks import TensorBoard

第 2 步:在“model.fit()”命令之前在程序中包含以下命令。

tensor_board = TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)

注意:使用“./graph”。它将在您当前的工作目录中生成图形文件夹,避免使用“/graph”。

第 3 步:在“model.fit()”中包含 Tensorboard 回调。示例如下。

model.fit(X_train,y_train, batch_size=batch_size, epochs=nb_epoch, verbose=1, validation_split=0.2,callbacks=[tensor_board])

第 4 步:运行您的代码并检查您的图形文件夹是否在您的工作目录中。如果上述代码正常工作,您将拥有“Graph” 工作目录中的文件夹。

第 5 步:在您的工作目录中打开终端并输入以下命令。

tensorboard --logdir ./Graph

第 6 步:现在打开您的网络浏览器并输入以下地址。

http://localhost:6006

进入后,Tensorbaord 页面将打开,您可以在其中查看不同变量的图表。

【讨论】:

需要注意的是,如果 tensorboard 没有记录 tf.summary.histogram 的任何直方图,则设置 histogram_freq=0 - 否则 histogram_freq 不等于 0!【参考方案5】:

这里有一些代码:

K.set_learning_phase(1)
K.set_image_data_format('channels_last')

tb_callback = keras.callbacks.TensorBoard(
    log_dir=log_path,
    histogram_freq=2,
    write_graph=True
)
tb_callback.set_model(model)
callbacks = []
callbacks.append(tb_callback)

# Train net:
history = model.fit(
    [x_train],
    [y_train, y_train_c],
    batch_size=int(hype_space['batch_size']),
    epochs=EPOCHS,
    shuffle=True,
    verbose=1,
    callbacks=callbacks,
    validation_data=([x_test], [y_test, y_test_coarse])
).history

# Test net:
K.set_learning_phase(0)
score = model.evaluate([x_test], [y_test, y_test_coarse], verbose=0)

基本上,histogram_freq=2 是调用此回调时要调整的最重要参数:它设置调用回调的 epoch 间隔,目的是在磁盘上生成更少的文件。

因此,这是一个示例,显示了在 TensorBoard 中的“直方图”选项卡下,在整个训练过程中最后一次卷积的值的演变(我发现“分布”选项卡包含非常相似的图表,但在边):

如果您想在上下文中查看完整示例,可以参考这个开源项目:https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100

【讨论】:

我对此投了反对票,因为其中很大一部分实际上是问题,而不是问题的答案。不要在答案中提出新问题,无论是答案的一部分还是全部目的。 我编辑了问题以删除您提到的内容。实际上,在我回答时,从文档中很难正确使用此回调。 要回答“我如何使用 Keras 的 TensorBoard 回调?”,所有其他答案都是不完整的,并且只响应问题的小上下文 - 例如,没有人解决嵌入问题。至少,我已经记录了我的回答中可能出现的错误或要避免的事情。我想我提出了重要的问题,甚至没有人认为可以考虑。我还在等待一个完整的答案。这个回调也没有记录,就像癌症一样。【参考方案6】:

如果您使用 google-colab,图表的简单可视化将是:

import tensorboardcolab as tb

tbc = tb.TensorBoardColab()
tensorboard = tb.TensorBoardColabCallback(tbc)


history = model.fit(x_train,# Features
                    y_train, # Target vector
                    batch_size=batch_size, # Number of observations per batch
                    epochs=epochs, # Number of epochs
                    callbacks=[early_stopping, tensorboard], # Early stopping
                    verbose=1, # Print description after each epoch
                    validation_split=0.2, #used for validation set every each epoch
                    validation_data=(x_test, y_test)) # Test data-set to evaluate the model in the end of training

【讨论】:

【参考方案7】:

创建 Tensorboard 回调:

from keras.callbacks import TensorBoard
from datetime import datetime
logDir = "./Graph/" + datetime.now().strftime("%Y%m%d-%H%M%S") + "/"
tb = TensorBoard(log_dir=logDir, histogram_freq=2, write_graph=True, write_images=True, write_grads=True)

将 Tensorboard 回调传递给 fit 调用:

history = model.fit(X_train, y_train, epochs=200, callbacks=[tb])

在运行模型时,如果你得到一个Keras错误

“您必须为占位符张量提供一个值”

尝试在创建模型之前重置 Keras 会话:

import keras.backend as K
K.clear_session()

【讨论】:

它解决了这个问题,You must feed a value for placeholder tensor。知道为什么吗?【参考方案8】:

你写的是log_dir='/Graph',你的意思是./Graph吗?您此时已将其发送至/home/user/Graph

【讨论】:

为什么/Graph会在用户的主目录中创建一个文件夹而不是直接使用/Graph【参考方案9】:

你应该看看 Losswise (https://losswise.com),它有一个 Keras 插件,比 Tensorboard 更容易使用,并且有一些不错的额外功能。使用 Losswise,您只需使用 from losswise.libs import LosswiseKerasCallback,然后使用 callback = LosswiseKerasCallback(tag='my fancy convnet 1'),一切顺利(请参阅 https://docs.losswise.com/#keras-plugin)。

【讨论】:

免责声明:OP 是 Losswise 的创始人,这是一种付费产品(尽管免费层级相当丰厚) @MichaelMior 是正确的,虽然它还不是付费产品,而且可能永远不会是(除了未来可能的 prem 许可证)【参考方案10】:

事情很少。

首先,不是/Graph,而是./Graph

其次,当你使用 TensorBoard 回调时,总是传递验证数据,因为没有它,它不会启动。

第三,如果你想使用除标量摘要之外的任何东西,那么你应该只使用fit 方法,因为fit_generator 将不起作用。或者您可以重写回调以使用fit_generator

要添加回调,只需将其添加到model.fit(..., callbacks=your_list_of_callbacks)

【讨论】:

第三点相关链接:github.com/keras-team/keras/issues/3358#issuecomment-312531958

以上是关于如何使用 Keras 的 Tensorboard 回调?的主要内容,如果未能解决你的问题,请参考以下文章

使用 tf.keras.Model.fit 进行训练时如何将自定义摘要添加到 tensorboard

使用 Keras,当我将 Tensorboard 回调添加到我的神经网络时,准确性会降低。我该如何解决?

TensorFlow 2.0 Keras:如何为 TensorBoard 编写图像摘要

使用 keras 图启动 Tensorboard(用于可视化准确性、损失和预测结果)

TensorFlow 2.0 Keras:如何为TensorBoard编写图像摘要

使用 keras 在 tensorboard 中显示分类图像