如何在 Tensorflow 2.0 中使用 Embedding Projector
How to use the Embedding Projector in Tensorflow 2.0
随着 tf.contrib 模块从 Tensorflow 消失,tf.train.Saver() 也消失了,我找不到存储一组嵌入及其相应缩略图的方法,因此 Tensorboard Projector可以阅读它们。
Tensorflow 2.0 的 Tensorboard documentation 解释了如何创建绘图和摘要,以及如何使用一般的摘要工具,但没有介绍投影仪工具。有没有人找到如何存储数据集以进行可视化?
如果可能,我将不胜感激(最小)代码示例。
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 中使用急切模式时,这应该(?)看起来像这样:
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 作为参数。
- checkpoint格式变了,用load_checkpoint读取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 编写嵌入的示例,所以我不确定这是否是正确的方法,但如果是,那么这两个问题就需要解决,至少现在有一个解决方法。
由于缺乏文档,似乎很多人和我一样在 TF2.x 中使用 Tensorboard Projector 时遇到问题。我已经设法让它发挥作用,在此 comment on GitHub 中,我提供了一些最简单的代码示例。我知道问题也是关于使用缩略图(精灵),但我不需要它并且想让示例保持简单,所以让精灵工作作为练习留给 reader.
# 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 评论或个人博客文章中提供的一些代码,它们帮助我将这些示例组合在一起。你才是真正的MVP。
随着 tf.contrib 模块从 Tensorflow 消失,tf.train.Saver() 也消失了,我找不到存储一组嵌入及其相应缩略图的方法,因此 Tensorboard Projector可以阅读它们。
Tensorflow 2.0 的 Tensorboard documentation 解释了如何创建绘图和摘要,以及如何使用一般的摘要工具,但没有介绍投影仪工具。有没有人找到如何存储数据集以进行可视化?
如果可能,我将不胜感激(最小)代码示例。
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 中使用急切模式时,这应该(?)看起来像这样:
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 作为参数。 - checkpoint格式变了,用load_checkpoint读取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 编写嵌入的示例,所以我不确定这是否是正确的方法,但如果是,那么这两个问题就需要解决,至少现在有一个解决方法。
由于缺乏文档,似乎很多人和我一样在 TF2.x 中使用 Tensorboard Projector 时遇到问题。我已经设法让它发挥作用,在此 comment on GitHub 中,我提供了一些最简单的代码示例。我知道问题也是关于使用缩略图(精灵),但我不需要它并且想让示例保持简单,所以让精灵工作作为练习留给 reader.
# 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 评论或个人博客文章中提供的一些代码,它们帮助我将这些示例组合在一起。你才是真正的MVP。