TL;DR 指定metadata_path时,使用相对路径会造成tensorboard找不到文件。解决办法:使用绝对路径

TensorBoard的embedding载入时卡着不动

TensorBoard的Embedding功能,给图片和文字的三维直观展示提供了可能,这些东西通常情况下需要一个人类可读的meta信息:这个信息在TensorBoard中叫做metadata。

你可以从https://www.tensorflow.org/versions/r1.3/programmers_guide/embedding获取更多官方文档

原因分析

如下是官方代码示例

from tensorflow.contrib.tensorboard.plugins import projector

# Create randomly initialized embedding weights which will be trained.
vocabulary_size = 10000
embedding_size = 200
embedding_var = tf.get_variable('word_embedding', [vocabulary_size, embedding_size])

# Format: tensorflow/tensorboard/plugins/projector/projector_config.proto
config = projector.ProjectorConfig()

# You can add multiple embeddings. Here we add only one.
embedding = config.embeddings.add()
embedding.tensor_name = embedding_var.name
# Link this tensor to its metadata file (e.g. labels).
embedding.metadata_path = os.path.join(LOG_DIR, 'metadata.tsv')

# Use the same LOG_DIR where you stored your checkpoint.
summary_writer = tf.summary.FileWriter(LOG_DIR)

# The next line writes a projector_config.pbtxt in the LOG_DIR. TensorBoard will
# read this file during startup.
projector.visualize_embeddings(summary_writer, config)

上面的代码中,主要是通过projector对象将tensor变量embedding_var和metadata_path关联了起来,随后这个关联信息被summary_writer写入了配置文件。

很多人的代码实现,在运行时没有任何问题,但是在使用tensorboard中进行embedding可视化的时候,却一直卡在加载metadata的过程中。具体原因是在指定embedding.metadata_path时,使用了相对路径来指定文件位置,但是这个文件位置是相对log目录的,tensorboard在启动的时候绝大多数情况下不是在log所在的目录中启动的,这时从tensorboard的角度来找这个相对文件,就无法找到,因此出现了载入卡住的情况。

PS stackoverflow 也有人注意到了这个issue,并给出了相同的答案