【问题标题】:How to use the Embedding Projector in Tensorflow 2.0如何在 Tensorflow 2.0 中使用嵌入投影仪
【发布时间】:2019-11-22 15:36:51
【问题描述】:

随着 tf.contrib 模块从 Tensorflow 中消失,并且 tf.train.Saver() 也消失了,我找不到存储一组嵌入及其相应缩略图的方法,以便 Tensorboard 投影仪可以读取它们。

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

如果可能的话,我希望能提供一个(最少的)代码示例。

【问题讨论】:

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


    【解决方案1】:

    tensorboard 中似乎还有一些问题。然而,也有一些 使用 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)
    

    但是,有两个问题:

    • 使用tf.summary.create_file_writer创建的writer不具备projector.visualize_embeddings所需的函数get_logdir(),一个简单的解决方法是修补visualize_embeddings函数以将logdir作为参数。
    • 检查点格式变了,用load_checkpoint读取检查点时(好像是tensorboard加载文件的方式),变量名变了。例如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 编写嵌入的示例,所以我不确定这是否正确,但如果是,则需要解决这两个问题,并且至少目前有一种解决方法。

    【讨论】:

    • @pteufli 我会接受这个答案,因为目前还没有有效的方法来解决这个问题。第一个问题确实可以通过将 get_logdir() 覆盖到 FileWritter 类中并添加自定义构造函数来解决。至于第二个,它要么是您所做的,要么是将嵌入创建为 TSV 文件,然后将 embedding.tensor_path 设置为文件路径,而不是使用 embedding.tensor_name。也就是说,protobuf(JS 库)似乎存在问题,导致嵌入投影仪无法在 TF2 的 TensorBoards 版本上正常工作:(
    • @gaspercat,我猜这个问题将由 tensorboard 团队解决。我不知道第二种方式:将嵌入存储为 TSV 文件,您是否有详细说明其工作原理的链接,感谢您提供信息
    • 我在尝试解决此问题时通过深入研究源代码发现了这一点,因此我无法向您推荐代码示例。只需创建 TSV(类似于为元数据创建 TSV,但没有标题行),然后设置 embedding.tensor_path = filepath。将其他属性(tensor_name 和 tensor_shape)留空,它应该可以工作。
    • 这不起作用AttributeError: 'ResourceSummaryWriter' object has no attribute 'get_logdir'
    • @gaspercat 仅在不设置tensor_name时有效!!!谢谢 :) 我尝试使用 embedding.sprite.image_path 它确实加载但没有加载精灵。你有解决方法吗?
    【解决方案2】:

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

    # 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)
    

    VARIANT A(适用于 TF2.0 和 TF2.1,但不适用于 Eager 模式)

    # 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()
    

    VARIANT 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 cmets 或个人博客文章中提供的一些代码,它们帮助我将这些示例放在一起。你才是真正的 MVP。

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2018-01-26
      相关资源
      最近更新 更多