如何在Tensorflow 2.0中使用嵌入式投影仪

时间:2019-07-12 21:30:31

标签: python-3.x tensorflow tensorboard tensorflow2.0

在Tensorflow中删除了tf.contrib模块,并且tf.train.Saver()也消失了,我无法找到一种方法来存储一组嵌入及其相应的缩略图,以便Tensorboard Projector可以读取它们。

Tensorflow 2.0的Tensorboard documentation解释了如何创建图和摘要,以及通常如何使用摘要工具,但没有关于投影仪工具的内容。有没有人找到如何存储数据集以进行可视化?

如果可能的话,我将不胜感激(最小)代码示例。

2 个答案:

答案 0 :(得分:6)

由于缺少文档,似乎很多人本人在TF2.x中使用Tensorboard Projector时遇到了问题。我设法使它起作用,在此comment on GitHub中,我提供了一些最小的代码示例。我知道问题也与使用缩略图(sprites)有关,但是我并不需要它,并且想使示例保持简单,因此留给读者练习是让sprites工作。

# Some initial code which is the same for all the variants
import os
import numpy as np
import tensorflow as tf
from tensorboard.plugins import projector

def register_embedding(embedding_tensor_name, meta_data_fname, log_dir):
    config = projector.ProjectorConfig()
    embedding = config.embeddings.add()
    embedding.tensor_name = embedding_tensor_name
    embedding.metadata_path = meta_data_fname
    projector.visualize_embeddings(log_dir, config)

def get_random_data(shape=(100,100)):
    x = np.random.rand(*shape)
    y = np.random.randint(low=0, high=2, size=shape[0])
    return x, y

def save_labels_tsv(labels, filepath, log_dir):
    with open(os.path.join(log_dir, filepath), 'w') as f:
        for label in labels:
            f.write('{}\n'.format(label))

LOG_DIR = 'tmp'  # Tensorboard log dir
META_DATA_FNAME = 'meta.tsv'  # Labels will be stored here
EMBEDDINGS_TENSOR_NAME = 'embeddings'
EMBEDDINGS_FPATH = os.path.join(LOG_DIR, EMBEDDINGS_TENSOR_NAME + '.ckpt')
STEP = 0

x, y = get_random_data((100,100))
register_embedding(EMBEDDINGS_TENSOR_NAME, META_DATA_FNAME, LOG_DIR)
save_labels_tsv(y, META_DATA_FNAME, LOG_DIR)

变体A(在TF2.0和TF2.1中有效,但不在急切模式下)

# Size of files created on disk: 163kB
tf.compat.v1.disable_eager_execution()
tensor_embeddings = tf.Variable(x, name=EMBEDDINGS_TENSOR_NAME)
sess = tf.compat.v1.InteractiveSession()
sess.run(tf.compat.v1.global_variables_initializer())
saver = tf.compat.v1.train.Saver()
saver.save(sess, EMBEDDINGS_FPATH, STEP)
sess.close()

变体B(在Eager模式下可在TF2.0和TF2.1中使用)

# Size of files created on disk: 80.5kB
tensor_embeddings = tf.Variable(x, name=EMBEDDINGS_TENSOR_NAME)
saver = tf.compat.v1.train.Saver([tensor_embeddings])  # Must pass list or dict
saver.save(sess=None, global_step=STEP, save_path=EMBEDDINGS_FPATH)

我想感谢其他开发人员从他们的Stack回答,GitHub注释或个人博客文章中获得的一些代码,这有助于我将这些示例放在一起。你才是真正的MVP。

答案 1 :(得分:1)

张量板似乎还剩下一些问题。但是,有一些 为具有tensorflow2的投影仪准备嵌入的解决方法(目前): (错误报告位于:https://github.com/tensorflow/tensorboard/issues/2471

tensorflow1代码看起来像这样:

embeddings = tf.compat.v1.Variable(latent_data, name='embeddings')
CHECKPOINT_FILE = TENSORBOARD_DIR + '/model.ckpt'
# Write summaries for tensorboard
with tf.compat.v1.Session() as sess:
    saver = tf.compat.v1.train.Saver([embeddings])
    sess.run(embeddings.initializer)
    saver.save(sess, CHECKPOINT_FILE)
    config = projector.ProjectorConfig()
    embedding = config.embeddings.add()
    embedding.tensor_name = embeddings.name
    embedding.metadata_path = TENSORBOARD_METADATA_FILE

projector.visualize_embeddings(tf.summary.FileWriter(TENSORBOARD_DIR), config)

在tensorflow2中使用eager模式时,它应该看起来像这样:

embeddings = tf.Variable(latent_data, name='embeddings')
CHECKPOINT_FILE = TENSORBOARD_DIR + '/model.ckpt'
ckpt = tf.train.Checkpoint(embeddings=embeddings)
ckpt.save(CHECKPOINT_FILE)

config = projector.ProjectorConfig()
embedding = config.embeddings.add()
embedding.tensor_name = embeddings.name
embedding.metadata_path = TENSORBOARD_METADATA_FILE

writer = tf.summary.create_file_writer(TENSORBOARD_DIR)
projector.visualize_embeddings(writer, config)

但是,有两个问题:

  • writer创建的tf.summary.create_file_writer不具有get_logdir()所需的功能projector.visualize_embeddings,一种简单的解决方法是修补visualize_embeddings函数以采用logdir作为参数。
  • 检查点格式已更改,当使用load_checkpoint读取检查点时(这似乎是加载文件的张量板方式),变量名会更改。例如embeddings更改为类似embeddings/.ATTRIBUTES/VARIABLE_VALUE的内容(get_variable_to_shape_map()提取的地图中还有其他变量,但它们始终为空)。

第二个问题通过以下快速解决方法解决了(并且logdir现在是visualize_embeddings()的参数)

embeddings = tf.Variable(latent_data, name='embeddings')
CHECKPOINT_FILE = TENSORBOARD_DIR + '/model.ckpt'
ckpt = tf.train.Checkpoint(embeddings=embeddings)
ckpt.save(CHECKPOINT_FILE)

reader = tf.train.load_checkpoint(TENSORBOARD_DIR)
map = reader.get_variable_to_shape_map()
key_to_use = ""
for key in map:
    if "embeddings" in key:
        key_to_use = key

config = projector.ProjectorConfig()
embedding = config.embeddings.add()
embedding.tensor_name = key_to_use
embedding.metadata_path = TENSORBOARD_METADATA_FILE

writer = tf.summary.create_file_writer(TENSORBOARD_DIR)
projector.visualize_embeddings(writer, config,TENSORBOARD_DIR)

我没有找到任何有关如何使用tensorflow2直接为tensorboard编写嵌入的示例,因此我不确定这是否是正确的方法,但是如果是的话,则需要解决这两个问题,并且至少目前没有解决方法。