如何在不打开新类别的情况下将图像数据写入张量板



我写了一个 Keras/Tensorflow 回调,将混淆矩阵写入 Tensorboard 中的 Images 选项卡。这在 TF 2.1 中工作正常。不幸的是,我不得不将其转换为TF 1.14,因为其他软件包依赖于此版本。

一切正常(或多或少(,除了张量板报告。

问题所在

正如您在下面的屏幕截图中看到的,有许多类别(? 标签? 频道?我不确定术语(而不是只有一个。

屏幕截图:图像的多个类别

似乎与这个问题相关,像"val_loss"这样的训练标量只绘制第一个数据点,之后什么都不绘制。查看第二个屏幕截图

屏幕截图:显示一个数据点的标量

此外,Tensorboard 正在打印以下错误:
File <path/to/event-file> updated even though the current file is <path/to/new-event-file>

所以我假设我的 TF 文件编写器在某种程度上不同意在哪里写。

关于混淆矩阵回调: 编写函数如下所示:

def _figure_to_summary(self, fig, step):
# attach a new canvas if not exists
if fig.canvas is None:
matplotlib.backends.backend_agg.FigureCanvasAgg(fig)
fig.canvas.draw()
w, h = fig.canvas.get_width_height()
img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
img = img.reshape((1, h, w, 3))
with K.get_session().as_default():
tensor = tf.constant(img)
image = tf.summary.image(self.title, tensor).eval()
self._summary_writer.add_summary(image, global_step=step)
self._summary_writer.flush()

图是混淆矩阵的垫图图,步长为整数,这应该使张量板能够在图像上添加小滑块以显示矩阵的历史。

模型按如下方式训练:

run_id = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
tb_path = os.path.join("tensor/", run_id)
tb_reporter = TensorBoard(tb_path)
summ_wr = FileWriter(tb_path)
conf_matr = ConfusionMatrix(va, TARGET_CLASSES.keys(), summ_wr, normalize=True)
cb_list = [tb_reporter, conf_matr]
model.fit(tr, epochs=500, validation_data=va, callbacks=cb_list)

其中summ_wr成为回调的self._summary_writer

我尝试了什么

我只尝试更改摘要的编写方式。尝试tf.merge_all((,以各种组合打开,关闭和重新打开FileWriter,但没有任何变化。当我停用自定义回调时,张量板回调按预期工作。

我的问题

如何每次都将图像数据写入同一类别?

图像会得到滚动条吗?

如何解决 Keras 张量板回调不显示其数据的问题?

我假设所有问题都是相关的,解决一个问题会导致解决所有问题,但我完全不知道如何做到这一点。

我感谢任何建议:)

编辑: 我刚刚发现了这个问题: 张量板图像摘要 这似乎解决了问题,不幸的是答案没有很多上下文,所以我不知道如何将解决方案集成到代码中。

我找到的解决方案由两部分组成。

首先:我从keras的Tensorboard Callback中偷走了FileWriterTensorboard.writer包含调用set_model后的FileWriter

第二:Summary必须通过构造函数创建,并传递tag-关键字。这会强制图像进入同一组,并且编写器不会相互干扰。

我在这里找到了解决方案的第二部分:TensorBoard:如何编写图像以获得步骤滑块?

最新更新